hardhat

  1. hardhat使用的链
  2. 使用hardhat部署测试网合约
  3. verify源代码
    1. 手动verify
    2. 使用hardhat verify

hardhat使用的链

hardhat内置开发链是in-process链,不独立启动运行,随同一个测试或者脚本进程而产生销毁

测试用的是内置链,脚本如果不指定–network,则用的是内置链

内置链的名称是hardhat,所以运行脚本时指定network参数为hardhat,跟不指定参数效果相同

脚本运行时可以指定预定义的本地网络localhost,指向http://127.0.0.1:8545/,但是需要我们使用npx hardhat node命令启动本地节点

$ npx hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/

Accounts
========

WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.

Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

Account #1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000 ETH)
Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
$ npx hardhat run scripts/deploy.js --network localhost
Lock with 0.001ETH and unlock timestamp 1688291793 deployed to 0x5FbDB2315678afecb367f032d93F642f64180aa3

部署的后,在node节点上会打印相关的信息

eth_accounts
hardhat_metadata (20)
eth_blockNumber
eth_getBlockByNumber
eth_feeHistory
eth_sendTransaction
  Contract deployment: Lock
  Contract address:    0x5fbdb2315678afecb367f032d93f642f64180aa3
  Transaction:         0x8e2ef479bd412546f808857d5face604328e529b747b632a236161c4c03546e4
  From:                0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266
  Value:               0.001 ETH
  Gas used:            326112 of 30000000
  Block #1:            0x2ccccbce4394758f05491733af0758585ed067ff7f5fb1293ad9ad84b464db7a

eth_getTransactionByHash
eth_getTransactionReceipt
eth_blockNumber

hardhat有两个内置的网络,一个是hardhat,另一个就是上面提到的localhost,hardhat不能配置url,使用的是内置链,而localhost可以配置任意url进行覆盖,比如我们部署到Ganache链上,指定Ganache端口为7545,那我们可以这样配置

// hardhat.config.js
module.exports = {
  solidity: "0.8.18",
  networks: {
    localhost: {
      url: 'http://localhost:7545/'
    }
  }
};
$ npx hardhat run scripts/deploy.js --network localhost
Lock with 0.001ETH and unlock timestamp 1688292407 deployed to 0xa8233a432D5Ca4C011FBdc76DD476A55De08d08B

可以看到在Ganeche里面创建了合约,地址和控制台里输出的地址是相同的
e6afc8f7-41f6-438b-901c-17f43ba5adde-image.png

使用hardhat部署测试网合约

除了可以部署在hardhat内置链和Ganache,我们还可以部署到测试网上,部署到测试网我们需要先获取到连接测试网的url,可以在Infura或者Alchemy去申请。

然后我们可以在hardhat配置中进行配置,我这里使用Sepolia的测试网部署。在Alchemy中申请Sepolia测试网的url和API KEY。
0c29a8a3-53d6-4694-8845-ef9fca3c2171-image.png

同时我们还需要一个账号,确保里面有足够的币,否则无法部署成功,Sepolia测试网的币可以去这个sepoliafaucet.com水龙头获取,每天可以领0.5个eth。!!!请确保私钥不要暴露了!!!

有了这两个东西之后我们就可以修改hardhat的配置,如下

  • ALCHEMY_API_KEY从Alchemy申请,
