Перейти к содержанию

Отладка и устранение неполадок

Инструментарий отладки контрактов в 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 действия. Для действия без аргументов:

cleos push action ACCOUNT get '[]' -p ACCOUNT@active

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.


См. также