Titanium系列视频10 | 验证容器升级的Candid和Motoko稳定可变类型的安全性
本期概要
这篇文章向您展示了有关验证安全容器升级的新功能。
验证容器升级的类型安全性
升级容器可能很危险。 例如,如果您更改Public方法的方法名称或Public方法的接口,则依赖于您的容器的其他服务可能会中断。如果您以不兼容的方式更改稳定变量类型,在升级之后,稳定状态的数据可能会丢失,这是我们非常不愿意看到的。 对于 Motoko,我们承诺在尝试升级之前静态检查此属性,以确保容器升级不会破坏任何现有服务,并且升级后数据将被保留。
当编译您的代码时,将生成候选接口文件和 Motoko 稳定类型签名文件,然后会将这两个接口作为元数据存储到 wasm 模块中。当您在 dfx 中部署新容器时,dfx 将在 chian 上获取此元数据,并将这些接口与您的新版本的兼容性进行比较。如果它检测到任何不兼容的东西,它会警告用户潜在的问题。这目前仅适用于 Motoko,Rust 支持即将推出。
示 例
代码首先定义了一个整数类型的稳定变量计数器,将它初始化为零,然后添加一个新的增量方法将计数器加一并返回当前值。
现在部署这个容器。在录制此文件时,DFINITY 尚未发布支持此功能的 dfx 二进制文件,因此这里使用自定义构建,但它应该很快就会可用。在部署好之后,就可以像往常一样调用容器并调用计数器。
尝试升级容器并将方法名称从 inc 更改为inc2。现在效果将检测到破坏性更改,系统显示方法 inc 在以前的版本中,如果其他一些容器依赖此方法,它的丢失会破坏其他容器的服务。它会就此向您发出警告。
如果您已经清楚警告的内容也可以继续升级。然后现在将会调用新方法 inc2 而不是调用 inc。
现在尝试进行另一次升级。这次假设要将稳定变量的类型从整数更改为 Nat 类型,我们希望在升级后保留计数器值。当再次尝试部署它时,会检测到一个关于稳定变量类型不兼容的新警告。因为在以前的版本中,我们使用的是整数类型,而现在它是 Nat,这可能会导致数据丢失。因为一般来说,整数类型可能是负值。如果它是负值,那么您无法转换为 Nat 类型。所以这是警告这种类型的改变是不安全的。
您仍然可以升级它,但最终结果是计数器值将丢失,它将重新初始化为零,因为它无法安全地将整数转换为 Nat。例如,如果我再次调用 inc2 方法,那么计数器将重置为零。
此功能将在 dfx 版本中提供。它还开辟了许多有趣的用例,例如自动呈现和类型检查消息,因为现在可以将这些签名作为元数据的一部分嵌入到容器中。期待在这条线上有更多令人兴奋的功能。
小助手微信号
入群请添加
联系我们
ICPL 官网
https://icpl.app
ICPL Twitter
https://twitter.com/icpleague_com
ICPL Medium
https://medium.com/icp-league
ICPL Telegram
https://t.me/ICPL_en
ICPL 论坛
https://icpleague.com