Fork 主网

本章学习如何在 HardhatFork 主网进行测试。

推特@Hita_DAO    DiscordHitaDAO

hardhatfork 主网的功能,是允许您在本地创建一个真实运行中的以太坊主网的副本。这个副本具有与主网相同的状态和数据,您可以与主网上的智能合约在本地进行交互和复杂的测试。

1.  fork 主网的用途

a) 本地开发和测试

fork 主网使您能够在本地环境中进行开发和测试,而无需连接到实际的以太坊主网。这对于合约开发、智能合约的测试和调试非常有用。

b) 使用实际数据

fork 主网允许您使用实际的以太坊主网数据,包括账户余额、智能合约状态、以太坊交易等。这使得您可以在本地环境中模拟真实的交易和合约状态。

c) 无需真实的 ETH

您不需要在本地测试中使用真实的以太币 ETHfork 主网会模拟主网中的帐户和余额,因此您可以进行测试,而无需担心花费真实的 ETH

2.  fork 主网的配置

您启动一个 fork 主网的 Hardhat Network 实例,需要修改配置文件 hardhat.config.jsnetworks

networks: {
  hardhat: {
     forking: {
      url: "https://eth-mainnet.alchemyapi.io/v2/<key>",
    }
  }
}

配置文件中的参数解释:

url:以太坊节点服务商 alchemyinfruajson rpc 链接。 

<key>:在 alchemy 或者 infrua 中申请的 api key。建议您申请使用 alchemy 的节点服务,它在各方面的体验好于 infrua

一个完整的配置文件 hardhat.config.js,内容如下:

require("@nomicfoundation/hardhat-toolbox");
module.exports = {
  solidity: "0.8.19",

  networks: {
     hardhat: {
       forking: {
        url: "https://eth-mainnet.alchemyapi.io/v2/N8_DnBwdYPahNzdsWCehSIFd1oxxxxxx",
      }
    }
  }
};

3. fork 主网的使用

我们完成配置文件 hardhat.config.js 的修改后,就可以使用 fork 主网了。

比如,将项目合约部署到 fork 主网:

npx hardhat run scripts/deploy.js

或者在 fork 主网上进行自动化测试:

npx hardhat test

比如,查看以太坊主网上币安的一个钱包地址 0x28C6c06298d514Db089934071355E5743bf21d60 的余额,智能合约代码如下:

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

contract HardhatFork {
  function getBalance() external view returns(uint256){
   return address(0x28C6c06298d514Db089934071355E5743bf21d60).balance;
  }
}

测试脚本代码:

const { expect } = require("chai");

describe("HardhatFork Contract", async function () {
  async function deployHardhatFork() {
    const HardhatFork = await ethers.getContractFactory("HardhatFork");
    const hardhatFork = await HardhatFork.deploy();
    return {hardhatFork};
  };

  it("get Binance account", async function () {
    const {hardhatFork} = await deployHardhatFork();
    const result = await hardhatFork.getBalance();
    console.log("balance: ",result)
  });
});

运行命令:

npx hardhat test

输出结果:

  HardhatFork Contract
balance:  111589213596024268759829n
    ✔ get Binance account (6309ms)
  1 passing (6s)

这与区块浏览器的查询结果一致。