# Hardhat测试网部署合约

By [JamesTsao的个人成长笔记](https://paragraph.com/@pigfly) · 2022-07-08

---

Hardhat是一个solidity编译器，相比较于Remix这种网页端的编辑器，Hardhat可以通过vs code进行安装，以一个安装包的形式安装到项目路径下。

安装完成后运行 npx hardhat，按照指示可以在当前文件夹下创建一个hardhat项目。其实就是在当前的React框架下增加几个文件夹和模板文件。

进入到contracts文件夹下，即可新建我们的sol文件，进行合约的编写了。通常还需要安装一下@openzeppelin/contracts这个标准代码库。

编写完成sol文件之后，进入到scripts文件夹下，编辑deploy合约的js脚本文件。在hardhat提供的模板文件基础上将合约名称等参数修改下即可。

在项目文件夹路径下还有一个hardhat.config.js文件，在这个文件中需要定义我们需要将合约部署到的网络。以部署到测试网为例，在module.exports中修改如下代码：

    module.exports = {
    
      solidity: "0.8.4",
    
      networks: {
    
        rinkeby:{
    
          url: process.env.REACT_APP_RINKEBY_RPC_URL,
    
          accounts: [process.env.REACT_APP_PRIVATE_KEY],
    
        },
    
      },
    
      etherscan:{
    
        apiKey: process.env.REACT_APP_ETHERSCAN_API,
    
      }
    }
    

其中，REACT\_APP\_RINKEBY\_RPC\_URL是测试网的节点地址，需要我们去rinkeby自行申请。REACT\_APP\_PRIVATE\_KEY是钱包私钥。REACT\_APP\_ETHERSCAN\_API是我们在etherscan拿到的api key。这些参数涉及到数据安全，因此需要单独存放在.env文件中，通过process.env来获取。

这些代码修改好之后，在vs code终端中输入以下命令：

    npx hardhat run scripts/deploy.js --network rinkeby
    

代码执行后，终端会显示出合约部署到测试网的地址，过一两分钟就可以在测试网（rinkeby.etherscan）上搜到对应的合约了。这边需要消耗一定的gas作为合约部署的费用，测试网的ETH需要去水龙头领取一下。

上传的合约默认是没有经过etherscan验证的，在rinkeby.etherscan上只能看到合约对应的一堆bytes。因此我们需要将合约进行验证。

首先需要安装以下依赖，并在hardhat.config.js中导入依赖。

    npm i -D @nomiclabs/hardhat-etherscan
    

然后我们在终端中输入一下代码进行合约验证：

    npx hardhat verify --network rinkeby 0x合约地址 初始化变量
    

需要注意的是，如果合约中需要传入参数进行变量的初始化，那么需要在合约地址后面加上我们需要传入的参数。比如我们的合约需要外部传入一个unit值作为tokenMaxSupply，那么我们这边就需要在合约地址后面增加一个 10000。这个10000就是合约的最大供应量。10000这个数值需要和之前通过hardhat deploy合约的时候传入的参数一致。

这样，合约就可以通过验证了，我们可以通过etherscan很方便的查看、调用合约的外部函数，并且可以看到与合约进行交互的transaction。合约的交互信息会保留在测试网上，方便下次的测试。

---

*Originally published on [JamesTsao的个人成长笔记](https://paragraph.com/@pigfly/hardhat)*
