本文作者:全干攻城尸[1]
本系列课程: 第一节:使用 hardhat 开发以太坊智能合约-搭建环境[2] 第二节:使用 hardhat 开发以太坊智能合约-测试合约[3] 第三节:使用 hardhat 开发以太坊智能合约-发布合约[4] 第四节:使用 hardhat 开发以太坊智能合约-验证合约[5]
一、概述
在我们将真正的合约部署到正式区块链网络上之后, 在区块链浏览器里查看我们的合约,它应该是这样显示的
在 Contract 选项卡里,它显示的是一堆无法被人类看懂的“乱码”,这对于我们来讲是没有什么问题的,并不会影响合约的正常运行。
但是对于我们的普通用户来讲,他们希望的是能看到你的合约的具体实现,从而判断你的合约是否有漏洞或者“深坑”。
为了增强用户对于项目的信任,我们需要将我们合约的源代码进行公布,接下来,我们就讲解,如何使用 hardhat 进行合约的验证
二、准备工作
1、申请区块链浏览器账号
我们使用区块链浏览器提供的 api 接口进行合约验证,所以我们需要先申请一个账号,这里我们拿 matic 区块链网络来举例说明,首先我们访问PolygonScan Registration Page[6] 注册账号(已经有账号的可以略过),然后用账号进行登录
2、创建 API-KEY
访问左侧菜单,如下图所示,输入 appName,然后点击 continue 按钮完成创建
完成创建后,你会得到一个 API-KEY,我们复制一下
3、修改配置文件
我们用 vscode 打开我们的 hardhat 工程,
3.1 修改.env 配置
找到根目录.env 配置文件,然后 追加一条配置
代码语言:javascript复制POLYGONSCAN_API_KEY = 你刚申请的API-KEY
3.2 修改 hardhat.config.js 配置
找到根目录的 hardhat.config.js 这个文件,添加如下配置:
代码语言:javascript复制etherscan: {
apiKey: {
polygonMumbai: process.env.POLYGONSCAN_API_KEY
}
}
完整代码应该如下图所示:
代码语言:javascript复制require("@nomicfoundation/hardhat-toolbox");
require('dotenv').config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.17",
networks: {
goerli: {
url: `https://eth-goerli.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
accounts: [process.env.GOERLI_PRIVATE_KEY],
},
matic: {
url: "https://rpc-mumbai.maticvigil.com",
accounts: [process.env.MATIC_PRIVATE_KEY]
}
},
etherscan: {
apiKey: {
polygonMumbai: process.env.POLYGONSCAN_API_KEY
}
}
};
三、验证合约
1、发布测试合约
准备工作已经完成,接下来,让我们进入真正的验证合约流程,首先,我们先在 matic 测试网创建一个合约,还是使用 Lock.sol 这个合约来创建(如何部署合约,可以看上一篇教程[发布合约[7]]),执行命令:
代码语言:javascript复制npx hardhat deploy --network matic
部署成功会返回合约地址:
我们复制这个合约地址,访问 matic 的测试区块链浏览器看一看它的详情
可以看到,已经创建成功了,我们点开 Contract 选项卡看一下
可以看出来,合约发布成功了,但是源代码看不到,接下来让我们来使用 hardhat 进行合约验证
2、合约验证
我们先来看一下官网关于合约验证这块是如何操作的,贴一下官网的示例代码
代码语言:javascript复制npx hardhat verify --network goerli <address> <unlock time>
然后我来解释一下
固定命令写法
代码语言:javascript复制npx hardhat verify --network
代表你要执行的网络,这个跟我们在 hardhat.config.js 配置的网络是一一对应的
代码语言:javascript复制goerli
合约地址,就是我们上一步发布合约后返回的那个地址,必填
代码语言:javascript复制<address>
部署合约的初始化参数,可以为多个,使用空格分隔,字符串使用""包裹
代码语言:javascript复制<unlock time>
那么一个完整的验证合约命令应该是这样的:
代码语言:javascript复制npx hardhat verify --network 网络名 合约地址 参数1 参数2 参数3 …… (没有参数就不写)
本教程的合约验证代码:
代码语言:javascript复制npx hardhat verify --network matic 0x123d89f92Bc76c918AECFA5825E13fe877e7D0C1 1696734227
等待命令执行完成,然后我们刷新刚刚区块链浏览器页面,发现合约已经被验证了
通过本节课程的学习,我们完成了合约的验证流程,到此,hardhat 的教程就结束了,后面我会推出更多智能合约相关的课程,感兴趣的同学关注一下吧
参考资料
[1]
全干攻城尸: https://learnblockchain.cn/people/5344
[2]
使用hardhat开发以太坊智能合约-搭建环境: https://learnblockchain.cn/article/4885
[3]
使用hardhat开发以太坊智能合约-测试合约: https://learnblockchain.cn/article/4930
[4]
使用hardhat开发以太坊智能合约-发布合约: https://learnblockchain.cn/article/4929
[5]
使用hardhat开发以太坊智能合约-验证合约: https://learnblockchain.cn/article/4931
[6]
PolygonScan Registration Page: https://polygonscan.com/register
[7]
[发布合约: https://learnblockchain.cn/article/4930