本文介绍了OpenZeppelin Hardhat Upgrades插件如何通过.openzeppelin
文件夹中的网络文件来跟踪已部署的合约版本。
OpenZeppelin Hardhat Upgrades 默认会跟踪你已部署的所有合约版本,并将其保存在项目根目录下的 .openzeppelin
文件夹中。你会在那里找到每个网络对应的文件。建议你将除开发网络之外的所有网络的这些文件提交到源代码控制中(你可能会看到它们是 .openzeppelin/unknown-*.json
)。
.openzeppelin 文件夹中文件的格式与 OpenZeppelin CLI 的格式不兼容。 如果你想将这些插件用于现有的 OpenZeppelin CLI 项目,你必须先迁移它。 有关说明,请参阅 从 CLI 迁移。 |
<network_name>.json
OpenZeppelin Hardhat Upgrades 将为你使用的每个网络生成一个文件 ( mainnet
、sepolia
等)。 这些文件具有相同的结构:
// .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 配置文件中网络的条目名称,而是从与该条目关联的 chain id 推断出来的。
公共链的数量有限; 不在列表中的链(如 Ethereum Classic)的网络文件将命名为 unknown-<chain_id>.json
。
诸如 mainnet.json
或 sepolia.json
之类的公共网络文件应在版本控制中进行跟踪。 这些文件包含有关你的项目在相应网络中的状态的宝贵信息,例如已部署的合约版本的地址。 对于项目的所有贡献者来说,此类文件应该是相同的。
如果 Hardhat 插件不知道网络名称,则网络文件也可能显示为 unknown-<chain_id>.json
。 如果 chain ID 对应于公共网络,则也应在版本控制中对其进行跟踪。 但是,如果 chain ID 针对临时本地网络(例如开发网络),则它仅与项目的单个贡献者相关,并且不应在版本控制中进行跟踪。
使用 Hardhat 2.12.3 或更高版本的 Hardhat 开发网络,以及从 Hardhat 连接的 Anvil 开发网络,会将网络文件写入操作系统临时目录下的 openzeppelin-upgrades
文件夹。 这些文件名为 hardhat-<chain_id>-<instance_id>.json
或 anvil-<chain_id>-<instance_id>.json
,其中 <instance_id>
是一个以 0x 为前缀的十六进制 ID,可唯一标识 Hardhat 或 Anvil 网络的实例/运行。 当其相应的 Hardhat 或 Anvil 网络实例不再处于活动状态时(例如,在测试完成后),可以安全地删除此临时文件夹中的文件。
你可以通过执行以下操作来确定临时网络文件的位置:
运行 export DEBUG=@openzeppelin:*
以启用调试日志记录。
运行你的 Hardhat 测试或脚本。
查找包含文本 development manifest file:
的日志消息。
要自定义 .openzeppelin
文件夹的位置,请将 MANIFEST_DEFAULT_DIR
环境变量设置为绝对路径或相对于项目根目录的路径。 此变量允许你指定用于存储网络文件的不同目录,从而使你能够在不同环境下将相同的合约部署到相同的网络,而不会发生冲突。 这可以与私有网络结合使用,以避免 chain 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
。
- 原文链接: docs.openzeppelin.com/up...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!