全部产品

事件和日志

更新时间:2019-08-27 02:02

事件是以太坊虚拟机(Ethereum Virtual Machine,简称“EVM”)提供的一种日志基础设施。事件可以用来做操作记录,存储为日志。也可以用来实现一些交互功能,比如通知 UI,返回函数调用结果等。日志和事件机制是平台与终端用户连接的桥梁。

合约日志示例

您可以通过日志和事件机制获得合约代码的执行情况。下面是一个简单的合约示例:

  1. pragma solidity ^0.4.0;
  2. contract ClientReceipt {
  3. event Deposit(
  4. identity indexed _from,
  5. uint _id,
  6. uint _value
  7. );
  8. function deposit(uint _id) {
  9. Deposit(msg.sender, _id, msg.value);
  10. }
  11. }

在部署该合约之后,可以通过调用 deposit(uint256) 方法获得 log 事件输出。可使用 event 关键字定义一个事件,参数列表中为要记录的日志参数的名称及类型。合约输出结果如下所示:

  1. from: 1122334455667788991011121314151347181920929293949596979812345678
  2. to: 10237462546362184738205736165f7391947195472655869214456471048395
  3. log_data:00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000032
  4. topics:[90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15
  5. 1122334455667788991011121314151347181920929293949596979812345678]

从以上示例中可以看到,日志输出主要包含 fromtolog_datatopics 属性。具体结构信息,参见 合约日志结构

合约日志结构

根据调用 deposit(uint256) 方法的日志输出结果,可以看到区块链平台目前支持的合约日志结构如下:

属性 类型 长度(bit) 说明
from identity 256 合约调用方 ID
to identity 256 被调用的合约 ID
topics string 未定义 合约日志主题,包含用户自定义的日志主题。设置方式为在合约日志(event)的传入参数声明中添加 indexed 关键字,被标记为 indexed 的参数将会以 topic 的方式添加到合约日志主题中(参见 合约日志示例)。
log_data bytes 未定义 合约日志数据。用户在调用合约之后会得到 示例结构 的日志输出数据。

更多关于日志和事件的内容可参考 Solidity 官方文档(英文)