Skip to main content

包的升级

在 Sui 上的 Move 包包括一个或多个定义该包与链上对象交互的模块。你使用 Move 开发这些模块的逻辑,然后将其编译成对象。最后,你将包对象发布到 Sui 网络上。在链上,任何人都可以查看你的包内容以及它使用的逻辑来操作其他链上对象,通过 Sui 网络资源浏览器。

包是不可变的

在将包对象发布到网络上之后,它将永远存在。你无法直接更改链上包对象的代码。在包对象出现在链上之后,其他包可以使用原始包提供的模块。撇开恶意行为者,想象一下如果有人更改了他们链上包中的逻辑以纠正在开发过程中被忽视的意外行为,这将引发连锁反应,更改了每个使用该模块的包的逻辑,可能是开发人员从未打算的方式。

升级包

尽管无法直接操作链上包,但你确实有升级它们的能力。升级链上包提供了一种改进代码或添加功能而不影响使用原始包的包的方法。当你升级包时,你是在链上创建一个新对象,而不是修改原始包。请参阅升级包以了解更多有关该过程的信息。

使用 Sui Client CLI 升级包

Sui Client CLIupgrade 命令为你提供了一种途径,可以在 CLI 活跃地址拥有与这些包相关联的 UpgradeCap 对象时升级包。

使用 Sui CLI 对于开始升级或包开发的早期阶段非常有用,但使用单个密钥保护链上包的升级能力可能会因以下几个原因而带来安全风险:

  • 拥有密钥的实体可能会进行更改,这些更改可能符合他们自己的利益,但不一定符合广大社区的利益。
  • 包的升级可能在没有给用户足够时间讨论,或在不同意时停用该包的情况下发生。
  • 密钥有可能丢失。

使包不可变

你可以在上线时通过使用 Move 的 sui::package::make_immutable 函数销毁其 UpgradeCap 来使包 不可变,以减轻单个密钥风险。然而,使包不可变会阻止未来的错误修复和新功能,这可能并不实际或不受欢迎。

要在链上保护你的包免受单个密钥风险,请参阅自定义升级策略