被稱為Web3 的互聯網新去中心化願景的美妙之處在於,任何人都能夠與部署在通用區塊鏈上的智能合約進行交互。您可能已經知道,智能合約是在區塊鏈上運行的計算機程序,其源代碼可公開供任何人驗證,並且如前所述,任何人都可以與它們進行交互,而無需基於Web 的界面。這可以通過運行區塊鏈客戶端並使用命令行界面(CLI) 創建交易來完成。
Web 或移動應用程序與用於與智能合約交互的CLI 之間的中間地帶將是Etherscan——用於各種區塊鍊網絡的區塊瀏覽器,例如Ethereum、Polygon、Arbitrum、Optimism 等等。如果您對如何在Etherscan 上與智能合約交互感到好奇,請查看最近的博客文章 在Etherscan 上閱讀智能合約。
話雖如此,我們只能在Etherscan 上與“已驗證”的智能合約進行交互。在本技術教程中,您將學習如何在Etherscan 上驗證智能合約。
單個Solidity 文件的驗證
要開始驗證過程,我們需要首先部署智能合約。導航 混音IDE 並創建一個名為“Counter.sol”的新文件。粘貼以下代碼:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Counter { uint256 internal counter; function increment() external { unchecked { ++counter; } } function getCurrent() external view returns(uint256) { return counter; } }
在部署之前,我們必須注意我們用於編譯此合約的Solidity 編譯器的版本,以及在文件頂部提供的合約許可證,即“SPDX-License-Identifier”。
我們在合約文件中指定它可以使用0.8.0 到0.9.0 之間的任何Solidity 編譯器版本進行編譯,其中包含多個版本,例如0.8.0、0.8.1、0.8.2 等。
轉到“Solidity Compiler”選項卡,選擇Solidity 編譯器版本(記住,它可以是任何0.8 版本),然後單擊“Compile Counter.sol”。對於此示例,我們將使用0.8.7 編譯器版本。
成功編譯後,導航到當前選項下方的“部署和運行事務”選項卡。從“Environment”下拉菜單中,選擇“Injected Provider – Metamask”,它會自動顯示MetaMask 彈出窗口,將您的錢包連接到Remix IDE 網站。之後,選擇要在錢包內部署合約的區塊鍊網絡。
我們將把這個合約部署到Rinkeby,因此我們需要在MetaMask 錢包中選擇“Rinkeby 測試網絡”。為了部署合約,我們還需要一定數量的Test Rinkeby ether。您可以從 鏈環水龍頭 只需將錢包連接到水龍頭即可。確保右上角下拉列表中選擇的網絡是Ethereum Rinkeby。
最後,單擊橙色的“部署”按鈕並在MetaMask 錢包內簽署交易。等待大約15 秒,直到您的交易得到確認。您現在可以通過Remix IDE UI 與您的智能合約進行交互,但這不是重點,因為我們希望允許任何人使用它。
如果我們在Etherscan 上跟踪我們的合約,只需通過跟踪最後一筆交易哈希或將合約的地址粘貼到Etherscan 的搜索欄中,我們將在單擊合約選項卡時只看到合約的字節碼。這意味著我們需要在Etherscan 上“驗證”我們的智能合約,以便通過這個區塊瀏覽器使用它。
要開始驗證過程,請單擊“驗證並發布”藍色超鏈接文本。將顯示以下頁面。
如果默認情況下尚未填充合同地址,請在第一個輸入字段中輸入您的合同地址。然後從“編譯器類型”下拉列表中,選擇“Solidity(單個文件)”。之後,將顯示“編譯器版本”下拉菜單。在這裡,我們需要選擇在部署之前用於編譯此智能合約的相同Solidity 編譯器版本——在我們的例子中,它是0.8.7 版本。最後,從“開源許可證類型”下拉列表中,選擇在Solidity 文件開頭指定的許可證為“SPDX-License-Identifier”。在我們的例子中,這就是麻省理工學院。單擊繼續轉到下一頁。
將合約的源代碼粘貼到“在下面輸入Solidity Contract Code”輸入框,解開Captcha,點擊藍色的“Verify and Publish”按鈕。 您現在應該能夠在“合同”選項卡上看到綠色複選標記。這意味著合約已經過驗證,我們現在可以與之交互。
如果單擊“讀取合約”按鈕,您應該能夠調用“getCurrent”函數並查看我們的計數器變量的當前值,默認為零。
如果您點擊“Write Contract”按鈕,您應該可以將您的錢包連接到Etherscan 網站並調用我們的“increment”功能。點擊按鈕後,會彈出MetaMask 對交易進行簽名(記住你需要在Rinkeby 網絡上)。在您的交易成功包含在區塊中後,您可以返回“讀取合約”部分並再次調用“getCurrent”函數以驗證“計數器”值現在是否為1。
使用Flattener 插件驗證多個Solidity 文件
我們剛剛看到了智能合約的驗證過程如何在Etherscan 上運行。該示例向我們展示瞭如何為單個Solidity 文件完成此操作,但情況並非總是如此。實際上,您的智能合約通常會導入其他合約、接口或庫。
讓我們以Chainlink Price Feed Consumer 合約為例。創建一個新的Solidity 文件,將其命名為“PriceFeedConsumer.sol”,然後粘貼以下代碼 Chainlink 官方文檔:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; contract PriceConsumerV3 { AggregatorV3Interface internal priceFeed; /** * Network: Rinkeby * Aggregator: ETH/USD * Address: 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e */ constructor() { priceFeed = AggregatorV3Interface(0x8A753747A1Fa494EC906cE90E9f37563A8AF630e); } /** * Returns the latest price */ function getLatestPrice() public view returns (int) { ( /*uint80 roundID*/, int price, /*uint startedAt*/, /*uint timeStamp*/, /*uint80 answeredInRound*/ ) = priceFeed.latestRoundData(); return price; } }
行“導入”@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol“;” 表示我們正在從另一個文件導入Solidity 接口。接口本身不是智能合約,而是用於列出相關方法而沒有實現函數體。接口由“interface”關鍵字聲明。接口可以被用於實現所有列出的方法的智能合約繼承,或者用於調用已經實現這些列出的功能的其他合約的方法。在這個例子中,我們使用後一個例子來調用Chainlink Aggregator 合約上的“latestRoundData”函數。
讓我們再次使用0.8.7 Solidity Compiler 版本部署此合約。許可證又是MIT,我們可以從智能合約的第一行看到。
成功部署後,導航回Remix IDE 文件資源管理器。找到“PriceFeedConsumer.sol”,右鍵單擊它,然後單擊“Flatten”。
此命令將生成名為“PriceFeedConsumer_flat.sol”的新文件,並將所有導入替換為實際導入的合約、接口或庫的源代碼。
注意Remix IDE “Flatener” 擴展,它會自動激活。第二種扁平化合約的方法是激活這個擴展,點擊左下角的“Extensions”按鈕(在“Settings”按鈕上方,看起來像一個電插頭),然後點擊“壓平機”擴展。
然後,轉到Flattener 擴展選項卡並單擊“Flatten PriceFeedConsumer.sol”按鈕。請注意,此操作不會創建新文件,而是會將展平的源代碼複製到剪貼板,這樣我們就可以將其粘貼到Etherscan 驗證頁面。
您將選擇這兩種扁平化方法中的哪一種取決於您。
現在,當您進入Etherscan 驗證頁面時,如前一章所述,選擇:
- 對於編譯器類型——Solidity(單個文件)
- 對於編譯器版本——v0.8.7+commit.e28d00a7
- 對於開源許可證類型- MIT 許可證(MIT)
然後單擊“繼續”按鈕。
在下一頁的“在下面輸入Solidity 合約代碼”文本框中,粘貼“PriceFeedConsumer_flat.sol”文件或剪貼板的內容,具體取決於您用於展平合約的方法。
再次,解決驗證碼並單擊“驗證和發布”按鈕。
使用Etherscan 插件驗證多個Solidity 文件
驗證由多個Solidity 文件組成的合約的另一種方法是使用“Etherscan – Contract Verification” Remix IDE 插件。
我們將使用已經編寫好的“PriceFeedConsumer.sol”合約。再次部署它。之後,從“擴展”選項卡中激活“Etherscan – 合同驗證”插件。
現在去 以太掃描 並註冊一個帳戶。在您的帳戶設置下,找到“API 密鑰”部分。使用免費計劃生成一個API 密鑰。
然後,導航回Remix IDE,單擊“Etherscan – Contract Verification”選項卡並將您的API 密鑰粘貼到那裡。單擊“保存API 密鑰”按鈕。
然後,選擇您要驗證的合約並提供其合約地址。點擊“驗證合同”。就是這樣,你的合約現在應該在Etherscan 上得到驗證。
結論
在本文中,您學習瞭如何使用各種方法從Remix IDE 驗證Etherscan 上的智能合約。
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link.
要討論集成, 聯繫專家.