事件是以太坊虚拟机(Ethereum Virtual Machine,简称“EVM”)提供的一种日志基础设施。事件可以用来做操作记录,存储为日志。也可以用来实现一些交互功能,比如通知 UI,返回函数调用结果等。日志和事件机制是平台与终端用户连接的桥梁。
合约日志示例
您可以通过日志和事件机制获得合约代码的执行情况。下面是一个简单的合约示例:
pragma solidity ^0.4.0;
contract ClientReceipt {
event Deposit(
identity indexed _from,
uint _id,
uint _value
);
function deposit(uint _id) {
Deposit(msg.sender, _id, msg.value);
}
}
在部署该合约之后,可以通过调用 deposit(uint256)
方法获得 log
事件输出。可使用 event
关键字定义一个事件,参数列表中为要记录的日志参数的名称及类型。合约输出结果如下所示:
from: 1122334455667788991011121314151347181920929293949596979812345678
to: 10237462546362184738205736165f7391947195472655869214456471048395
log_data:00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000032
topics:[90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15
1122334455667788991011121314151347181920929293949596979812345678]
从以上示例中可以看到,日志输出主要包含 from
、to
、log_data
、topics
属性。具体结构信息,参见 合约日志结构。
合约日志结构
根据调用 deposit(uint256)
方法的日志输出结果,可以看到区块链平台目前支持的合约日志结构如下:
属性 | 类型 | 长度(bit) | 说明 |
from | identity | 256 | 合约调用方 ID。 |
to | identity | 256 | 被调用的合约 ID。 |
topics | string | 未定义 | 合约日志主题,包含用户自定义的日志主题。设置方式为在合约日志(event)的传入参数声明中添加 |
log_data | bytes | 未定义 | 合约日志数据。用户在调用合约之后会得到 示例结构 的日志输出数据。 |
更多关于日志和事件的内容可参考 Solidity 官方文档(英文)。
文档内容是否对您有帮助?