Cómo escribir un contrato inteligente sobre ontología con Python – (Parte 4)

En el artículo anterior, presentamos cómo puede usar el API de tiempo de ejecución ejecutar el contrato inteligente de Python en Ontology. Hoy, hablemos sobre cómo invocar un contrato inteligente nativo de Ontology a través de API nativa. Una de las funciones más típicas de invocar un contrato nativo es la transferencia de activos. La API nativa tiene solo una API. Cuando usa la función Invocar, necesita usar la función de estado incorporada para ayudarlo a encapsular los parámetros. Consulte a continuación para aprender a usar las funciones.

Ahora veamos más detalles sobre cómo usar estas 2 API. Antes de eso, puede crear un nuevo contrato en la herramienta de desarrollo de contratos inteligentes de Ontology SmartX y siga las instrucciones a continuación. Como de costumbre, al final del artículo, proporcionaremos el enlace del código fuente.

Como de costumbre, debe importar las 2 funciones de la siguiente manera antes de usarlas.

de ontology.interop.Ontology.Native import Invoke
del estado de importación ontology.builtins

Lista de contratos nativos de ontología

Actualmente hay 6 contratos nativos de Ontology disponibles para desarrolladores. A continuación se muestra la lista de los 6 contratos nativos que puede invocar la API nativa.

En el contrato, solo necesita convertir la dirección del contrato en formato bytearray e invocarla. Por ejemplo, cuando necesita llamar a un contrato de Token ONT, primero puede convertir la dirección del contrato de Token ONT a formato bytearray y luego llamar a la función Invocar. Al llamar a la función Invocar, los parámetros importados son el número de versión, la dirección del contrato, el método del contrato invocado y los parámetros relacionados con la transferencia encapsulados por la función de estado.

Un punto particular a tener en cuenta aquí es que cuando se realiza una transferencia de contrato para ONG, la cantidad llena es 10⁹ veces la cantidad real. Es decir, si necesita transferir 10 ONG, la cantidad que debe completarse es 10¹⁰. Al usar una billetera, como ONTO o Cyano para transferir, la cantidad que ingresa es el monto de la transferencia.

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))

Código de contrato de transferencia

A continuación damos un ejemplo detallado de cómo usar Python para transferir ONT y ONG. En el siguiente código, el tipo de parámetro de la cuenta de envío y la dirección de recepción importadas es una cadena. Además, también se puede entregar con un tipo de dirección de parámetro de cuenta, ahorrando así la tarifa de Gas por invocar el contrato. El proceso es el siguiente:

Defina las variables de dirección del contrato contract_address_ONT y contract_address_ONG; Convierta la dirección de envío y recepción del formato base58 al formato bytearray; Verifique la firma y confirme que la dirección de envío es la misma que la dirección de invocación del contrato; La función de estado encapsula los parámetros relacionados con la transferencia; La función de invocación llama al contrato nativo de ONT Token y ONG Token para la transferencia; determine si la transferencia fue exitosa devolviendo res. Si el valor de retorno es b ’ x01 ', la transferencia es exitosa y el evento" transferencia exitosa "se eliminará de ontology.interop.System.Runtime import Notify, CheckWitness
de ontology.interop.Ontology.Runtime import Base58ToAddress
de ontology.interop.Ontology.Native import Invoke
de ontology.builtins import state # dirección del contrato
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 (operación, args):
si operación == 'transferencia':
from_acct = args (0)
to_acct = args (1)
ont_amount = args (2)
ong_amount = args (3)
transferencia de retorno (from_acct, to_acct, ont_amount, ong_amount)

falso retorno

transferencia de def (from_acct, to_acct, ont_amount, ong_amount):
# convertir base58 dirección a dirección en forma de matriz de bytes
from_acct = Base58ToAddress (from_acct)
to_acct = Base58ToAddress (to_acct)
# comprobar si el remitente es el pagador
si CheckWitness (from_acct):
# transferencia ONT
si ont_amount> 0:
param = state (from_acct, to_acct, ont_amount)
res = Invoke (1, contract_address_ONT, 'transfer', (param))
si res y res == b ' x01':
Notificar ('transferencia exitosa')
más:
Notificar ('transferencia fallida')
# transferencia ONG
si ong_amount> 0:
param = state (from_acct, to_acct, ong_amount)
res = Invoke (1, contract_address_ONG, 'transfer', (param))
si res y res == b ' x01':
Notificar ('transferencia exitosa')
más:
Notificar ('transferencia fallida')
más:
Notificar ('CheckWitness falló')

Practica en SmartX

También puede compilar y ejecutar el ejemplo de código anterior en SmarX siguiendo los pasos a continuación:

Compilar el contrato. Primero, cree un proyecto en SmartX y compile el código en este proyecto.Ejecute la función de transferencia. Antes de ejecutar la función de transferencia, debe configurar los parámetros según sea necesario. En el siguiente ejemplo, debe ingresar la dirección de envío, la dirección de recepción y la cantidad de ONT y ONG transferida:Transferencia exitosa. Después de haber configurado los parámetros correctamente, la transferencia será exitosa al ejecutar la función de transferencia. El token transferido se mostrará en la dirección de recepción anterior:

En este artículo, presentamos el API nativa de la cadena de bloques Ontology. Los desarrolladores pueden usar esta API para invocar contratos nativos de Ontology. En el próximo artículo, presentaremos el Mejorar API para explorar cómo actualizar el contrato en los contratos inteligentes de Ontology.

Encuentra el tutorial en GitHub aquí.