在很大程度上由於部署到通用區塊鏈的智能合約的不可變性,安全性始終是用戶和企業的首要任務。出於這個原因,在以太坊上開發智能合約的關鍵步驟之一是初始部署後的Etherscan 驗證。 Etherscan 使任何人,從用戶到經驗豐富的開發人員和錯誤獵人,都可以檢查代碼的有效性、正確性和安全性。
在之前的文章中,我們已經學習瞭如何 在Etherscan 上閱讀智能合約 以及如何 使用Remix IDE 在Etherscan 上驗證智能合約. 在本教程中,我們的目標是了解如何使用最常用的智能合約開發框架之一來完成驗證——安全帽.
讓我們開始吧。
讓我們創建一個新的Hardhat 項目。 首先,我們要檢查我們機器上安裝的npm 版本。打開你的終端並輸入:
npm -v
如果您沒有安裝npm,請按照 本指南. 然後,輸入以下命令安裝Hardhat:
npm install --save-dev hardhat
如果您正在使用 紗 代替npm,輸入:
yarn add --dev hardhat
如果您使用的是Windows,強烈建議使用 WSL 2.
要創建示例項目,請在項目文件夾中運行以下命令,然後選擇“創建TypeScript 項目”:
npx hardhat
如果前面的步驟正常工作,您現在應該能夠看到三個主要的Hardhat 文件夾:“contracts”、“test”和“scripts”。轉到“contracts”文件夾,創建一個新的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: Goerli * Aggregator: ETH/USD * Address: 0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e */ constructor(address priceFeedAddress) { priceFeed = AggregatorV3Interface(priceFeedAddress); } /** * 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 包:
npm install --save-dev @chainlink/contracts
之後,通過運行編譯我們的智能合約
npx hardhat compile
使用Hardhat,您可以使用Etherscan 驗證您的智能合約 安全帽-etherscan 插入。
首先,您需要一個Etherscan API 密鑰。要獲得一份,請前往 Etherscan 網站,免費創建一個新帳戶並登錄。之後,單擊“API Keys”選項卡。最後,單擊“添加”按鈕生成新的API 密鑰。
我們將把我們的智能合約部署到Goerli 測試網絡。如果您以前從未這樣做過,您可能想知道,為了從Hardhat 部署智能合約,您必須提供錢包的私鑰和JSON RPC URL。您可以註冊一個 煉金術 鑰匙免費。
你還需要一些測試ETH,你可以很容易地從 鏈環水龍頭.
導航回您的安全帽項目。修改“hardhat.config.ts”文件:
export default { // rest of the config networks: { hardhat: {}, goerli: { url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`, accounts: [GOERLI_PRIVATE_KEY], }, }, etherscan: { apiKey: "ABCDE12345ABCDE12345ABCDE123456789", // Your Etherscan API key }, };
在“scripts”文件夾中創建新文件並將其命名為“deployPriceFeedConsumer.ts”。該腳本將部署PriceFeedConsumer.sol 智能合約,出於安全原因等待幾個區塊被包含在鏈中,並嘗試在Etherscan 上對其進行驗證。
import { ethers, network, run } from "hardhat"; async function main() { const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”; const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”); const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress); const WAIT_BLOCK_CONFIRMATIONS = 6; await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS); console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`); console.log(`Verifying contract on Etherscan...`); await run(`verify:verify`, { address: priceFeedConsumer.address, constructorArguments: [priceFeedAddress], }); } main().catch((error) => { console.error(error); process.exitCode = 1; });
保存文件並從終端運行下一個命令:
npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli
您的合約現在應該部署到Goerli 測試網並在Etherscan 瀏覽器上進行驗證。
我們將再次使用 安全帽-etherscan 插件來驗證我們的智能合約。
要開始,請訪問 以太掃描 並註冊一個帳戶。在您的帳戶設置下,找到“API 密鑰”部分。使用免費計劃生成一個API 密鑰。
我們將再次將我們的智能合約部署到Goerli 測試網絡。如果您需要測試令牌,請訪問 鏈環水龍頭.
修改“hardhat.config.ts”文件:
export default { // rest of the config networks: { hardhat: {}, goerli: { url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`, accounts: [GOERLI_PRIVATE_KEY], }, }, etherscan: { apiKey: "ABCDE12345ABCDE12345ABCDE123456789", // Your Etherscan API key }, };
在“scripts”文件夾中創建新文件並將其命名為“deployPriceFeedConsumer.ts”。這將部署PriceFeedConsumer.sol 智能合約並出於安全原因等待幾個區塊被包含在鏈中。
import { ethers, network } from "hardhat"; async function main() { const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”; const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”); const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress); const WAIT_BLOCK_CONFIRMATIONS = 6; await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS); console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`); } main().catch((error) => { console.error(error); process.exitCode = 1; });
使用以下命令部署您的智能合約:
npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli
我們現在將使用Hardhat 的“驗證”任務從CLI 在Etherscan 上驗證這個智能合約。此命令的一般語法如下所示:
npx hardhat verify --network <network> <contract address> <constructor parameters>
我們將通過以下方式對其進行調整:
npx hardhat verify --network goerli <contract address>
0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
您應該能夠在Etherscan 上看到我們合約的公開驗證源代碼的鏈接。如果您收到一條錯誤消息,指出該地址沒有字節碼,這可能意味著Etherscan 尚未索引您的合約。在這種情況下,請稍等片刻,然後重試。
使用Hardhat 進行Etherscan 驗證的第三個選項類似於通過Remix IDE 進行驗證的過程,這在我們的一個 以前的博客文章.
我們再次部署到Goerli 測試網絡,如果您需要測試令牌,請導航到 鏈環水龍頭. 為此,您不需要Etherscan API 密鑰。
您的“hardhat.config.ts”文件應如下所示:
export default { // rest of the config solidity: "0.8.9", networks: { hardhat: {}, goerli: { url: `https://eth-goerli.alchemyapi.io/v2/${ALCHEMY_API_KEY}`, accounts: [GOERLI_PRIVATE_KEY], }, } };
我們將重用上一章的部署腳本:
import { ethers, network } from "hardhat"; async function main() { const priceFeedAddress = “0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e”; const priceFeedConsumerFactory = await ethers.getContractFactory(“PriceConsumerV3”); const priceFeedConsumer = await priceFeedConsumerFactory.deploy(priceFeedAddress); const WAIT_BLOCK_CONFIRMATIONS = 6; await priceFeedConsumer.deployTransaction.wait(WAIT_BLOCK_CONFIRMATIONS); console.log(`Contract deployed to ${priceFeedConsumer.address} on ${network.name}`); } main().catch((error) => { console.error(error); process.exitCode = 1; });
運行部署腳本:
npx hardhat run scripts/deployPriceFeedConsumer.ts --network goerli
如果你在Etherscan 上搜索你的合約地址,當你點擊合約標籤時,你只會看到合約的字節碼。
要開始驗證過程,請單擊“驗證並發布”鏈接。將顯示以下頁面。
如果默認情況下尚未填充合同地址,請在第一個輸入字段中輸入您的合同地址。
然後,從“編譯器類型”下拉列表中,選擇“Solidity(單個文件)”。
之後,將顯示“編譯器版本”下拉菜單。在這裡,您需要選擇在部署之前用於編譯此智能合約的相同Solidity 編譯器版本。如果您回頭查看“hardhat.config.ts”文件,您會發現在我們的例子中,它是0.8.9 版本。
最後,從“開源許可證類型”下拉列表中,選擇在Solidity 文件開頭指定的許可證為“SPDX-License-Identifier”,在我們的例子中是MIT。點擊“繼續”進入下一頁。
在下一頁上,您應該粘貼智能合約的源代碼。不幸的是,如果您像我們一樣導入了其他合約或接口,您不能在這裡複製粘貼。 Etherscan 還需要知道這些導入合約的源代碼。為此,您需要通過鍵入以下命令來“扁平化”您的智能合約:
npx hardhat flatten
您的智能合約的“扁平化”版本將在終端中打印出來。或者,您可能希望將其保存在單獨的文件中,您可以通過鍵入以下內容來完成:
npx hardhat flatten contracts/PriceFeedConsumer.sol > cotracts/PriceFeedConsumer_flat.sol
現在您可以將合約的源代碼粘貼到“Enter the Solidity Contract Code below”輸入框中。然後,解決驗證碼並單擊藍色的“驗證並發布”按鈕。您應該能夠在“合同”選項卡上看到綠色複選標記。這意味著您已成功驗證您的合同。
在本文中,我們介紹瞭如何使用三種不同的方法從Hardhat 驗證Etherscan 上的智能合約。智能合約驗證是部署過程中的關鍵步驟之一,因為它允許社區在使用之前檢查源代碼。
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀docs.chain.link 上的文檔。要討論集成,請聯繫專家。