Solidity 事件對於智能合約開發者來說是測試方式的,它允許我們對智能中特定的發起者進行,以自動化的方式開創前端等事件,知道在Solidity 中使用可以實現智能契約的開發更容易。
在本文中,我們很清楚智能合約開發者的角度研究以太坊虛擬機(EVM)的日誌和事件功能,包括日誌和事件的用途、記錄事件,以及如何在Hardhat 和Brownie 中使用日誌和事件。
EVM 是以太坊和許多其他區塊鏈的核心。的功能,用於將數據“寫”到智能合約之外的數據結構中。其中一個重要的數據是Solidity事件。事件允許我們“打印”在一小段鏈上的信息,這種方式比在智能合約中保存到公共發起者更容易搜索,並且更省氣費。
日誌是區塊鏈上的一種特殊數據結構。不能被智能合約訪問,但能提供關於交易和部分中發生的信息。因為正是它們不能被智能合約訪問,才可以把它們的使用場景記下來。
你也可以觀看下面關於Solidity 中事件和視頻的視頻:
那麼,什麼是事件呢?
事件允許我們輕鬆查詢在部分和交易中發生的“”。如果你運行一個區塊鏈節點,你可以通過訂閱其實,這就是一些事件。鏈聯網絡的工作方式。 Chainlink網絡在部分地址訂閱部分事件,並根據事件內容,從現實世界返回數據。
事件能解決嗎?
現在,如果你不是Chainlink 或Ethereum 節點運營商,你可能會問事件對你有什麼影響呢。通過Solidity 事件,你可以做:
- 測試你的智能合約中的特定變量;
- 索引以重建存儲狀態;
- 監聽事件前端前端狀態;
- 創建子圖以響應地讀取數據;
對工程師完成其他事情。對於工程師,事件還有很多可能的例子。確切地說,Chainlink 節點會監聽數據請求和外部計算事件,這正是他們知道如何響應的淵源。
事件突然子的?
下面的數據結構就是在Solidity 中定義一個事件的方式:
event storedNumber( uint256 indexed oldNumber, uint256 indexed newNumber, uint256 addedNumber, address sender );
你可以把事件說成是一個新的特殊類型。存儲號碼事件的“類型”。事件的名字叫什麼存儲號碼,可以容納一些變量。在這個事件中,有兩種參數:有索引的和無索引的。索引參數也被稱為“主題”,是事件中的可搜索參數。我們會在後文更多地談及這些內容。
然後我們可以像下面這樣發出一個事件:
uint256 favoriteNumber; function store(uint256 _favoriteNumber) public { emit storedNumber( favoriteNumber, _favoriteNumber, _favoriteNumber + favoriteNumber, msg.sender ); favoriteNumber = _favoriteNumber; }
下面是一個完整的合約實例:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; contract SimpleStorage { uint256 favoriteNumber; event storedNumber( uint256 indexed oldNumber, uint256 indexed newNumber, uint256 addedNumber, address sender ); function store(uint256 _favoriteNumber) public { emit storedNumber( favoriteNumber, _favoriteNumber, _favoriteNumber + favoriteNumber, msg.sender ); favoriteNumber = _favoriteNumber; } function retrieve() public view returns (uint256) { return favoriteNumber; } }
現在,只要我們這個例子中的店鋪函數,它會發出一個存儲號碼類型的事件。讓我們看看一個調用店鋪函數、輸入為1的示例交易。我們可以在科萬·埃瑟斯坎上看到這個事務。
滾動到交易的“日誌”部分,我們可以看到以下內容:
一個事件可以劃分為:
地址: 地址,發出事件的細節或表面的地址。
話題:主題,事件的索引參數。
數據: 數據,事件的非索引參數的ABI 編碼或“哈希”。因為我們知道契約的ABI(因為我們在Etherscan 上驗證了契約),我們在“Dec”或“Decoded”模式下查看它,或者可以在其原始的“十六進制”、“十六進制”或“編碼”模式下查看。如果我們沒有驗證過契約,我們就無法看到解碼的版本。
你可以在Solidity文檔中閱讀更多關於事件的內容。 “日誌”和“事件”經常被互換使用,因為作為智能事件的開發者,我們通常只關心中的“”日誌。包括區塊哈希、地址,以及通過調用eth_getLogs返回給你的部分鏈節點的其他數據。你也可以閱讀更多有關布隆過濾器的內容,這是這些事件能夠被簡單地發現的原因。
安全帽中的事件
現在我們已經知道是事件了,讓我們學習如何在Hardhat中訪問並使用它們。你可以克隆下面的repo,然後繼續操作:
git clone https://github.com/PatrickAlphaC/hardhat-events-logs cd hardhat-events-logs
你需要跟著自述文件中的說明完成依賴工具的安裝,包括節點、紗和吉特。
如果你跟著自述文件操作,你將能夠:
- 部署一個智能合約;
- 創建一個發出事件的交易;
- 查看這些事件的上下文。
如果你在這個過程中遇到的問題,請在Github 倉庫上新建一個問題!我們可以通過檢查交易收據對象的日誌屬性來查看日誌。
console.log(transactionReceipt.events[0].args.oldNumber.toString())
布朗尼中的事件
布朗尼中的事件幾乎是相同的,因為情節是完全相同的。
你可以復制下面的repo,然後跟著操作:
git clone https://github.com/PatrickAlphaC/brownie-events-logs cd brownie-events-logs
你需要跟著自述文件中的說明完成依賴工具的安裝,包括節點、Python、eth-brownie和吉特。
如果你跟著README.md操作,你將能夠:
- 部署一個智能合約;
- 創建一個發出事件的交易;
- 查看這些事件的上下文。
如果你在這個過程中遇到的問題,請在Github 倉庫上新建一個問題你會發現這裡的主要區別是,我們使用打印語句來打印出事務的日誌:
print(tx.events[0]["oldNumber"])
總結
和事件是智能合約開發的組成部分,也是Chainlink和The Graph等項目的關鍵基礎設施日誌。了解更多關於開發者的智能合約的信息(利用你新掌握的事件技能),請務必務必前往查看Chainlink文檔,從現在開始創作吧!
帖子 Solidity 中的事件和日誌 首先出現在 Chainlink 博客.