如何使用Python on Ontology编写智能合约? 第4部分:本机API

图片

之前,我在
第1部分:区块链和区块API
第2部分:存储API
第3部分:运行时API
今天,让我们谈谈如何通过Native API调用Ontology Native智能合约。 调用本地合同的最典型功能之一是资产转移。

引言


本机API只有一个API。 使用Invoke函数时,需要使用内置状态函数来帮助您封装参数。 请参阅下文以了解如何使用这些功能。

图片

现在,让我们更详细地介绍如何使用这两个API。 在此之前,您可以在本体智能合约开发工具SmartX中创建一个新合约,并按照以下说明进行操作。 像往常一样,在文章末尾,我将提供到源代码的链接。

如何使用本机API


与往常一样,在使用这两个功能之前,需要按如下所示导入它们。

from ontology.interop.Ontology.Native import Invoke from ontology.builtins import state 

本体本地合同清单


当前有6个本体本机合同可供开发人员使用。 以下是可以由本机API调用的6种本机合约的列表。

图片

在合同中,您只需要将合同地址转换为字节数组格式并调用它。

例如 ,当您需要调用ONT令牌合同时,可以先将ONT令牌合同的地址转换为字节数组格式,然后再调用Invoke函数。 调用Invoke函数时,导入的参数是版本号,合同地址,调用的合同方法以及由state函数封装的与传输相关的参数。

这里需要特别注意的一点是,当进行ONG的合同转让时,填写的数量是实际数量的10倍。 也就是说,如果您需要转移10 ONG,则需要填写的数量是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]) 

转让合同代码


下面我们给出一个详细的示例,说明如何使用Python 传输ONT和ONG 。 在下面的代码中,导入的发送帐户和接收地址的参数类型是一个字符串。 此外,还可以使用帐户参数类型的地址进行交付,从而节省了调用合同的Gas费用。 流程如下:

  1. 定义合同地址变量contract_address_ONT和contract_address_ONG;
  2. 将发送和接收地址从base58格式转换为bytearray格式;
  3. 验证签名并确认发送地址与合同调用地址相同;
  4. 状态函数封装了与传输相关的参数;
  5. Invoke函数调用ONT令牌和ONG令牌本机合约进行传输;
  6. 通过返回res确定传输是否成功。 如果返回值为b'\ x01',则传输成功,并且将推出“传输成功”事件。

 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): # convert base58 address to address in the form of byte array from_acct=Base58ToAddress(from_acct) to_acct=Base58ToAddress(to_acct) # check whether the sender is the payer if CheckWitness(from_acct): # transfer ONT if ont_amount > 0: param = state(from_acct, to_acct, ont_amount) res = Invoke(1, contract_address_ONT, 'transfer', [param]) if res and res == b'\x01': Notify('transfer succeeded') else: Notify('transfer failed') # transfer 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') 

在SmartX上练习


您还可以按照以下步骤在SmarX上编译并运行上述代码示例:

  • 编制合同。 首先,在SmartX上创建一个项目,然后编译该项目中的代码。

图片
  • 部署合同。 如果您需要测试令牌来部署合同,请在此处申请。 部署结果如下:

图片

  • 运行传递函数。 在运行传递函数之前,需要根据需要配置参数。 在下面的示例中,您需要输入发送地址,接收地址以及转移的ONT和ONG金额:

图片

  • 转移成功。 正确配置参数后,运行传输功能时传输将成功。 转移的令牌将显示在上方的接收地址中:

图片

总结


在本文中,我们介绍了本体链的本机API 。 开发人员可以使用此API调用本体本机合同。 在下一篇文章中,我们将介绍升级API,以探讨如何在本体智能合约中升级合约。

此处找到GitHub上的教程。



这是先前在Ontology Medium博客上发布的官方教程
您是开发人员吗? 确保您已加入Discord上的我们的技术社区。 另外,请访问我们网站上的开发人员中心,在那里您可以找到开发人员工具,文档等。

在其他地方找到本体


本体网站
GitHub / 不和谐
电报英语 / 俄语
Twitter / Reddit

Source: https://habr.com/ru/post/zh-CN471358/


All Articles