合约升级
合约升级的本质
在之前课程的实践中,你会发现发布的合约 package 是不可变的 object, 不可撤回也无法修改。智能合约升级的本质是在新的地址上重新发布更新的合约,并且把旧版合约的数据迁移过去。
可以升级的内容
升级合约时做的代码修改需要满足以下条件:
- 现有的
public
函数的输入输出参数格式保持不变 - 可以添加新的
struct
和 函数 - 可以给现有的
struct
添加新的能力 - 可以把现有函数中对范型参数的约束去掉
- 可以改变函数的实现
- 可以修改非
public
函数的输入输出参数格式,包括friend
和entry
函数 - 可以让非
public
函数变为public
函数
注意
init 函数
init 函数只会在第一次发布合约时执行,后面升级合约时不会再次执行。
升级合约不会自动更新依赖
假定你的 package 有依赖一个外部的 package, 当所依赖 package 升级合约时,你的 package 不会自动把依赖关系调整为所依赖 package 升级后的合约地址,您必须明确地升级自己的 package, 以指向新的依赖项。