什么是事件Event

事件是智能合约发出的信号。智能合约的前端UI,例如,DApps、web.js,或者任何与Ethereum JSON-RPC API连接的东西,都可以侦听这些事件。事件可以被索引,以便以后可以搜索事件记录。

事件在区块链中的存储

区块链是一个区块链表,这些块的内容基本上是交易记录。每个交易都有一个附加的交易日志,事件结果存放在交易日志里。合约发出的事件,可以使用合约地址访问。

事件是以太坊虚拟机(EVM)日志基础设施提供的一个便利接口。当被发送事件(调用)时,会触发参数存储到交易的日志中(一种区块链上的特殊数据结构)。

这些日志与合约的地址关联,并记录到区块链中。
来捋这个关系:区块链是打包一系列交易的区块组成的链条,每一个交易“收据”会包含0到多个日志记录,日志代表着智能合约所触发的事件。

关于EVM 上如何处理事件的,可以参考:理解以太坊上的事件日志

在DAPP的应用中,如果监听了某事件,当事件发生时,会进行回调。
不过要注意:日志和事件在合约内是无法被访问的,即使是创建日志的合约。

在Solidity 代码中,使用event 关键字来定义一个事件,如:

event EventName(address bidder, uint amount);

这个用法和定义函数式一样的,并且事件在合约中同样可以被继承。触发一个事件使用emit(说明,之前的版本里并不需要使用emit),如:

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

触发事件可以在任何函数中调用,如:

function testEvent() public {

    // 触发一个事件
     emit EventName(msg.sender, msg.value);
}

https://learnblockchain.cn/2018/05/09/solidity-event/ 

 

说明,之前的版本里并不需要使用emit

  pragma solidity ^0.4.0;
  
  contract ClientReceipt {
      event Deposit(
          address indexed _from,
          bytes32 indexed _id,
          uint _value
      );
  
      function deposit(bytes32 _id) public payable {
          // Any call to this function (even deeply nested) can
          // be detected from the JavaScript API by filtering
          // for `Deposit` to be called.
          Deposit(msg.sender, _id, msg.value);
      }
  }

 

 

https://www.jianshu.com/p/32adde6b5945

https://www.qikegu.com/docs/5004