const ALCHEMY_API_KEY = "zOWf......7XDj";
const account = '9adf......ed7c'

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.18",
  networks: {
    localhost: {
      url: 'http://localhost:7545/'
    },
    sepoliaTest: {
      url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`,
      accounts: [account]
    }
  }
};

然后我们进行部署

$ npx hardhat run scripts/deploy.js --network sepoliaTest
Lock with 0.001ETH and unlock timestamp 1688311413 deployed to 0x1C5B6228a81011F680e6a46aB433c72Ff761E0dC

部署的地址为 0x1C5B6228a81011F680e6a46aB433c72Ff761E0dC,我们可以去etherscan上看看合约有没有部署成功
f7aae224-f1ac-45c9-818c-37b69c3a4eb5-image.png

18059e71-283d-4146-9756-e75228826924-image.png

可以看到合约已经成功部署,是我们hardhat初始的Lock合约

主网和测试网的部署方式基本相同,也是按照这个配置来进行部署

verify源代码

当我们部署合约之后,我们需要上传源代码以供别人进行查看,别人会对你的代码进行审查,如果你的代码写的不好或者被找到bug,那么别人就不会用你的合约,你发行的代币将会没有任何价值,所以这一步是非常重要的。

细心的朋友就会发现,我们上面的Lock合约部署了,为什么会直接看到源代码呢,那是因为Lock合约已经verify过了,想同的合约,代码不发生任何变化,hash就不会变,就不需要重新verify了,部署之后就可以直接看到。

我们可以手动verify源代码,也可以通过hardhat进行。

手动verify

手动verify很简单,找到部署的合约地址,可以看到我们的Contract是不可读的,按照下面的步骤进行代码上传就行了。

但是有个问题是手动部署合约,只适用于部署单文件的合约,如果你的合约引用了 openzeppelin 的合约,那么你就需要一个一个手动传,非常麻烦,这里就不做演示了,按照下面一步一步来就可以了。

090658e1-005a-455b-af8c-4ae487aacf71-image.png
420b0d68-fd7f-4cea-b0ed-0a6b65573fdc-image.png
3c01250d-815a-4844-bd0c-4a5f2010f818-image.png

使用hardhat verify

假如我们的合约是,引用好了几个 openzeppelin 的包,这样手动上传就不合适了,因为 openzeppelin 的包还可以引用它里面其他的包,层层引用,手动verify十分低效

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract EchoCoin is ERC20 {
    constructor(
        string memory name_,
        string memory symbol_
    ) ERC20(name_, symbol_) {
        _mint(msg.sender, 100000000000000000000);
    }
}

先来部署下,下面是部署脚本,十分简单

// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// You can also run a script with `npx hardhat run <script>`. If you do that, Hardhat
// will compile your contracts, add the Hardhat Runtime Environment's members to the
// global scope, and execute the script.
const hre = require("hardhat");

async function main() {
  const EC = await hre.ethers.deployContract("EchoCoin", ["EchoCoin", "EC"]);

  await EC.waitForDeployment();

  console.log(`deployed to ${EC.target}`)

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

执行部署不成功,合约地址是0xDD9aE44307f47102fBd227B57c98e4d720C2339c,源代码并不可见。

$ npx hardhat run scripts/deploy.js  --network sepoliaTest
Compiled 1 Solidity file successfully
deployed to 0xDD9aE44307f47102fBd227B57c98e4d720C2339c

bf087bde-c7d5-4eb5-ad5c-03dfcdbb2c88-image.png

我们可以执行hardhat命令来进行verify

$
$ npx hardhat verify --contract contracts/EchoCoin.sol:EchoCoin 0xA3140E22B8252f46168c52A476EB89f8959Ad3de --network sepoliaTest

The contract 0xA3140E22B8252f46168c52A476EB89f8959Ad3de has already been verified.
https://sepolia.etherscan.io/address/0xA3140E22B8252f46168c52A476EB89f8959Ad3de#code

可以看到我们已经verify成功,并为我们打印出了合约代码的url地址,我们上去看一下,可以看到 openzeppelin 里的代码也帮我们上传了,不需要我们手动一个一个上传了。
60f1763b-606c-4981-b014-fa45f93958b7-image.png

还会为我们生成abi
6b4cd867-bc4f-4334-bdad-acb710b6b1d4-image.png

如果我们再重新部署一下这个合约,那么Contract源代码是直接可以看到的,因为我们合约没有改变过,新部署的合约地址0xaB2BB7058aF71A6616173448Ce25F416b24E2F03

$ npx hardhat run scripts/deploy.js  --network sepoliaTest

Compiled 1 Solidity file successfully
deployed to 0xaB2BB7058aF71A6616173448Ce25F416b24E2F03

2c9312a6-7bc7-49e2-a708-14403875927c-image.png

更多用发可以查看官方文档Verifying your contracts


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com