Что такое События Солидности

#events #blockchain #solidity

Вопрос:

Я довольно долго боролся с поиском объяснения того, какие события происходят в Солидности (или в контексте блокчейна). Насколько я понимаю, они представляют собой способ хранения (или регистрации) информации о конкретном контракте, которая затем может обновляться в течение всего срока действия этого контракта. Но чем это отличается от простой старой переменной? Почему я не могу просто создать переменную, которая затем просто обновляется новой информацией?

Ответ №1:

Из документов:

События солидности дают абстракцию поверх функциональности ведения журнала EVM. Приложения могут подписываться и прослушивать эти события через интерфейс RPC клиента Ethereum.

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

То же самое касается запросов к журналам исторических событий (легко с помощью API JSON-RPC и его оболочек, таких как Web3 или Ethers.js), по сравнению с историческими изменениями переменной (сложно, нужно было бы запросить узел для каждого блока и заранее искать изменения).

Пример: Стандарт токенов ERC-20 определяет Transfer() событие. Контракт на токены выдает это событие каждый раз, когда происходит передача (его токенов). Это позволяет исследователю блокчейна (или любому другому стороннему приложению) реагировать на это событие-например, обновлять свою собственную базу данных владельцев токенов. Без этого события у них не было бы возможности (или, по крайней мере, очень сложного способа) узнать о передаче.

Комментарии:

1. Это очень полезно, спасибо, что объяснили это. Очень ценю это.

Ответ №2:

  • События в Solidity можно использовать для регистрации определенных событий в журналах EVM. Они весьма полезны, когда требуется, чтобы внешние интерфейсы получали уведомления о любых изменениях или событиях в контракте. Эти журналы хранятся в блокчейне transaction logs . Доступ к журналам из контрактов невозможен, но они используются в качестве механизма уведомления об изменении состояния или наступлении события в контракте.
  • События-это часть данных, выполняемых в блокчейне и хранящихся в блокчейне, но недоступных никаким смарт-контрактам. это что-то вроде console.log javascript или print python.
  • События гораздо более эффективны с точки зрения использования газа, чем использование переменной хранилища
  • События полезны для тестирования контракта. Если вы взаимодействуете с оракулами, иногда вам нужно посмотреть, выполнен ли вызов функции службой oracle или нет. Чтобы увидеть, выполнен ли вызов функции, вы выдаете результат функции или одно из свойств результата.
  • События полезны, если вы хотите вести историю/журнал всех изменений, происходящих в этом сопоставлении.
  • Во время выполнения транзакции a transaction substate создается и обрабатывается после завершения выполнения. Подстанция транзакции-это кортеж, состоящий из 4 элементов. Один из пунктов- Log Series это индексированная серия контрольных точек, которая позволяет отслеживать и уведомлять о вызовах контрактов для объектов, внешних по отношению к среде Ethereum, таких как интерфейсы приложений. Он работает как триггерный механизм, который выполняется каждый раз, когда вызывается определенная функция или происходит определенное событие. Журналы создаются в ответ на события, происходящие в смарт-контракте, и в этой области хранятся выходные данные событий, исходящих из смарт-контрактов.
  • Депозитные контракты были созданы в цепочке Ethereum 1.0. Этот вид смарт-контракта используется для внесения ETH в цепочку маяков. Событие происходит каждый раз при внесении депозита.
  • Есть два события, которые должны присутствовать в маркере, совместимом с ERC-20:
    • Передача : Это событие должно запускаться при передаче токенов, включая любые передачи с нулевым значением. Событие определяется следующим образом:
     event Transfer(address indexed _from, address indexed _to, uint256 _value)
     
    • Утверждение : Это событие должно запускаться при успешном вызове функции утверждения.
     event Approval(address indexed _owner, address indexed _spender, uint256 _value)