合约升级

合约升级的本质

在之前课程的实践中,你会发现发布的合约 package 是不可变的 object, 不可撤回也无法修改。智能合约升级的本质是在新的地址上重新发布更新的合约,并且把旧版合约的数据迁移过去。

可以升级的内容

升级合约时做的代码修改需要满足以下条件:

  • 现有的 public 函数的输入输出参数格式保持不变
  • 可以添加新的 struct 和 函数
  • 可以给现有的 struct 添加新的能力
  • 可以把现有函数中对范型参数的约束去掉
  • 可以改变函数的实现
  • 可以修改非 public 函数的输入输出参数格式,包括 friendentry 函数
  • 可以让非 public 函数变为 public 函数

注意

init 函数

init 函数只会在第一次发布合约时执行,后面升级合约时不会再次执行。

升级合约不会自动更新依赖

假定你的 package 有依赖一个外部的 package, 当所依赖 package 升级合约时,你的 package 不会自动把依赖关系调整为所依赖 package 升级后的合约地址,您必须明确地升级自己的 package, 以指向新的依赖项。