您的位置:首頁 > 區塊鏈 >

        Native API可調用本體原生合約 可節省調用Gas的費用

        2019-09-17 11:06:21 來源: 區塊網

        上一期我們介紹了本體 Python 智能合約的合約執行 API,本期我們將討論如何通過 Native API 來進行本體原生合約調用。原生合約調用最典型的功

        上一期我們介紹了本體 Python 智能合約的合約執行 API,本期我們將討論如何通過 Native API 來進行本體原生合約調用。原生合約調用最典型的功能就是合約轉賬,這也是整個智能合約最核心的部分。Native API 只有1個 API。用法如下:

        同時,使用 Invoke 函數需要內建的 state 函數輔助來封裝參數,用法如下:

        下面我們具體講述一下這兩個 API 的使用方法。在這之前,小伙伴們可以在本體智能合約開發工具 SmartX 中新建一個合約,跟著我們進行操作。跟以前的API講解一樣,在文章最后我們將給出這次講解的所有源代碼以及視頻講解。

        02 Native API 使用方法

        同樣,使用這兩個函數前需要引入。下面兩條語句分別引入了這兩個函數。

        from ontology.interop.Ontology.Native import Invoke

        from ontology.builtins import state

        2.1 本體原生合約列表

        目前,本體可供使用的原生合約有六個。以下就是可以使用 Native API 調用的原生合約列表:

        在合約中,將合約地址轉成 bytearray 形式傳入 Invoke 即可。例如,需要調用 ONT Token 合約時,可以先將 ONT Token 合約對應的地址轉成相應的 bytearray 形式,再進行相應的 Invoke 函數調用。在進行 Invoke 函數調用時,傳入的參數分別為版本號,合約地址,調用的合約方法以及 state 函數封裝的轉賬相關參數。

        這里特別要注意的一點是,在進行 ONG 的合約轉賬時,所填數量是實際數量的10^9倍。 即,如果需要轉10個 ONG,那么數量需要填為10^10。而在采用 ONTO 或者 Cyano 等錢包轉賬時,所填數量即為轉賬數量。

        contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')

        param = state(from_acct, to_acct, ont_amount) # 參數為轉出地址,轉入地址, 轉賬金額

        res = Invoke(1, contract_address_ONT, 'transfer', [param])

        2.2 轉賬合約代碼

        下面我們給出一個完整的示例,演示如何使用 Python 語言來實現 ONT 以及 ONG 的轉賬功能。下述代碼以傳入的轉出賬戶和轉入地址參數類型為string為例實現該合約。另外,也可以以address為類型的賬戶參數進行傳遞,從而達到節省調用Gas費用的目的。該合約代碼流程如下:

        1. 定義合約地址變量 contract_address_ONT,contract_address_ONG;

        2. 將轉出地址和轉入地址從 base58 格式轉成 bytearray 格式;

        3. 驗簽,確認轉出地址與合約調用地址為同一地址;

        4. state 函數封裝轉賬相關參數;

        5. Invoke 函數調用 ONT Token 和 ONG Token 原生合約轉賬;

        6. 通過返回 res 判斷轉賬是否成功。返回值 b'\x01' 為成功,成功則推送事件“transfer succeed”。

        from ontology.interop.System.Runtime import Notify, CheckWitness

        from ontology.interop.Ontology.Runtime import Base58ToAddress

        from ontology.interop.Ontology.Native import Invoke

        from ontology.builtins import state

        # contract address

        contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')

        contract_address_ONG = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02')

        def Main(operation, args):

        if operation == 'transfer':

        from_acct = args[0]

        to_acct = args[1]

        ont_amount = args[2]

        ong_amount = args[3]

        return transfer(from_acct,to_acct,ont_amount,ong_amount)

        return False

        def transfer(from_acct, to_acct, ont_amount, ong_amount):

        # 將base58地址轉換成 bytearray格式地址

        from_acct=Base58ToAddress(from_acct)

        to_acct=Base58ToAddress(to_acct)

        # 驗簽,調用方必須與轉出地址為同一地址

        if CheckWitness(from_acct):

        # ONT轉賬

        if ont_amount > 0:

        param = state(from_acct, to_acct, ont_amount) # state函數用于封裝轉賬相關參數

        res = Invoke(1, contract_address_ONT, 'transfer', [param]) # invoke調用ONT token原生合約轉賬

        if res and res == b'\x01':

        Notify('transfer succeeded')

        else:

        Notify('transfer failed')

        # ONG轉賬,流程同上

        if ong_amount > 0:

        param = state(from_acct, to_acct, ong_amount)

        res = Invoke(1, contract_address_ONG, 'transfer', [param])

        if res and res == b'\x01':

        Notify('transfer succeeded')

        else:

        Notify('transfer failed')

        else:

        Notify('CheckWitness failed')

        03 SmartX 實踐

        接下來,小伙伴們可以在 SmartX 上進行操作,動手編譯和運行上述提供的合約示例代碼。具體步驟如下:

        1. 編譯合約。首先在 SmartX 中新建一個合約項目,并將代碼放入該項目中進行編譯。

        2. 部署合約。部署過程中如需申請測試幣,申請地址為https://developer.ont.io/applyOng。部署結果示意如下:

        3. 執行轉賬。執行 transfer 函數進行轉賬前需要進行相關參數設置。在該示例中,需要填入發送地址、接收地址、代轉賬的 ONT 數量以及 ONG 數量:

        4. 轉賬成功。當轉帳參數設置正確時,執行 transfer 函數將轉賬成功。上面所填的接收地址中將顯示出收到的代幣:

        04 總結

        本次技術視點中我們介紹了本體區塊鏈的 Native API,開發者可以使用 Native API 來進行本體原生合約調用。原生合約調用最典型的功能就是合約轉賬,這也是整個智能合約最核心的部分。在下一期技術視點中,我們將介紹 Upgrade API,探討如何在本體智能合約中進行合約升級。(Sheldon)

        關鍵詞: Native API 本體原生合約 Gas

        精選 導讀

        募資55億港元萬物云啟動招股 預計9月29日登陸港交所主板

        萬科9月19日早間公告,萬物云當日啟動招股,預計發行價介乎每股47 1港元至52 7港元,預計9月29日登陸港交所主板。按發行1 167億股計算,萬

        發布時間: 2022-09-20 10:39
        管理   2022-09-20

        公募基金二季度持股情況曝光 隱形重倉股多為高端制造業

        隨著半年報披露收官,公募基金二季度持股情況曝光。截至今年二季度末,公募基金全市場基金總數為9794只,資產凈值為269454 75億元,同比上

        發布時間: 2022-09-02 10:45
        資訊   2022-09-02

        又有上市公司宣布變賣房產 上市公司粉飾財報動作不斷

        再有上市公司宣布變賣房產。四川長虹25日稱,擬以1 66億元的轉讓底價掛牌出售31套房產。今年以來,A股公司出售房產不斷。根據記者不完全統

        發布時間: 2022-08-26 09:44
        資訊   2022-08-26

        16天12連板大港股份回復深交所關注函 股份繼續沖高

        回復交易所關注函后,大港股份繼續沖高。8月11日大港股份高開,隨后震蕩走高,接近收盤時觸及漲停,報20 2元 股。值得一提的是,在7月21日

        發布時間: 2022-08-12 09:56
        資訊   2022-08-12

        萬家基金再添第二大股東 中泰證券擬受讓11%基金股權

        7月13日,中泰證券發布公告,擬受讓齊河眾鑫投資有限公司(以下簡稱齊河眾鑫)所持有的萬家基金11%的股權,交易雙方共同確定本次交易的標的資

        發布時間: 2022-07-14 09:39
        管理   2022-07-14

        央行連續7日每天30億元逆回購 對債市影響如何?

        央行12日再次開展了30億元逆回購操作,中標利率2 10%。這已是央行連續7日每天僅進行30億元的逆回購縮量投放,創下去年1月以來的最低操作規

        發布時間: 2022-07-13 09:38
        資訊   2022-07-13

        美元指數創近20年新高 黃金期貨創出逾9個月新低

        由于對美聯儲激進加息的擔憂,美元指數11日大漲近1%創出近20年新高。受此影響,歐美股市、大宗商品均走弱,而黃金期貨創出逾9個月新低。美

        發布時間: 2022-07-13 09:36
        資訊   2022-07-13

        美股三大股指全線下跌 納斯達克跌幅創下記錄以來最大跌幅

        今年上半年,美股持續回落。數據顯示,道瓊斯指數上半年下跌15 3%,納斯達克綜合指數下跌29 5%,標普500指數下跌20 6%。其中,納斯達克連續

        發布時間: 2022-07-04 09:51
        推薦   2022-07-04

        融資客熱情回升 兩市融資余額月內增加超344億元

        近期A股走強,滬指6月以來上漲4%,融資客熱情明顯回升。數據顯示,截至6月16日,兩市融資余額1 479萬億元,月內增加344 67億元,最近一個半

        發布時間: 2022-06-20 09:41
        資訊   2022-06-20

        4個交易日凈買入超百億元 北向資金持續流入A股市場

        北向資金凈流入態勢延續。繼6月15日凈買入133 59億元后,北向資金6月16日凈買入44 52億元。自5月27日至今,除6月13日以外,北向資金累計凈

        發布時間: 2022-06-17 09:37
        推薦   2022-06-17