Sui: 包地址自动管理

  • King
  • 更新于 2024-12-27 23:07
  • 阅读 548

当你发布或升级一个包时,它的地址(也称为包ID)会被记录在Move.lock文件中。这个记录是自动完成的,因此你可以避免在Move.toml文件中手动记录或更新十六进制地址。当你在多个链(主网、测试网、开发网)上发布或升级包时,每个链的地址都会分别被记录。这种记录是基于你的活跃环境(如果不

当你发布或升级一个包时,它的地址(也称为包ID)会被记录在 Move.lock 文件中。这个记录是自动完成的,因此你可以避免在 Move.toml 文件中手动记录或更新十六进制地址。

当你在多个链(主网、测试网、开发网)上发布或升级包时,每个链的地址都会分别被记录。这种记录是基于你的活跃环境(如果不确定,可以运行 sui client active-env)。例如,如果你将活跃环境设置为连接到 testnet 的RPC并发布一个包,Move.lock 会记录该包的地址并将其与活跃环境(testnet)关联。

请注意,自动地址管理适用于一个包发布到一个或多个链。当你发布或升级时,地址管理使用包的工作目录内容。如果一个包被重新发布到一个链,之前发布的包的地址会被覆盖。

为已发布的包采用自动地址管理

以前,Move.toml 文件中的 published-at 条目是必需的,用于设置最新发布包的地址。如果这些数据被记录在 Move.lock 文件中,则不再需要它。对于现有包,将必要的数据添加到 Move.lock 文件中,以便可以自动跟踪:

  • 切换到你的包发布所在链的活跃环境

    sui client --switch --env <YOUR-CHAIN-ENVIRONMENT>
  • 使用已发布包的数据运行 manage-package 命令

    sui move manage-package --environment "$(sui client active-env)" \
                --network-id "$(sui client chain-identifier)" \
                --original-id 'ORIGINAL-ADDRESS' \
                --latest-id 'LATEST-ADDRESS' \
                --version-number 'VERSION-NUMBER'
    • ORIGINAL-ADDRESS 应该是你的包首次发布的地址。如果你从未升级过你的包,这个地址与 Move.toml 中的 published-at 地址相同。
    • LATEST-ADDRESS 应该是最新的包地址。如果你从未升级过你的包,它与 ORIGINAL-ADDRESS 相同。如果你升级过你的包,这个地址与 Move.toml 中当前的 published-at 地址相同。
    • VERSION-NUMBER1,如果你从未升级过你的包。否则,它是一个大于 1 的数字,取决于你升级包的次数。在这种情况下,查找 LATEST-ADDRESS 处的包以确定版本号。
  • 删除 Move.toml 中的 published-at 行。

  • [addresses] 部分将包的地址设置为 0x0。例如:

[package]
name = "Kiosk"

[dependencies]
# ... 你的依赖项 ...

[addresses]
kiosk = "0x0"

你的包现在已被跟踪。你可以重复上述步骤来跟踪其他环境的地址。

包升级指南

当升级时,你需要检索已发布包的 UpgradeCap ID。自动地址管理不会跟踪你的 UpgradeCap。

当升级时,你首先需要在 Move.toml 中将包的 [addresses] 值设置为 0x0,并在升级后用 ORIGINAL-ADDRESS 恢复其ID。

故障排除

当包数据状态不一致时,可能会发生已发布包地址冲突。

例如,你可能有一个在 Move.toml 中有 published-at 值的现有包。该包为了测试目的被重新发布,现在在 Move.lock 中使用自动地址管理进行跟踪。Move.toml 和 Move.lock 中的地址现在不同,下次你尝试发布或升级包时会出现错误。

以下是解决地址冲突的步骤:

  • 如果冲突在你维护的包中:

  • 如果不再需要此已发布地址,请删除 Move.toml 中的 published-at 值。然后在 [addresses] 部分将包的地址设置为 0x0。

  • 或者,按照步骤采用自动地址管理

  • 如果冲突在你不维护的包中(例如依赖项),请考虑使用上述步骤在本地修复问题,或联系维护者以进行上游更改。

内部参考

本节概述了 Move.lock 文件中跟踪地址的模式和内部操作。大多数开发人员不需要了解这些内部细节。这是为那些希望完全接口或控制内部状态跟踪的人提供的参考。

Move.lock 文件中可能出现的模式和状态的具体示例:

[env]

[env.testnet]
chain-id = "4c78adac"
original-published-id = "0xa6041ac57f9151d49d00dcdc4f79f8c5ba1e399e1005dcb0fdd1c8632020d5a6"
latest-published-id = "0xa6041ac57f9151d49d00dcdc4f79f8c5ba1e399e1005dcb0fdd1c8632020d5a6"
published-version = "1"

[env.mainnet]
chain-id = "35834a8a"
original-published-id = "0xaee5759aedf6c533634cdd2de412f6e6dfc754a89b0ec554a73597348f334477"
latest-published-id = "0xaee5759aedf6c533634cdd2de412f6e6dfc754a89b0ec554a73597348f334477"
published-version = "1"
  • [env] 表包含每个环境的条目。当包为活跃环境发布时,会添加或更新一个条目。

  • 条目是基于环境的 chain-id 添加或更新的。也就是说,地址是按 chain-id 键入的,而不是 [env.NAME] 部分。这是为了使包及其依赖项通过链标识符规范地解析:按 [env.NAME] 键入在用户可以选择任意环境 NAME 别名时并不可靠。

  • 键值条目对应于采用自动地址管理中解释的数据。使用 sui move manage-package 命令作为前端来操作这些值。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
King
King
0x56af...a0dd
擅长Rust/Solidity/FunC/Move开发