{"author":{"address":"0x56af91a252c1009c5a065eac15aa2ec9a278a0dd","user":"https://learnblockchain.cn/people/16052"},"content":{"body":"当你发布或升级一个包时，它的地址（也称为包ID）会被记录在 `Move.lock` 文件中。这个记录是自动完成的，因此你可以避免在 `Move.toml` 文件中手动记录或更新十六进制地址。\r\n\r\n当你在多个链（主网、测试网、开发网）上发布或升级包时，每个链的地址都会分别被记录。这种记录是基于你的活跃环境（如果不确定，可以运行 `sui client active-env`）。例如，如果你将活跃环境设置为连接到 `testnet` 的RPC并发布一个包，`Move.lock` 会记录该包的地址并将其与活跃环境（`testnet`）关联。\r\n\r\n请注意，自动地址管理适用于一个包发布到一个或多个链。当你发布或升级时，地址管理使用包的工作目录内容。如果一个包被重新发布到一个链，之前发布的包的地址会被覆盖。\r\n\r\n# 为已发布的包采用自动地址管理\r\n\r\n以前，`Move.toml` 文件中的 `published-at` 条目是**必需的**，用于设置最新发布包的地址。如果这些数据被记录在 `Move.lock` 文件中，则不再需要它。对于现有包，将必要的数据添加到 `Move.lock` 文件中，以便可以自动跟踪：\r\n\r\n- 切换到你的包发布所在链的活跃环境\r\n\r\n    ```\r\n    sui client --switch --env \u003cYOUR-CHAIN-ENVIRONMENT\u003e\r\n    ```\r\n\r\n- 使用已发布包的数据运行 `manage-package` 命令\r\n      \r\n    ```\r\n    sui move manage-package --environment \"$(sui client active-env)\" \\\r\n                --network-id \"$(sui client chain-identifier)\" \\\r\n                --original-id 'ORIGINAL-ADDRESS' \\\r\n                --latest-id 'LATEST-ADDRESS' \\\r\n                --version-number 'VERSION-NUMBER'\r\n    ```\r\n    \r\n     * `ORIGINAL-ADDRESS` 应该是你的包首次发布的地址。如果你从未升级过你的包，这个地址与 `Move.toml` 中的 `published-at` 地址相同。\r\n     * `LATEST-ADDRESS` 应该是最新的包地址。如果你从未升级过你的包，它与 `ORIGINAL-ADDRESS` 相同。如果你升级过你的包，这个地址与 `Move.toml` 中当前的 `published-at` 地址相同。\r\n     * `VERSION-NUMBER` 是 `1`，如果你从未升级过你的包。否则，它是一个大于 `1` 的数字，取决于你升级包的次数。在这种情况下，查找 `LATEST-ADDRESS` 处的包以确定版本号。\r\n- 删除 `Move.toml` 中的 `published-at` 行。\r\n- 在 `[addresses]` 部分将包的地址设置为 `0x0`。例如：\r\n\r\n```toml\r\n[package]\r\nname = \"Kiosk\"\r\n\r\n[dependencies]\r\n# ... 你的依赖项 ...\r\n\r\n[addresses]\r\nkiosk = \"0x0\"\r\n```\r\n\r\n你的包现在已被跟踪。你可以重复上述步骤来跟踪其他环境的地址。\r\n\r\n# 包升级指南\r\n当升级时，你需要检索已发布包的 UpgradeCap ID。自动地址管理不会跟踪你的 UpgradeCap。\r\n\r\n当升级时，你首先需要在 Move.toml 中将包的 [addresses] 值设置为 0x0，并在升级后用 ORIGINAL-ADDRESS 恢复其ID。\r\n\r\n# 故障排除\r\n当包数据状态不一致时，可能会发生已发布包地址冲突。\r\n\r\n例如，你可能有一个在 Move.toml 中有 published-at 值的现有包。该包为了测试目的被重新发布，现在在 Move.lock 中使用自动地址管理进行跟踪。Move.toml 和 Move.lock 中的地址现在不同，下次你尝试发布或升级包时会出现错误。\r\n\r\n以下是解决地址冲突的步骤：\r\n\r\n* 如果冲突在你维护的包中：\r\n\r\n* 如果不再需要此已发布地址，请删除 Move.toml 中的 published-at 值。然后在 [addresses] 部分将包的地址设置为 0x0。\r\n* 或者，按照步骤采用自动地址管理\r\n* 如果冲突在你不维护的包中（例如依赖项），请考虑使用上述步骤在本地修复问题，或联系维护者以进行上游更改。\r\n\r\n# 内部参考\r\n本节概述了 Move.lock 文件中跟踪地址的模式和内部操作。大多数开发人员不需要了解这些内部细节。这是为那些希望完全接口或控制内部状态跟踪的人提供的参考。\r\n\r\nMove.lock 文件中可能出现的模式和状态的具体示例：\r\n\r\n```toml\r\n[env]\r\n\r\n[env.testnet]\r\nchain-id = \"4c78adac\"\r\noriginal-published-id = \"0xa6041ac57f9151d49d00dcdc4f79f8c5ba1e399e1005dcb0fdd1c8632020d5a6\"\r\nlatest-published-id = \"0xa6041ac57f9151d49d00dcdc4f79f8c5ba1e399e1005dcb0fdd1c8632020d5a6\"\r\npublished-version = \"1\"\r\n\r\n[env.mainnet]\r\nchain-id = \"35834a8a\"\r\noriginal-published-id = \"0xaee5759aedf6c533634cdd2de412f6e6dfc754a89b0ec554a73597348f334477\"\r\nlatest-published-id = \"0xaee5759aedf6c533634cdd2de412f6e6dfc754a89b0ec554a73597348f334477\"\r\npublished-version = \"1\"\r\n```\r\n\r\n* [env] 表包含每个环境的条目。当包为活跃环境发布时，会添加或更新一个条目。\r\n\r\n* 条目是基于环境的 chain-id 添加或更新的。也就是说，地址是按 chain-id 键入的，而不是 [env.NAME] 部分。这是为了使包及其依赖项通过链标识符规范地解析：按 [env.NAME] 键入在用户可以选择任意环境 NAME 别名时并不可靠。\r\n\r\n* 键值条目对应于采用自动地址管理中解释的数据。使用 sui move manage-package 命令作为前端来操作这些值。","title":"Sui: 包地址自动管理"},"history":null,"timestamp":1735312055,"version":1}