01 导语
02 Upgrade API 使用方法
from ontology.interop.Ontology.Contract import Migrate
from ontology.interop.System.Contract import Destroy
2.1 Destroy API
from ontology.interop.System.Contract import Destroy
from ontology.interop.System.Runtime import Notify
def Main(operation, args):
if operation == “destroy_contract”:
return destroy_contract()
return False
def destroy_contract():
Destroy() # 调用destroy 销毁此合约
Notify([“The contract has been destoryed”])
return True
在 SmartX 上可以看到该示例代码的运行结果:
- 将以上代码粘贴至 SmartX 编译并部署;
- 再次点击部署会弹出「合约部署失败,该合约已经部署过」,因为链上已经存在相同合约;
3. 运行 destroy_contract 函数销毁合约;
4. 再次点击部署合约,会发现合约可以再次部署,不会再弹出「合约部署失败,该合约已经部署过」。这可以证明原先合约已经在链上被销毁。
2.2 Migrate API
同样,我们给出使用 Migrate 函数的合约示例代码:
-
from ontology.interop.Ontology.Contract import Migrate from ontology.interop.System.Runtime import Notify from ontology.libont import AddressFromVmCode
def Main(operation, args): if operation == “migrate_contract”: if len(args) != 7: return False avm_code = args[0] need_storage = args[1] name = args[2] version = args[3] author = args[4] email = args[5] description = args[6] return migrate_contract(avm_code, need_storage, name, version, author, email, description)
return False
def migrate_contract(avm_code, need_storage, name, version, author, email, description): res = Migrate(avm_code, need_storage, name, version, author, email, description) # 调用Migrate 迁移此合约 if res: Notify([“Migrate successfully”]) new_contract_hash=AddressFromVmCode(avm_code) # 计算新合约地址 Notify(new_contract_hash) # 打印出新合约地址 return True else: return False
在 SmartX 上可以看到该示例代码的运行结果: - 将以上代码粘贴至 SmartX 编译,填入参数。参数填入时需要特别注意以下两点:a. 要确认 avm_code 在链上不存在,不然会报错;b. Migrate 需要较高的 gas limit,所以运行函数时要调整 gas limit。