Solidity事件對于智能合約開發者來說是不可或缺的,它允許我們對智能合約中特定變量進行測試,以自動化的方式改變前端等。總的來說,知道如何在Solidity中使用事件可以使智能合約的開發變得更加容易。
在本文,我們將從智能合約開發者的角度來研究以太坊虛擬機的日志和事件功能,包括日志和事件的用途,索引事件,以及如何在Hardhat和Brownie中使用日志和事件。
EVM是以太坊和許多其他區塊鏈的核心。EVM有一個日志功能,用于將數據“寫”到智能合約之外的數據結構中。其中一個重要的數據是Solidity事件。事件允許我們“打印”在區塊鏈上的信息,這種方式比在智能合約中保存到公共存儲變量更容易搜索,且更省gas費。
日志是區塊鏈上的一種特殊數據結構。它們不能被智能合約訪問,但能提供關于交易和區塊中發生的信息。正是因為它們不能被智能合約訪問,才使得它們的使用成本更低。
Solidity發布0.8.13版本,修復abi.encodeCall相關重要bug:3月18日消息,以太坊智能合約編程語言 Solidity 發布 0.8.13 版本。本次更新修復了 abi.encodeCall 相關重要 bug;擴展 using for 指令;內置語言服務器支持“go to definition”功能;并考慮通過 Yul IR stable 進行編譯。[2022/3/18 14:04:48]
你也可以觀看下面的關于Solidity中的事件和日志的視頻:
https://www.bilibili.com/video/BV1iL4y1s7ro?spm_id_from=333.999.0.0
那么,什么是事件呢?
事件允許我們輕松查詢在區塊和交易中發生的“東西”。如果你運行一個區塊鏈節點,你可以通過訂閱它們來“監聽”到某些事件。事實上,這就是Chainlink網絡的工作方式。Chainlink網絡在某些地址訂閱某些事件,并根據發出的事件內容,從現實世界返回數據。
Solana 協議庫漏洞可能導致攻擊者每小時竊取 2700 萬美元:金色財經報道,據 Neodyme 的安全研究人員稱,Solana 協議庫中的一個漏洞,一組 Solana 項目的參考文檔可能導致攻擊者以每小時 2700 萬美元的速度從多個 Solana 項目中竊取資金。受影響的項目包括收益聚合器 Tulip Protocol 和借貸協議 Solend 和 Larix。這些項目目前管理著 17 億美元的資金。 Neodyme 解釋說,該漏洞是由 Neodyme 的一名審計員西蒙于 6 月在文件共享平臺 GitHub 上首次公開披露的。當時,安全研究人員不知道它是否可以被利用或它的影響有多大。這個錯誤沒有被注意到。
12 月 1 日,Simon 看到問題仍然存在并且錯誤尚未修復。由于他的擔憂,Neodyme 的安全研究人員開始測試是否有可能利用該漏洞,并評估其嚴重程度。(The block)[2021/12/4 12:51:20]
事件能用來做什么?
Soluna為清潔能源生產商推出限電評估服務:11月29日消息,綠色數據中心開發商Soluna Holdings, Inc.(此前為Mechanical Technology)宣布,現在為清潔能源發電廠所有者和開發商提供定制評估服務,以減少成本高昂的限電問題。自定義限電評估是一項受NDA保護的專有項目級數據審查服務,通過Soluna的模塊化數據中心(MDC)對縮減的電力進行靈活的分輸,估算損失和可收回的收入。
據悉,Soluna Holdings, Inc.是針對加密貨幣挖礦和其他密集型計算的綠色數據中心開發商。(DGAP)[2021/11/29 12:39:16]
現在,如果你不是Chainlink或Ethereum節點運營商,你可能會問事件對你有什么影響呢。通過Solidity事件,你可以做:
測試你的智能合約中的特定變量;
動態 | VanEck及SolidX撤回比特幣ETF提案:Cboe BZX Exchange周二撤回了其VanEck / SolidX比特幣ETF的提案。根據9月17日提交的一份文件,公開列出VanEck SolidX比特幣ETF的規則變更已于9月13日撤銷。該提案的決定已被多次推遲,此前美國證券交易委員會(SEC)面臨著在最終截止日期,即10月18日確定是否批準或拒絕該比特幣ETF。此次是VanEck和SolidX第二次撤回擬議的ETF。此前由于面臨美國政府的長期關閉可能導致該提案被拒后,這些公司于1月撤回了相同的ETF提議。(coindesk)[2019/9/18]
索引變量以重建存儲狀態;
監聽事件用于改變前端狀態;
創建子圖以更快地讀取數據;
還可以完成其他許多事情。對工程師來說,事件有各種各樣的用例。事實上,事件是Chainlink節點運作的核心組成部分。Chainlink節點會監聽數據請求和外部計算事件,這正是是他們知道如何響應的根源。
事件是什么樣子的?
下面的數據結構就是在Solidity中定義一個事件的方式:
你可以把事件看作是一個新的特殊類型。我們已經創建了一個名為storedNumber的事件“類型”。事件的名字叫storedNumber,可以容納一些變量。在這個事件中,有兩種參數:有索引的和無索引的。索引參數也被稱為“主題”,是事件中的可搜索參數。我們會在后文更多地談及這些內容。
然后我們可以像下面這樣發出一個事件:
下面是一個完整的合約實例:
現在,只要我們調用這個例子中的store函數,它就會發出一個storedNumber類型的事件。讓我們看看一個調用store函數、輸入為1的示例交易。我們可以在KovanEtherscan上看到這個事務。
滾動到交易的“日志”部分,我們可以看到以下內容:
一個事件可以分解為:
Address:地址,發出事件的合約或賬戶的地址。
Topics:主題,事件的索引參數。
Data:數據,事件的非索引參數的ABI編碼或“哈希”。由于我們知道合約的ABI,我們可以在“Dec”或“Decoded”模式下查看它,或者在其原始的“hex”、“Hexidecimal”或“Encoded”模式下查看。如果我們沒有驗證過合約,我們就無法看到解碼的版本。
你可以在Solidity文檔中閱讀更多關于事件的內容。“日志”和“事件”經常被互換使用,因為作為智能合約的開發者,我們通常只關心日志中的“事件”。然而,從技術上講,日志也包括blockhash、address,以及通過調用eth_getLogs返回給你的區塊鏈節點的其他數據。你也可以閱讀更多有關布隆過濾器的內容,這是這些事件能被簡單查詢到的原因。
Hardhat中的事件
現在我們已經了解了什么是事件,讓我們學習如何在Hardhat中訪問并使用它們。你可以克隆下面的repo,然后跟著操作:
gitclonehttps://github.com/PatrickAlphaC/hardhat-events-logs
cdhardhat-events-logs
你需要跟著README.md中的說明完成依賴工具的安裝,其中包括Node、Yarn和Git。
如果你跟著README.md操作,你將能夠:
部署一個智能合約;
創建一個發出事件的交易;
查看這些事件的上下文。
如果你在這一過程中遇到問題,請在Githubrepo上新建一個Issue!我們可以通過檢查transactionReceipt對象的logs屬性來查看日志。
Brownie中的事件
Brownie中的事件幾乎是相同的,因為合約是完全相同的。
你可以克隆下面的repo,然后跟著操作:
你需要跟著README.md中的說明完成依賴工具的安裝,其中包括Node、Python、eth-brownie和Git。
如果你跟著README.md操作,你將能夠:
部署一個智能合約;
創建一個發出事件的交易;
查看這些事件的上下文。
如果你在這一過程中遇到問題,請在Githubrepo上新建一個Issue!你會發現這里的主要區別是,我們使用打印語句來打印出事務的日志:
總結
日志和事件是智能合約開發的重要組成部分,也是Chainlink和TheGraph等項目的關鍵基礎設施。要想了解更多關于開發強大的智能合約的信息,請務必前往查看Chainlink文檔,從現在開始創作吧!。
親愛的BitMart用戶,Ravendex(RAVE)已于2022年1月10日19:00(香港時間)上線BitMart!為慶祝RAVE上線,我們向廣大交易用戶開放凈買入大賽活動—瓜分9,090.
1900/1/1 0:00:00原文作者:spengrah原文翻譯:Blockunicorn我們經常看到資源和治理被捕獲的故事,所以我們把它當作生活的現實來接受.
1900/1/1 0:00:00爲向用戶提供更加優質的服務及更好的流動性,Gate.io推出全新做市商激勵計劃,設置五重大獎,獎池總量高達$800,000,更有大額免息貸款,快來參加每月做市商評選吧.
1900/1/1 0:00:00尊敬的XT用戶: XT.COM即將上線AMZE,並在主板區開放AMZE/USDT,AMZE/BTC交易對。具體開通時間,請關註後續公告。AMZE是旅遊業的實用代幣.
1900/1/1 0:00:00本文來自TheBlock,原文作者:YogitaKhatriOdaily星球日報譯者|念銀思唐宣布了這一消息,稱幣安將占去年8月份宣布的4億美元私募股權投資的一半.
1900/1/1 0:00:00穩定幣是指與另一種資產的價格掛鉤的代幣,例如美元。第一個創立的穩定幣是TetherUSDT,盡管多年來的傳言、流言和仍未公開審計的隱蔽記錄,但它至今仍是市場主導的代幣.
1900/1/1 0:00:00