Skip to main content

在 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 的链接,你的合约现在已经被验证了。点击该链接,在那里与你的合约进行互动 🚀🚀🚀。

要通过本级别的技能测试,请选择下面的孟买测试网,并输入你在 Polygon 孟买测试网上验证的合约地址。

在 Discord 中分享该链接,并一如既往地随时提出任何问题!

参考