Cómo escribir un contrato inteligente de Python en la red Ontology. Parte 1: Blockchain y Block API

imagen

Esta es la primera parte de una serie de tutoriales sobre la creación de contratos inteligentes en Python en la red blockchain de Ontology utilizando la herramienta de desarrollo de contratos inteligentes SmartX .

En este artículo, comenzaremos nuestra introducción a Ontology Smart Contract API. La API de contrato inteligente de Ontology se divide en 7 módulos:

  1. Blockchain y Block API,
  2. API de almacenamiento
  3. API de tiempo de ejecución
  4. API nativa
  5. API de actualización
  6. API de motor de ejecución y
  7. API de llamadas estáticas y dinámicas.

Blockchain & Block API es una parte esencial del sistema de contrato inteligente de Ontology. La API Blockchain admite operaciones básicas de solicitud de blockchain, como obtener la altura actual del bloque, mientras que la API Block admite operaciones básicas de solicitud de bloque, como solicitar el número de transacciones para un bloque determinado.

¡Empecemos!

Para comenzar, cree un nuevo contrato en SmartX y luego siga las instrucciones a continuación.

1. Cómo usar la API Blockchain


Los enlaces a las funciones de contrato inteligente son idénticos a los enlaces de Python. Puede ingresar las funciones apropiadas según sea necesario. Por ejemplo, la siguiente declaración introduce GetHeight, una función para obtener la altura actual del bloque, y GetHeader, una función para obtener el encabezado del bloque.

from ontology.interop.System.Blockchain import GetHeight, GetHeader 

Getheight


GetHeight se usa para obtener el último número de secuencia de bloque en la cadena de bloques, como se muestra en el siguiente ejemplo. En el último ejemplo, por conveniencia, omitiremos la función Principal, pero puede agregarla si es necesario.

 from ontology.interop.System.Runtime import Notify from ontology.interop.System.Blockchain import GetHeight def Main(operation): if operation == 'demo': return demo() return False def demo(): height=GetHeight() Notify(height) # print height return height #return height after running the function 

Getheader


GetHeader, utilizado para obtener el título del bloque, el parámetro es el número de serie del bloque en la cadena de bloques. Un ejemplo:

 from ontology.interop.System.Runtime import Notify from ontology.interop.System.Blockchain import GetHeader def demo(): block_height=10 header=GetHeader(block_height) Notify(header) return header 

GetTransactionByHash


GetTransactionByHash se utiliza para obtener una transacción a través de un hash de transacción. El hash de transacción se envía a GetTransactionByHash como parámetros en el formato bytearray. La clave de esta función es convertir el hash de la transacción en formato hexadecimal en un hash de la transacción en formato bytearray. Este es un paso importante. De lo contrario, obtendría un error que indica que no hay bloque con dicho hash de bloque. Tomemos un hash hexadecimal de una transacción, como ejemplo, para convertirla al formato bytearray. Un ejemplo es el siguiente:

 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1 

Primero invierta el hash de la transacción:

 c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279 

Los desarrolladores pueden dar este paso con la herramienta de conversión de números de número hexadecimal (little endian) proporcionada por SmartX.

Luego convierta el resultado al formato bytearray:

 {0xc1,0x89,0x0c,0x4d,0x73,0x06,0x26,0xdf,0xaa,0x94,0x49,0x41,0x9d,0x66,0x25,0x05,0xea,0xb3,0xbd,0xa2,0xe1,0xf0,0x1f,0x89,0x46,0x3c,0xc1,0xa4,0xa3,0x0a,0x27,0x9f} 

Esto se puede hacer utilizando la herramienta de conversión String Byte Array proporcionada por SmartX. Finalmente, convierta el bytearray resultante en una cadena similar:

 \xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f 

El siguiente es un ejemplo de una función GetTransactionByHash que toma una transacción usando un hash de transacción:

 from ontology.interop.System.Blockchain import GetTransactionByHash def demo(): # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1" tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f") tx=GetTransactionByHash(tx_hash) return tx 


GetTransactionHeight


GetTransactionHeight se usa para obtener la altura de una transacción a través de un hash de transacción. Tomemos el hash del ejemplo anterior:

 from ontology.interop.System.Blockchain import GetTransactionHeight def demo(): # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1" tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f") height=GetTransactionHeight(tx_hash) return height 

Getcontract


Los desarrolladores pueden usar la función GetContract para obtener un contrato a través de un hash de contrato. El proceso de conversión de hash de contrato es el proceso de conversión de hash de transacción correspondiente mencionado anteriormente.

 from ontology.interop.System.Blockchain import GetContract def demo(): # contract_hash="d81a75a5ff9b95effa91239ff0bb3232219698fa" contract_hash=bytearray(b"\xfa\x98\x96\x21\x32\x32\xbb\xf0\x9f\x23\x91\xfa\xef\x95\x9b\xff\xa5\x75\x1a\xd8") contract=GetContract(contract_hash) return contract 

Getblock


GetBlock se usa para obtener un bloque. Hay dos formas de obtener un bloque específico.

1. Obtenga el bloque por la altura del bloque:

 from ontology.interop.System.Blockchain import GetBlock def demo(): block=GetBlock(1408) return block 

2. Obtenga el hash de bloque por bloque:

 from ontology.interop.System.Blockchain import GetBlock def demo(): block_hash=bytearray(b'\x16\xe0\xc5\x40\x82\x79\x77\x30\x44\xea\x66\xc8\xc4\x5d\x17\xf7\x17\x73\x92\x33\x6d\x54\xe3\x48\x46\x0b\xc3\x2f\xe2\x15\x03\xe4') block=GetBlock(block_hash) 

2. Cómo usar Block API


Hay tres funciones disponibles en la API de bloque: GetTransactions , GetTransactionCount y GetTransactionByIndex . Los clasificaremos uno por uno.

Gettransactioncount


GetTransactionCount se usa para obtener el número de transacciones para un bloque determinado.

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactionCount def demo(): block=GetBlock(1408) count=GetTransactionCount(block) return count 

Obtener transacciones


Los desarrolladores pueden usar la función GetTransactions para obtener todas las transacciones en este bloque.

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactions def demo(): block=GetBlock(1408) txs=GetTransactions(block) return txs 

GetTransactionByIndex


GetTransactionByIndex se utiliza para obtener una transacción específica en este bloque.

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactionByIndex def demo(): block=GetBlock(1408) tx=GetTransactionByIndex(block,0) # index starts from 0. return tx 

La guía completa se puede encontrar en nuestro GitHub .

Epílogo


Blockchain & Block API es una parte indispensable de los contratos inteligentes, porque puede usarlos para solicitar datos de blockchain y bloquear datos en contratos inteligentes. En los siguientes artículos, discutiremos cómo usar el resto de las API y descubriremos su interacción con la cadena de bloques de Ontology.


El artículo fue traducido por Hashrate & Shares específicamente para OntologyRussia. haga clic
¿Eres desarrollador? Únete a nuestra comunidad tecnológica en Discord . Además, eche un vistazo al Centro de desarrolladores en nuestro sitio web, donde puede encontrar herramientas para desarrolladores, documentación y mucho más.

Ontología


Source: https://habr.com/ru/post/474966/


All Articles