• 从主网分叉
• 固定一个块
• 自定义 HTTP 标头
• 模拟账户
• 重置分叉
• 使用自定义硬分叉历史
• hardhat Tutorials , hardhat 教程
• Contact 联系方式
• 从主网分叉
尝试此功能的最简单方法是从命令行启动一个节点:
npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/<key>
您还可以将 Hardhat Network 配置为始终执行此操作:
networks: {
hardhat: {
forking: {
url: "https://eth-mainnet.alchemyapi.io/v2/<key>",
}
}
}
(请注意,您需要将 URL 的 <key>
组件替换为您的个人 Alchemy API 密钥。)
通过访问主网上存在的任何状态,Hardhat Network 将提取数据并透明地公开它,就好像它在本地可用一样。
• 固定一个块
Hardhat Network 将默认从最新的主网块分叉。虽然根据上下文这可能是实用的,但要设置依赖于分叉的测试套件,我们建议从特定的块号分叉。
有两个原因:
- 您的测试运行的状态可能会在运行之间发生变化。这可能会导致您的测试或脚本表现不同。
- 固定启用缓存。每次从主网获取数据时,Hardhat Network 都会将其缓存在磁盘上以加快未来的访问速度。如果您不固定该块,则每个新块都会有新数据,并且缓存将无用。我们用块固定测量了高达 20 倍的速度提升。
您需要访问具有存档数据的节点才能使其正常工作。 这就是我们推荐 [Alchemy] 的原因,因为他们的免费计划包括存档数据。
要固定块编号:
networks: {
hardhat: {
forking: {
url: "https://eth-mainnet.alchemyapi.io/v2/<key>",
blockNumber: 14390000
}
}
}
如果您使用的是 node
任务,还可以使用 --fork-block-number
标志指定块号:
npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/<key> --fork-block-number 14390000
• 自定义 HTTP 标头
您可以添加额外的 HTTP 标头,这些标头将用于对分叉节点的任何请求。这样做的一个原因是为了授权:您可以通过自定义 HTTP 标头使用不记名令牌,而不是在 URL 中包含您的凭据:
networks: {
hardhat: {
forking: {
url: "https://ethnode.example.com",
httpHeaders: {
"Authorization": "Bearer <key>"
}
}
}
}
• 模拟账户
Hardhat Network 允许您冒充任何地址。即使您无权访问其私钥,这也使您可以从该帐户发送交易。
最简单的方法是使用 ethers.getImpersonatedSigner
方法,该方法由 hardhat-ethers
插件添加到 ethers
对象中:
const impersonatedSigner = await ethers.getImpersonatedSigner("0x1234567890123456789012345678901234567890");
await impersonatedSigner.sendTransaction(...);
或者,您可以使用 impersonateAccount
帮助器,然后获取该地址的签名者:
const helpers = require("@nomicfoundation/hardhat-network-helpers");
const address = "0x1234567890123456789012345678901234567890";
await helpers.impersonateAccount(address);
const impersonatedSigner = await ethers.getSigner(address);
• 重置分叉
您可以在运行时操纵分叉以重置回新的分叉状态,从另一个块号分叉或通过调用 hardhat_reset
禁用分叉:
await network.provider.request({
method: "hardhat_reset",
params: [
{
forking: {
jsonRpcUrl: "https://eth-mainnet.alchemyapi.io/v2/<key>",
blockNumber: 14390000,
},
},
],
});
您可以通过传递空参数来禁用分叉:
await network.provider.request({
method: "hardhat_reset",
params: [],
});
这将重置安全帽网络,以 此处 描述的状态启动一个新实例。
• 使用自定义硬分叉历史
如果你正在分叉一个不寻常的网络,并且如果你想在从该网络检索到的历史区块的上下文中执行 EVM 代码,那么你需要配置 Hardhat Network 以了解哪些硬分叉应用于哪些区块。 (如果您要分叉一个知名网络,Hardhat Network 将根据已知的公共网络历史自动选择正确的硬分叉来执行您的 EVM 代码,因此您可以放心地忽略此部分。)
要为您的自定义链提供硬分叉激活历史记录,请使用“networks.hardhat.chains”配置字段:
networks: {
hardhat: {
chains: {
99: {
hardforkHistory: {
berlin: 10000000,
london: 20000000,
},
}
}
}
}
在这种情况下,“历史区块”是指其编号在您从中分叉的区块之前的区块。如果您尝试在历史块的上下文中运行代码,without 具有硬分叉历史,则会引发错误。大多数公共网络的已知硬分叉历史被假定为默认值。
如果您在 non-historical 块的上下文中运行代码,那么 Hardhat Network 将简单地使用其配置中的 hardfork
字段指定的硬分叉,例如 networks: { hardhat: { hardfork: "london" } }
,而不是咨询硬分叉历史配置。
另请参阅 Hardhat Network 配置参考中的 chains
条目。
• hardhat Tutorials , hardhat 教程
CN 中文 Github hardhat 教程 : github.com/565ee/hardhat_CN
CN 中文 CSDN hardhat 教程 : blog.csdn.net/wx468116118
EN 英文 Github hardhat Tutorials : github.com/565ee/hardhat_EN
• Contact 联系方式
Homepage : 565.ee
微信公众号 : wx468116118
微信 QQ : 468116118
GitHub : github.com/565ee
CSDN : blog.csdn.net/wx468116118
Email : 468116118@qq.com