header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP
Partnered With:

Solidity極簡入門|第十二講:事件

閱讀本文需 5 分鐘
本文以轉賬ERC20 Token爲例來介紹solidity中的事件(event)。
原文標題:《 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 事件,並記錄相應的變量。



在 etherscan 上查詢事件


我們嘗試用_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

举报 糾錯/舉報
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交