什么是 Solidity 事件

What are Solidity Events

我一直在努力寻找对 Solidity(或区块链环境)中的事件的解释。据我所知,它们是一种存储(或记录)特定合同信息的方式,然后可以在该合同的整个生命周期内更新这些信息。但这与普通的 ol' 变量有何不同?为什么我不能只创建一个变量,然后用新信息简单地更新它?

来自docs

Solidity events give an abstraction on top of the EVM’s logging functionality. Applications can subscribe and listen to these events through the RPC interface of an Ethereum client.

链下应用程序订阅新事件日志比订阅变量更改更容易。特别是当变量不是 public.

查询历史事件日志(通过 JSON-RPC API 及其包装器,如 Web3 或 Ethers.js 很容易),与变量的历史变化(复杂,需要为每个块查询一个节点并主动查找更改)。

示例:ERC-20 令牌标准定义了 Transfer() 事件。每次发生(其代币)转移时,代币合约都会发出此事件。这允许区块链浏览器(或任何其他链下应用程序)对此事件做出反应——例如更新他们自己的代币持有者数据库。如果没有这个事件,他们将无法(或至少是一种非常复杂的方式)了解转移。

  • Solidity 中的事件可用于在 EVM 日志中记录某些事件。当需要通知外部接口合约中的任何更改或事件时,这些非常有用。这些日志存储在 transaction logs 中的区块链上。日志无法从合约中访问,但用作通知状态更改或合约中事件发生的机制。

  • 事件是在区块链上执行并存储在区块链中但不能被任何智能合约访问的数据片段。在 javascript 中有点 console.log 或在 python 中有点 print

  • 事件比使用存储变量更节省 gas

  • 事件对于测试合约很有用。如果你和oracles打交道,有时候你会想看看oracle服务调用的函数有没有完成。要查看函数调用是否完成,您发出函数的结果或结果的属性之一。

  • 如果您想维护映射中发生的每个更改的 history/log,事件就很有用。

  • 在事务执行过程中,会创建一个transaction substate,并在执行完成后进行处理。事务子状态是一个包含 4 个项目的元组。其中一项是 Log Series,它是一系列索引检查点,允许监控和通知以太坊环境外部实体的合约调用,例如应用程序前端。它的工作方式类似于每次调用特定函数或发生特定事件时执行的触发机制。日志是为响应智能合约中发生的事件而创建的,这是存储智能合约发出的事件输出的区域。

  • 在以太坊 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)