在上一期的技術視點中,我們介紹了合約原生 API,講述瞭如何利用智慧合約進行ONT / ONG 轉賬。本期我們將討論如何透過 Upgrade API 來進行合約升級。合約升級共有2個 API,分別為 Destroy 和 Migrate。其用法如下:
下面我們具體講述一下這兩個 API 的使用方法。在這之前,小夥伴們可以在本體智慧合約開發工具 SmartX 中新建一個合約,跟著我們進行操作。跟以前的 API 講解一樣,在文章最後我們將給出這次講解的影片示例。
2. Upgrade API 使用方法
使用這兩個函式前需要引入。下面兩條語句分別引入了 Migrate 和 Destroy 這兩個函式。
from ontology.interop.Ontology.Contract import Migrate
from ontology.interop.System.Contract import Destroy
2.1 Destroy API
Destroy API 用於銷燬合約,舊合約將會在鏈上被刪除。下面是使用該 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 API 用於遷移合約, 舊合約將會被新合約取代,舊合約中的資料也將自動遷移到新合約。遷移資料量越大,遷移費用越高。遷移成功後,舊合約會被刪除。
特別注意:合約中的資產不會被自動遷移,需要提前轉走。否則該合約中的資產將無法取回,相當於被轉入黑洞地址。
Migrate 函式的傳入引數列表如下:
同樣,我們給出使用 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 上可以看到該示例程式碼的執行結果:
1. 將以上程式碼貼上至 SmartX 編譯,填入引數。引數填入時需要特別注意以下兩點:
a. 要確認 avm_code 在鏈上不存在,不然會報錯;
b. Migrate 需要較高的 gas limit,所以執行函式時要調整 gas limit。
2. 部署成功後,可以從控制檯拿到新的合約雜湊。該示例中,be4606c4663081b70f745ed9fc64d4c3b0d9c183 即為新的合約雜湊。
3. 結論
本次技術視點中我們介紹了本體區塊鏈的 Upgrade API,開發者可以用來進行合約升級。合約升級共有2個 API,其中 Destroy API 用於銷燬合約,Migrate API 用於遷移合約。希望教程會對大家有幫助。下一期我們將介紹本體 Python 智慧合約語法的 Static & Dynamic Call API,講述如何在 Python 智慧合約中進行靜態呼叫和動態呼叫。以下為本期教程的中文影片,歡迎小夥伴們觀看學習。