事件和日志

事件是以太坊虚拟机(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]

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

合约日志结构

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

属性

类型

长度(bit)

说明

from

identity

256

合约调用方 ID。

to

identity

256

被调用的合约 ID。

topics

string

未定义

合约日志主题,包含用户自定义的日志主题。设置方式为在合约日志(event)的传入参数声明中添加 indexed 关键字,被标记为 indexed 的参数将会以 topic 的方式添加到合约日志主题中,参见 合约日志示例

log_data

bytes

未定义

合约日志数据。用户在调用合约之后会得到 示例结构 的日志输出数据。

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