了解以太坊事件日志协助智能合约开发的四个作用。

原文标题:《以太坊事件日志协助智能合约开发的 4 大作用》
撰文:Signor_Yuan

近日,由中国团队 Tokenview 开发的以太坊区块浏览器 eth.tokenview.com 正式上线「事件日志 Event logs」板块。当智能合约被调用时,也就是事件发送的时候,EVM 会触发参数存储到交易日志中,因此日志记录着智能合约所触发的事件。这些事件日志可以协助以太坊智能合约开发者和 dApp 开发者完成相关的开发、调试工作。

以太坊引入事件日志,主要为了实现以下四个作用。

  1. 为前端提供智能合约的返回值
  2. 为前端同步数据通知
  3. 检索历史交易详情
  4. 数据存储

以太坊智能合约的调用需要通过发送交易来完成,但由于以太坊 POW 的特点,交易的打包和确认需要时间,在网络拥堵的情况下,需要更久,在交易完成之前,合约调用的返回值为交易哈希。而通过监听以太坊智能合约的事件日志,前端可以在交易被打包的时候获取到该笔交易中智能合约调用的返回值,实现异步调用和通知。

另外,事件日志存储的 GAS 费用与链上数据存储相比要更加实惠。在以太坊存储 256-bit (32 字节)需要 20000 个 GAS,而事件日志每个字节只需要花费 8 个 GAS,只有前者的 1/78,因此某些场景下,我们可以考虑把数据存到事件日志里。

那么,事件日志可以提供哪些返回值,我们又如何通过事件日志检索历史交易详情呢?

USDT 是目前使用最广泛,也是市值最高的稳定币。目前 USDT 有 OMNI,ERC20 和 TRC20 三种,我们拿 ERC20 这类的某一笔交易为例。

这是一笔 USDT (ERC20)的交易哈希:
https://eth.tokenview.com/cn/tx/9124958/101
Transaction hash:
0x2e3c91e9026cc6b0d896d70a5f20f0b5e28833d140d67a3b6c6eb42e5c52e4f5

你还不了解的以太坊事件日志,开发智能合约的好工具

通过区块浏览器可以看到该笔 USDT 交易的发生时间,发送方,接收方,以及 1 亿 USDT (ERC20)的交易额等信息。通过交易信息右边的事件日志,可以看到更多详细数据。

你还不了解的以太坊事件日志,开发智能合约的好工具

第一部分的地址(Address)展示的是该笔交易所调用的合约地址。

第二部分的题目(Topic)字符串表示本次调用事件的名称,即 ERC20 标准的 Event Transfer (Index_topic_1 address from, index_topic_2 address to, uint256 value)。下面的两个地址分别为 Transfer 的前两个参数,此处即为转出地址 from 和转入地址 to,可选十六进制或十进制。

第三部分的数据(Data)为转账金额,也是 Transfer 的最后一个参数,我们通过查看十进制下的余额,可以确定其转账金额为 1 亿 USDT。

Tokenview 展示了这笔交易的 Raw traces 以便开发者对详情进行追踪。

你还不了解的以太坊事件日志,开发智能合约的好工具

我们可以看到地址「0x6c9b1c9ffdf7291d5a27ea20aca2b26ec338a2c3」调用了智能合约「0x0417f2e41e8c68aca7b3c47dd62c734e9ceca862」。我们在「input」中可以追溯到该笔交易的接收地址和转账金额。

通过事件日志(Event logs)和 Raw traces,以太坊开发者可以追溯任何一个 Event 或 Function,从而协助进行智能合约和 dApp 的调用与开发工作。要想快速获取一定时间段 / 一定区块高度的事件日志,可以通过由 Tokenview 提供的相关 API 实现。

下面是获取 ETH 事件日志的一个例子:
http://www.tokenview.com:8088/eth/tx/runlog/9000000/2

你还不了解的以太坊事件日志,开发智能合约的好工具

灵活的运用好以太坊事件日志,某些场景下,开发将会事半功倍。除了事件日志,以太坊还有更多有意思的设计等待大家探索挖掘。