网络文件

OpenZeppelin Hardhat Upgrades 默认会跟踪你部署的所有合约版本,并将其保存在项目根目录下的 .openzeppelin 文件夹中。你会在那里找到每个网络对应的一个文件。建议你将除开发网络之外的所有网络的文件提交到源代码控制中(你可能会看到它们为 .openzeppelin/unknown-*.json)。

.openzeppelin 文件夹中文件的格式与 OpenZeppelin CLI 的格式不兼容。 如果你想将这些插件用于现有的 OpenZeppelin CLI 项目,你必须先迁移它。 有关说明,请参阅 从 CLI 迁移

<network_name>.json

OpenZeppelin Hardhat Upgrades 将为你工作的每个网络(mainnetsepolia 等)生成一个文件。 这些文件具有相同的结构:

// .openzeppelin/<network_name>.json
{
  "manifestVersion": "3.0",
  "impls": {
    "...": {
      "address": "...",
      "txHash": "...",
      "layout": {
        "storage": [...],
        "types": {...}
      }
    },
    "...": {
      "address": "...",
      "txHash": "...",
      "layout": {
        "storage": [...],
        "types": {...}
      }
    }
  }
}

对于每个逻辑合约,除了部署地址之外,还会跟踪以下信息:

  • types 跟踪合约或其祖先中使用的所有类型,从 uint256 等基本类型到自定义 struct 类型

  • storage 跟踪线性化合约的存储布局,引用 types 部分中定义的类型,并用于验证任何 后续版本之间的存储布局更改是否兼容

文件的命名将是 <network_name>.json,但请注意 <network_name> 不是从 Hardhat 配置文件中网络的条目名称中获取的,而是从与该条目关联的链 ID 推断出来的。

公共链的数量有限; 未在列表中的链(例如 Ethereum Classic)将具有名为 unknown-<chain_id>.json 的网络文件。

版本控制中的配置文件

应该在版本控制中跟踪公共网络文件,例如 mainnet.jsonsepolia.json。 这些文件包含有关项目在相应网络中的状态的宝贵信息,例如已部署的合约版本的地址。 对于项目的所有贡献者来说,这些文件应该是相同的。

如果 Hardhat 插件不知道网络名称,网络文件也可能显示为 unknown-<chain_id>.json。 如果链 ID 对应于公共网络,那么也应该在版本控制中对其进行跟踪。 但是,如果链 ID 用于临时本地网络(例如开发网络),那么它仅与项目的单个贡献者相关,并且不应在版本控制中进行跟踪。

临时文件

使用 Hardhat 2.12.3 或更高版本的 Hardhat 开发网络,以及从 Hardhat 连接的 Anvil 开发网络,会将网络文件写入操作系统临时目录下的 openzeppelin-upgrades 文件夹中。 这些文件名为 hardhat-<chain_id>-<instance_id>.jsonanvil-<chain_id>-<instance_id>.json,其中 <instance_id> 是一个以 0x 为前缀的十六进制 ID,用于唯一标识 Hardhat 或 Anvil 网络的实例/运行。 当相应的 Hardhat 或 Anvil 网络实例不再处于活动状态时(例如在测试完成后),可以安全地删除此临时文件夹中的文件。

你可以通过执行以下操作来确定临时网络文件的位置:

  1. 运行 export DEBUG=@openzeppelin:* 以启用调试日志记录。

  2. 运行你的 Hardhat 测试或脚本。

  3. 找到包含文本 development manifest file: 的日志消息。

自定义网络文件位置

要自定义 .openzeppelin 文件夹的位置,请将 MANIFEST_DEFAULT_DIR 环境变量设置为绝对路径或相对于项目根目录的路径。 此变量允许你指定不同的目录来存储网络文件,使你能够在不同环境中将相同的合约部署到相同的网络而不会发生冲突。 这可以与专用网络一起使用,以避免链 ID 冲突。

例如:

  • 运行 export MANIFEST_DEFAULT_DIR=.openzeppelin/tests 以将 OpenZeppelin Hardhat Upgrades 配置为使用 .openzeppelin/tests/<network_name>.json 进行测试部署。

  • 运行 export MANIFEST_DEFAULT_DIR=.openzeppelin/production 以将 OpenZeppelin Hardhat Upgrades 配置为使用 .openzeppelin/production/<network_name>.json 进行生产部署。