Fork 主网
本章学习如何在 Hardhat
中 Fork
主网进行测试。
hardhat
中 fork
主网的功能,是允许您在本地创建一个真实运行中的以太坊主网的副本。这个副本具有与主网相同的状态和数据,您可以与主网上的智能合约在本地进行交互和复杂的测试。
1. fork 主网的用途
a) 本地开发和测试
fork
主网使您能够在本地环境中进行开发和测试,而无需连接到实际的以太坊主网。这对于合约开发、智能合约的测试和调试非常有用。
b) 使用实际数据
fork
主网允许您使用实际的以太坊主网数据,包括账户余额、智能合约状态、以太坊交易等。这使得您可以在本地环境中模拟真实的交易和合约状态。
c) 无需真实的 ETH
您不需要在本地测试中使用真实的以太币 ETH
。fork
主网会模拟主网中的帐户和余额,因此您可以进行测试,而无需担心花费真实的 ETH
。
2. fork 主网的配置
您启动一个 fork
主网的 Hardhat Network
实例,需要修改配置文件 hardhat.config.js
的 networks
。
networks: { hardhat: { forking: { url: "https://eth-mainnet.alchemyapi.io/v2/<key>", } } }
配置文件中的参数解释:
url
:以太坊节点服务商 alchemy
或 infrua
的 json 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)
这与区块浏览器的查询结果一致。