February 19, 2022

Solidity events

Друзья, привет! Раз уж речь о функциях заходит дальше, давайте не останавливаться. Сегодня поговорим о механизме событий (events) в языке Solidity.

Событие - это специальный интерфейс, предоставляемый виртуальной машиной Ethereum (EVM). Когда событие отправляется, оно инициирует сохранение входных параметров в специальном логе транзакций в EVM. [не журнал транзакций]. Эти логи ассоциированы с адресом контракта и записаны в блокчейне.

Но обратите внимание: лог событий не доступен в рамках контракта, даже в контракте, который создал его.

В Solidity события определяются с помощью ключевого слова event. Интерфейс совпадает с объявлением функции, кроме того, события также могут быть наследованы.

event EventName(address bidder, uint amount);

Определение event включает в себя имя события и параметры, которые вы хотите сохранить при инициировании события. Вы также можете добавить атрибут indexed к любому параметру в событии (но максимум к 3-м).

Для инициирования события ("запуска") используется ключевое слово emit:

emit EventName(msg.sender, msg.value);

Этот действие можно осуществить в любой функции, например:

function testEvent() public {
    // вызвать событие
     emit EventName(msg.sender, msg.value); 
}

События являются интерфейсом взаимодействия с функциональностью логирования в EVM.

Использование event может служить альтернативным дешевым источником хранения данных (со своими особенностями).

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

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

Источники:

  1. Первый
  2. Второй
  3. Третий
  4. Четвертый