11I 以太坊 ethereum hardhat : 分叉其他网络

从主网分叉
固定一个块
自定义 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 : [email protected]

猜你喜欢

转载自blog.csdn.net/wx468116118/article/details/126025634