瞭解以太坊事件日誌協助智能合約開發的四個作用。

原文標題:《以太坊事件日誌協助智能合約開發的 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

你還不瞭解的以太坊事件日誌,開發智能合約的好工具

靈活的運用好以太坊事件日誌,某些場景下,開發將會事半功倍。除了事件日誌,以太坊還有更多有意思的設計等待大家探索挖掘。