原文標題:《 Solidity 極簡入門: 12. 事件 》
原文作者:0xAA
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每週更新 1-3 講。
所有代碼開源在 github: github.com/AmazingAng/WTFSolidity
這一講,我們用轉賬 ERC20 Token爲例來介紹 solidity 中的事件(event)。
Solidity 中的事件(event)是 EVM 上日誌的抽象,它具有兩個特點:
響應:應用程序(ether.js)可以通過 RPC 接口訂閱和監聽這些事件,並在前端做響應。
經濟:事件是 EVM 上比較經濟的存儲數據的方式,每個大概消耗 2,000-5,000 gas 不等。相比之下,存儲一個新的變量至少需要 20,000 gas。
事件的聲明由 event 關鍵字開頭,然後跟事件名稱,括號裏面寫好事件需要記錄的變量類型和變量名。以 ERC20 Token 合約的 Transfer 事件爲例:

我們可以看到,Transfer 事件共記錄了 3 個變量 from,to 和 value,分別對應 Token 的轉賬地址,接收地址和轉賬數量。同時 from 和 to 前面帶着 indexed 關鍵字,表示很重要,程序可以輕鬆的篩選出特定轉賬地址和接收地址的轉賬事件。每個事件最多有 3 個帶 indexed 的變量。
我們可以在函數裏釋放事件。在下面的例子中,每次用_transfer() 函數進行轉賬操作的時候,都會釋放 Transfer 事件,並記錄相應的變量。

我們嘗試用_transfer() 函數在 Rinkeby 測試網絡上轉賬 100 Token ,可以在 etherscan 上查詢到相應的 tx:https://rinkeby.etherscan.io/tx/0x8cf87215b23055896d93004112bbd8ab754f081b4491cb48c37592ca8f8a36c7
點擊 Logs 按鈕,就能看到事件明細:

Event 明細
Topics 裏面有三個元素,[0] 是這個事件的哈希,[1] 和 [2] 是我們定義的兩個 indexed 變量的信息,即轉賬的轉出地址和接收地址。Data 裏面是剩下的不帶 indexed 的變量,也就是轉賬數量。
這一講,我們介紹瞭如何使用和查詢 solidity 中的事件。很多鏈上分析工具包括 Nansen 和 Dune Analysis 都是基於事件工作的。
原文鏈接
歡迎加入律動 BlockBeats 官方社群:
Telegram 訂閱群:https://t.me/theblockbeats
Telegram 交流群:https://t.me/BlockBeats_App
Twitter 官方帳號:https://twitter.com/BlockBeatsAsia