{"content":{"title":"如何为测试分叉主网","body":"作者: MixBytes团队\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/17.jpg)\r\n\r\n## 简介\r\n\r\nDeFi 最令人兴奋的特点之一是互操作性，它允许使用已部署的智能合约作为构建协议的基础块（例如 Yearn Strategies）。事实上，互操作性是 DeFi 协议被称为乐高（legos）的原因之一。就像乐高积木一样，你必须找到将两个 DeFi 协议结合在一起以满足特定用例的正确方法。\r\n\r\n开发者有两种选择来测试与至少一个现有协议集成的智能合约：创建一个模拟实现所有必要功能的已部署智能合约，或使用主网分叉进行测试。模拟可能掩盖非常危险的问题，因为它们通常只复制来自真实合约的必要函数，这可能导致模拟在某些情况下的不正确工作。这就是为什么我们强烈建议仅在必要时使用模拟，在其他所有情况下你可以使用主网分叉。\r\n\r\n## 在 hardhat 中使用主网分叉的示例\r\n\r\n在本文中，我们将讨论如何为主网分叉设置你的 hardhat 项目。首先，你必须拥有 Infura 或 Alchemy API 密钥，以便能够使用 RPC 节点分叉特定区块的状态。在从其中一个 RPC 提供者处获取 API 密钥后，你需要像这样更改你的配置文件：\r\n\r\n```javascript\r\nconst CHAIN_IDS = {\r\n  hardhat: 31337, // hardhat 测试的链 ID\r\n};\r\nmodule.exports = {\r\n  networks: {\r\n    hardhat: {\r\n      chainId: CHAIN_IDS.hardhat,\r\n      forking: {\r\n        // 使用 Alchemy\r\n        url: `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_KEY}`, // RPC 节点的 URL，${ALCHEMY_KEY} - 必须是你的 API 密钥\r\n        // 使用 Infura\r\n        // url: `https://mainnet.infura.io/v3/${INFURA_KEY}`, // ${INFURA_KEY} - 必须是你的 API 密钥\r\n        blockNumber: 12821000, // 你想要处理的特定区块号\r\n      },\r\n    },\r\n    ... // 你还可以向配置中添加更多必要的信息\r\n  }\r\n}\r\n```\r\n\r\n在将此内容添加到你的 hardhat.config.js 文件后，你可以使用来自特定区块的所有必要信息。例如，你可以模拟一个地址，并使用来自随机地址的一些代币来测试你的函数（当你需要稀有 n 幻想以测试某个函数时，这非常有用），或者你可以只是通过将所需接口添加到项目中来调用任何合约的任何函数。以下示例中展示了一些在 hardhat 测试中使用主网分叉的技巧。\r\n\r\n```js\r\n// 允许将任何地址转换为可以在测试中签署交易的签名者的函数\r\nconst impersonateAddress = async (address) => {\r\n  const hre = require('hardhat');\r\n  await hre.network.provider.request({\r\n    method: 'hardhat_impersonateAccount',\r\n    params: [address],\r\n  });\r\n  const signer = await ethers.provider.getSigner(address);\r\n  signer.address = signer._address;\r\n  return signer;\r\n};\r\n// 在主网分叉中增加时间的函数\r\nasync function increaseTime(value) {\r\n  if (!ethers.BigNumber.isBigNumber(value)) {\r\n    value = ethers.BigNumber.from(value);\r\n  }\r\n  await ethers.provider.send('evm_increaseTime', [value.toNumber()]);\r\n  await ethers.provider.send('evm_mine');\r\n}\r\n// 根据其接口和区块链中的地址获取任何合约作为对象的构造函数\r\n// 需要注意的是，你必须将接口添加到你的项目中\r\nconst WETH = await ethers.getContractAt('IWETH', wethAddress);\r\n```\r\n\r\n## 结论\r\n\r\n到此为止，你已经学会了如何为测试分叉主网状态，以及如何通过接口与已部署的智能合约进行交互。关于审计师和开发者的更多实用工具，请查看我们即将发布的文章。\r\n\r\n### 附加阅读和教程\r\n\r\n[https://hardhat.org/getting-started/](https://hardhat.org/getting-started/)\r\n\r\n[https://infura.io/](https://infura.io/)\r\n\r\n[https://www.alchemy.com/](https://www.alchemy.com/)\r\n\r\n- 谁是 MixBytes?\r\n\r\n[MixBytes](https://mixbytes.io/) 是一个由专业区块链审计师和安全研究人员组成的团队，专注于为 EVM 兼容和基于 Substrate 的项目提供全面的智能合约审计和技术咨询服务。加入我们，关注 [X](https://twitter.com/MixBytes)，以获取最新的行业趋势和见解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/how-for...](https://mixbytes.io/blog/how-fork-mainnet-testing)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741493132,"version":1}