本體技術視點 | Python跨合約靜態呼叫是如何實現的?

買賣虛擬貨幣
1. 導語

上一期我們介紹了合約升級 API,講述瞭如何銷燬和遷移智慧合約。本期我們討論如何跨合約靜態呼叫。API 只有一個,用法如下:

下面我們具體講述一下這個 API 的使用方法。在這之前,小夥伴們可以在本體智慧合約開發工具 SmartX 中新建一個合約,跟著我們進行操作。同樣,在文章中我們將給出這次講解的所有原始碼以及影片講解。

2. RegisterAppCall 使用方法

使用 RegisterAppCall 函式前同樣需要引入,可以透過下面的語句實現:

from ontology.interop.System.App import RegisterAppCall

RegisterAppCall API 有三個引數。分別對應目標合約、目標方法和方法需要的引數。我們準備兩個智慧合約——合約 A 與合約 B。接下來我們透過合約 A 來靜態呼叫合約 B 的功能函式。

合約 A 的程式碼如下:

from ontology.interop.System.App import RegisterAppCall
from ontology.interop.System.Runtime import Notify

HelloWorld = RegisterAppCall('028de32923bcc21e8a5485e4b0e81eff2d9ba08e', 'operation', 'args') # 定位被呼叫的合約,執行靜態呼叫

def Main(operation, args):
    if operation == "CallHello":
        opt = args[0]
        msg = args[1]
        return CallHello(opt, msg)
    return False

def CallHello(opt, msg):
    return HelloWorld(opt, [msg])

合約 B 是最簡單的 Hello World 合約,合約 A 將呼叫合約 B 中的 Hello 函式。

特別注意:需要先部署合約 B,獲取合約 B 的合約雜湊,並當作合約 A 中RegisterAppCall 函式的引數寫入。

def Main(operation, args):
    if operation == 'Hello':
        msg = args[0]
        return Hello(msg)

    return False

def Hello(msg):
    return msg

3. SmartX 示例

1. 部署合約 B,得到其合約雜湊為028de32923bcc21e8a5485e4b0e81eff2d9ba08e;
2. 將合約雜湊寫入合約 A 中的 RegisterAppCall 引數中;
3. 部署合約 A;
4. 執行 CallHello 函式,如圖:

5. 點選「執行預執行」,返回68656c6c6f20776f726c64(Hello World 十六進位制字串),表示呼叫成功。

4. 總結

本次技術視點中我們介紹瞭如何跨合約靜態呼叫,開發者可以準備兩個智慧合約——合約 A 與合約 B,透過合約 A 來靜態呼叫合約 B 的功能函式。下一期我們將介紹本體 Python 智慧合約語法的跨合約動態呼叫。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;