Логирование данных из смарт-контрактов с помощью событий
В Solidity события — это отправляемые сигналы, которые могут вызывать смарт-контракты. Децентрализованные приложения (dapp) или любые другие приложения, подключенные к API JSON-RPC Эфириума, могут прослушивать эти события и действовать соответствующим образом. Событие также может быть проиндексировано, чтобы историю событий можно было искать в дальнейшем.
События
Самым распространенным событием в блокчейне Эфириума на момент написания этой статьи является событие Transfer, которое генерируется токенами ERC-20, когда кто-то совершает перевод токенов.
event Transfer(address indexed from, address indexed to, uint256 value);
Подпись события объявляется внутри кода контракта и может быть вызвана с помощью ключевого слова emit. Например, событие transfer записывает в лог, кто отправил перевод (from), кому (to) и сколько токенов было переведено (value).
Вернемся к нашему смарт-контракту Counter и решим записывать в лог каждое изменение значения. Поскольку этот контракт не предназначен для того, чтобы его развернуть, а служит базой для создания другого контракта путем его расширения, он называется абстрактным контрактом. В случае с нашим примером счетчика это будет выглядеть так:
pragma solidity 0.5.17;
contract Counter {
event ValueChanged(uint oldValue, uint256 newValue);
// Приватная переменная типа unsigned int для хранения количества подсчетов
uint256 private count = 0;
// Функция, увеличивающая наш счетчик
function increment() public {
count += 1;
emit ValueChanged(count - 1, count);
}
// Геттер для получения значения счетчика
function getCount() public view returns (uint256) {
return count;
}
}
Обратите внимание, что:
-
Строка 5: мы объявляем наше событие и то, что оно содержит — старое и новое значения.
-
Строка 13: когда мы увеличиваем нашу переменную count, мы генерируем событие.
Если теперь мы развернем контракт и вызовем функцию increment, то увидим, что Remix автоматически отобразит его, если вы нажмете на новую транзакцию внутри массива с именем logs.
Логи очень полезны для отладки ваших смарт-контрактов, но они также важны, если вы создаете приложения, используемые разными людьми, поскольку упрощают аналитику для отслеживания и понимания того, как используется ваш смарт-контракт. Логи, сгенерированные транзакциями, отображаются в популярных обозревателях блоков, и вы также можете, например, использовать их для создания офчейн-скриптов, чтобы прослушивать определенные события и выполнять действия при их возникновении.
