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