Отладка и устранение неполадок¶
Инструментарий отладки контрактов в EOSIO-совместимых сетях ограничен: отсутствует пошаговая отладка WASM на продакшен-узле. Печать в консоль контрактов, анализ trace транзакций и воспроизведение сценариев на изолированной сети составляют рабочий минимум.
Отладка через печать¶
Вывод из WASM в журнал узла доступен при включённой консоли контрактов у nodeos: флаг --contracts-console или contracts-console = true в config.ini, либо эквивалентная настройка в используемом дистрибутиве узла.
Отладку целесообразно выполнять на контролируемой тестовой сети с детерминированным состоянием и токеномикой; публичный testnet подключают на этапе интеграционной проверки.
API печати¶
C API (фрагменты): prints, prints_l, printi, printui, printi128, printui128, printsf, printdf, printqf, printn, printhex.
C++ API перегружает print() для строк, целых, name, типов с методом print().
Печать в цикле и символ новой строки¶
Если в каждой итерации печатается \n, в логе может отобразиться только первая строка. Замените разделитель, например на |:
for (auto& item : testtab) {
eosio::print_f("{%, %, %} |", item.test_primary, item.secondary, item.datum);
}
Порядок вывода и inline-действия¶
Inline-действия не выполняются синхронно в том же порядке, в каком вы читаете исходник. Печать из inline может появиться после строк, идущих в коде «после send», или в другом месте trace — это нормально для модели выполнения.
Типичные ошибки¶
unsatisfied_authorization¶
Убедитесь, что для аккаунта контракта опубликованы и WASM, и ABI, и транзакция подписана нужной permission.
Pack data exception / неожиданные поля¶
Неверный JSON действия. Для действия без аргументов:
Unknown action ... in contract¶
Проверьте атрибут [[eosio::action]] у объявления/определения.
No abi file found / No wasm file found¶
Каталог в cleos set contract должен содержать оба файла; имена обычно совпадают с именем каталога/аккаунта.
RAM при уведомлениях (notification)¶
Уведомляемое действие не может оплатить RAM, если нет полномочий. Помните про плательщика строки и таблицы; биллинг завязан на тройку contract, scope, table. Подробнее — в документации по ресурсам в разделе Блокчейн этого сайта.
Singleton «не существует» после деплоя¶
Возможно, изменили имя таблицы (первый параметр шаблона) или структуру без миграции. См. Обновление схемы данных.
Перепутанные колонки в таблице¶
Проверьте порядок полей в struct: при совпадении типов данные могут «съехать» визуально; при разных типах — неопределённое поведение.
Ошибка парсинга типа в таблице¶
Скорее всего изменили тип поля без миграции. См. Обновление схемы данных.
cdt-cpp «висит»¶
Убедитесь, что среда сборки имеет ≥ 2 CPU (VM, контейнер).
Нет функции now()¶
Используйте current_time_point().sec_since_epoch() или current_block_time(). В контракте доступно время блока, а не настенные часы: повторные вызовы в рамках одного действия дают одно и то же «текущее» время блока.
eosio_assert_code при одинаковых именах действий в разных контрактах¶
Если один контракт вызывает другой и у обоих есть действия с одинаковым именем, возможны коллизии кодов ошибок. Переименуйте действия так, чтобы имена не пересекались в связке вызовов.
Обратная несовместимость std::map в ABI (CDT 3.0.1+)¶
Поля пары в ABI переименованы с key/value на first/second. Ошибки вида missing pair_uint64_bytes.first лечатся обновлением клиентского кода под новые имена.
Локальный пример отладки (legacy-стиль apply)¶
Устаревший стиль без eosio::contract всё ещё встречается в старых учебниках; для новых проектов предпочтительны атрибуты CDT. Минимальная идея: печатать ветвления и значения перед check.