在 Etherscan 上验证智能合约
如果你打开这个etherscan 链接,你可以看到,你可以直接通过 etherscan 与这个智能合约的功能进行互动,类似于你以前在 Remix 上的做法。
你是否想知道为什么你的合约不会发生这种情况?
原因是上面提到的合约在 etherscan 上被验证了,而你的合约没有被验证。因此,让我们学习为什么以及如何在 etherscan 上验证合约 🚀。
为什么?
验证合约是很重要的,因为它可 以确保代码与部署在区块链上的内容一致。它还允许公众阅读和审计你的智能合约代码,是为你的 DApp 建立信任的一个良好信号。它还为您提供了一个与合约互动的 UI 界面,类似于 Remix,您可以通过 Etherscan 直接调用所有存在的功能。
硬帽插件
考虑到所有这些,重要的是要注意,在 Etherscan 上手动验证代码会变得相当棘手。你需要确保你不仅要验证你的主合约,还要验证你继承的或与你的主合约一起使用的合约。如果您为测试而部署了您的合约,并且在您的合约发生最轻微的变化时已经进行了验证,那么您将不得不再次经历手动过程,而这一过程随着时间的推移会变得很乏味。
构建
现在让我们来学习一下如何利用 hardhat 来验证智能合约,只需几行代码。
让我们来看看 🚀🚀🚀
写一些代码来验证
创建项目
现在你将需要设置你的 Hardhat 项目
mkdir etherscan-verification
cd etherscan-verification
npm init --yes
npm install --save-dev hardhat
npx hardhat
确保你选择创建一个 Javascript 项目,然后在你的终端上按照步骤操作。
现在在合约目录下创建一个新文件,名为 Verify.sol。
//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.4;
contract Verify {
string private greeting;
constructor() {
}
function hello(bool sayHello) public pure returns (string memory) {
if(sayHello) {
return "hello";
}
return "";
}
}
我们将安装 dotenv 包,以便能够导入 env 文件并在我们的配置中使用它。打开一个终端,指向 etherscan-verification 目录,执行以下命令
npm i dotenv
今天,我们将开始使用 Mumbai 网络,而不是 Goerli。Mumbai 是 Polygon 网络的一个测试网。就当这是你第一次在 Polygon 网络上构建应用。(别担心,这与在以太坊上构建网络非常相似)。
在 etherscan-verification 文件夹中创建一个.env 文件,并添加以下几行。按照下面的说明进行操作。
进入 Quicknode 并注册一个账户。如果你已经有一个账户,请登录。Quicknode 是一个节点提供商,让你连接到各种不同的区块链上。我们将使用它来通过 Hardhat 部署我们的合约。创建一个账户后,在 Quicknode 上创建一个端点,选择 Polygon,然后选择 Mumbai 网络。点击右下方的 "继续",然后点击 "创建端点"。复制 HTTP 提供者中给你的链接,并将其添加到下面 QUICKNODE_HTTP_URL
的 .env
文件中。
注意:如果你以前在 Quicknode 上设置了一个 Goerli 端点,你需要删除它并为 Mumbai 创建一个新的端点。如果你已经有一个孟买的端点,你可以继续使用那个。
为了得到你的私钥,你需要从 Metamask 中导出它。打开 Metamask,点击三个点,点击账户详情,然后导出私钥。确保你使用的是一个没有主网资金的测 试账户。在你的 .env
文件的 PRIVATE_KEY
变量中添加下面这个私钥。
此外,确保你有一些孟买 MATIC
代币可以使用。如果你不知道如何获得它们,请遵循 ThirdWeb 的这个指南。
最后,与 Etherscan 类似,Polygon 网络也有 Polygonscan。这两个区块探索器都是由同一个团队开发的,工作方式基本上完全相同。为了通过 Hardhat 在 Polygonscan 上自动进行合约验证,我们需要一个 Polygonscan 的 API 密钥。前往 PolygonScan 并注册。在 "账户概览 "页面上,点击 API Key,添加一个新的 API Key,并复制 API Key Token
。把它放在下面的 POLYGONSCAN_KEY 中。
QUICKNODE_HTTP_URL="add-quicknode-http-provider-url-here"
PRIVATE_KEY="add-the-private-key-here"
POLYGONSCAN_KEY="polygonscan-api-key-token-here"
让我们把合约部署到孟买网络。在 scripts 文件夹下创建一个新文件,或者替换现有的默认文件,命名为 deploy.js。注意我们是如何使用代码来验证合约的。
const { ethers } = require("hardhat");
require("dotenv").config({ path: ".env" });
async function main() {
/*
A ContractFactory in ethers.js is an abstraction used to deploy new smart contracts,
so verifyContract here is a factory for instances of our Verify contract.
*/
const verifyContract = await ethers.getContractFactory("Verify");
// deploy the contract
const deployedVerifyContract = await verifyContract.deploy();
await deployedVerifyContract.deployed();
// print the address of the deployed contract
console.log("Verify Contract Address:", deployedVerifyContract.address);
console.log("Sleeping.....");
// Wait for etherscan to notice that the contract has been deployed
await sleep(10000);
// Verify the contract after deploying
await hre.run("verify:verify", {
address: deployedVerifyContract.address,
constructorArguments: [],
});
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
// Call the main function and catch if there is any error
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
现在打开 hardhat.config.js 文件,我们将在这里添加 mumbai 网络,这样我们就可以把我们的合约部署到 mumbai,还有一个 etherscan 对象,这样我们就可以在 polygonscan 上验证我们的合约。将 hardhat.config.js 文件中的所有行替换为下面给出的行。
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config({ path: ".env" });
const QUICKNODE_HTTP_URL = process.env.QUICKNODE_HTTP_URL;
const PRIVATE_KEY = process.env.PRIVATE_KEY;
const POLYGONSCAN_KEY = process.env.POLYGONSCAN_KEY;
module.exports = {
solidity: "0.8.4",
networks: {
mumbai: {
url: QUICKNODE_HTTP_URL,
accounts: [PRIVATE_KEY],
},
},
etherscan: {
apiKey: {
polygonMumbai: POLYGONSCAN_KEY,
},
},
};
编译合约,打开指向 etherscan-verification 目录的终端,执行以下命令
npx hardhat compile
要部署,打开指向 etherscan-verification 目录的终端,执行以下命令
npx hardhat run scripts/deploy.js --network mumbai
它应该打印出一个指向孟买 PolygonScan 的链接,你的合约现在已经被验证了。点击该链接,在那里与你的合约进行互动 🚀🚀🚀。