Как я могу отлаживать смарт-контракт?

При разработке моего смарт-контракта, как я могу его отладить? Существуют ли какие-либо инструменты отладки, тестирования или симуляторы, которые я могу использовать для проверки своего кода?

Hardhat имеет трассировку стека и console.log

Ответы (6)

  1. В Remix IDE есть отличный встроенный поблочный симулятор и отладчик.
  2. Ganache позволяет быстро тестировать контракты без необходимости запуска узла.
  3. Как только контракт активен, обозреватель блоков etherscan.io можно использовать для просмотра внутреннего состояния и журналов выполнения EVM.
Mix IDE больше не поддерживается...
@CodingYourLife обновил ответ последними ресурсами

Все это хорошие инструменты, но я обнаружил, что регистрация событий — гораздо более простой метод отладки, плюс, если вы делаете что-то с деньгами, вы хотите вести учет того, что произошло.

В Solidity вы регистрируетесь с помощью Events . Затем вы можете прослушивать все события вашего контракта с обратным вызовом web3.js «allEvents».

Вот как я отлаживаю свои (на данный момент) 780 строк Solidity.

Не могли бы вы подробнее рассказать о том, как вы отлаживаете события? Используете консоль javascript, чтобы вручную подключаться к контракту и следить за событиями, или вы каким-то образом используете скрипт для автоматизации процесса? Это звучит как хорошая техника, и я пытаюсь применить ее по результатам событий console.log в модульных тестах трюфелей, но пока не удалось заставить ее работать!
Я использую сценарии nodejs, которые отлично работают с web3.js. Вот взломанная версия эфирного пудинга, которая включает логирование (но пока только из одного контракта), смотрите юнит-тесты, как это работает. github.com/barkthins/эфирный пудинг
Но когда выполнение бросает, никакие события не регистрируются в Solidity.
хорошая точка зрения. Я стараюсь избегать исключений, если это вообще возможно, потому что, среди прочего, они съедают весь ваш бензин. Мне бы понравилось, если бы кто-нибудь добавил ответ о том, как постфактум отлаживать выбрасываемое исключение. AFAICT вы должны изучить журналы узла. Я надеюсь, что кто-то работает над функцией «мягкого» исключения в виртуальной машине, «жесткое исключение» в основном эквивалентно BSOD …
@PaulS И если никакие события не записываются даже в простейшем случае, например, при сбросе переменных без предварительного условия, как я могу узнать, что не так? (и в случае, если исключение не зарегистрировано)
@PaulS Когда вы сталкиваетесь с ошибкой в ​​​​некоторых функциях со 100 строками кода, никаких событий не произойдет.

для отладки контракта вы можете использовать браузер Solidity

отладчик предоставляет вам возможность шаг за шагом отлаживать любую транзакцию (создание или вызов) и визуализировать объем памяти/хранилища. это поможет вам отслеживать стоимость газа по коду операции и оставшемуся газу после каждого шага.

Для отладки транзакций есть два способа сделать это:

1 — с использованием номера блока и индекса транзакции.введите описание изображения здесь

2-использование хэша транзакции.

введите описание изображения здесь

При успешной загрузке транзакции появится поле хеш, от и до. Затем загружается vm trace.введите описание изображения здесь

Сам отладчик содержит несколько элементов управления, позволяющих пошагово пройтись по трассе и увидеть текущее состояние выбранного шага.

Ползунок и пошаговое действие:

Ползунок позволяет быстро переходить из одного состояния в другое. Пошаговые действия:

Шаг назад Шаг назад Шаг назад Шаг вперед Шаг вперед Перейти к следующему вызову (при этом будет выбрано следующее состояние, которое относится к изменению контекста — CALL, CALLCODE, DELEGATECALL, CREATE) Просмотр состояния:

Верхняя правая панель содержит основную информацию о текущем шаге:

VMTraceStep : индекс в трассировке текущего шага. Шаг Добавить память Газ: газ, использованный на этом шаге Оставшийся газ: оставшийся газ Загруженный адрес: текущий загруженный код, относится к исполняемому коду. Остальные 6 панелей описывают текущее выбранное состояние:

Список инструкций : список всех инструкций, определяющих текущий исполняемый код. Память в стеке Изменения в памяти Данные вызовов$ Стек вызовов

точки останова в remix Точки останова можно добавлять и удалять, щелкнув левое поле первой строки кода. Вы можете добавить столько точек останова, сколько хотите.введите описание изображения здесь

Когда я пытаюсь отладить транзакцию, копирование хэша транзакции и нажатие start debuggingкнопки ничего не делает, кроме записи 0xc09ff6fb32dd6ef66f5691367c11c762c8f730aadeab065d57f8137cd3746bfc is not a contract invokation or contract creationв журнал.

Вы можете использовать truffle debugкоманду: http://truffleframework.com/blog/announcing-full-portable-solidity-debugger

Он поддерживает:

  • Пошаговое выполнение кода (сверху, внутрь, наружу, далее, инструкция и т. д.)
  • Текущее местоположение кода, включая адрес действующего контракта
  • Контрольные точки
  • Смотреть выражения
  • Проверка переменных (стек, память и хранилище)
  • Оценка пользовательского выражения с использованием переменных Solidity

Для отладки тестов Truffle Javascript в коде Visual Studio мне помог этот ответ: https://ethereum.stackexchange.com/a/41096/3708

последняя версия truffle имеет встроенный отладчик, который можно использовать для отладки состояния неудачной транзакции.

$ truffle debug <transaction-id>

где <transaction-id>id транзакции с ошибкой,

после запуска отладчика следуйте инструкциям, чтобы выполнить пошаговое руководство и распечатать состояние переменной и т. д.

узнайте больше здесь: https://www.trufflesuite.com/blog/announcing-full-portable-solidity-debugger