Перейти к основному контенту

Логирование данных из смарт-контрактов с помощью событий

смарт-контракты
Remix
Solidity
события
Средний уровень
jdourlens
3 апреля 2020 г.
2 минут на чтение

В Solidity события — это отправляемые сигналы, которые могут вызывать смарт-контракты. Децентрализованные приложения (dapp) или любые другие приложения, подключенные к API JSON-RPC Эфириума, могут прослушивать эти события и действовать соответствующим образом. Событие также может быть проиндексировано, чтобы историю событий можно было искать в дальнейшем.

События

Самым распространенным событием в блокчейне Эфириума на момент написания этой статьи является событие Transfer, которое генерируется токенами ERC-20, когда кто-то совершает перевод токенов.

event Transfer(address indexed from, address indexed to, uint256 value);

Подпись события объявляется внутри кода контракта и может быть вызвана с помощью ключевого слова emit. Например, событие transfer записывает в лог, кто отправил перевод (from), кому (to) и сколько токенов было переведено (value).

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

Обратите внимание, что:

  • Строка 5: мы объявляем наше событие и то, что оно содержит — старое и новое значения.

  • Строка 13: когда мы увеличиваем нашу переменную count, мы генерируем событие.

Если теперь мы развернем контракт и вызовем функцию increment, то увидим, что Remix автоматически отобразит его, если вы нажмете на новую транзакцию внутри массива с именем logs.

Remix screenshot

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