当你发布或升级一个包时,它的地址(也称为包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-NUMBER
是 1
,如果你从未升级过你的包。否则,它是一个大于 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 命令作为前端来操作这些值。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!