¿Cómo escribir un contrato inteligente con Python en ontología? Parte 1: Blockchain y Block API

imagen

Este es un tutorial oficial publicado anteriormente en el blog Ontology Medium
Emocionado de publicarlo para los lectores de Habr. Siéntase libre de hacer cualquier pregunta relacionada y sugerir un mejor formato para los materiales del tutorial.

Prólogo


En este artículo, comenzaremos a presentar el contrato inteligente API de Ontología. La API de contrato inteligente de Ontology se divide en 7 módulos:


En este artículo, presentaremos Blockchain & Block API , que es la parte más básica del sistema de contrato inteligente de Ontology. La API de Blockchain admite operaciones básicas de consulta de blockchain, como obtener la altura actual del bloque, mientras que la API de Block admite operaciones básicas de consulta de bloque, como consultar el número de transacciones para un bloque determinado.

¡Empecemos!

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

1. Cómo usar la API Blockchain


Las referencias a las funciones de contrato inteligente son idénticas a las referencias de Python. Los desarrolladores pueden introducir las funciones apropiadas según sea necesario. Por ejemplo, la siguiente instrucción introduce GetHeight , la función para obtener la altura actual del bloque, y GetHeader , la función para obtener el encabezado del bloque.

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

1.1. Getheight


Puede usar GetHeight para obtener la última altura de bloque, 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 

1.2 GetHeader


Puede usar GetHeader para obtener el encabezado del bloque, y el parámetro es la altura del bloque de un bloque. Aquí hay 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 

1.3 GetTransactionByHash


Puede usar la función GetTransactionByHash para obtener transacciones a través del hash de transacciones. El hash de la transacción se envía a GetTransactionByHash como parámetros en formato bytearray. La clave de esta función es cómo convertir un hash de transacción en formato hexadecimal en un hash de transacción en formato bytearray. Este es un paso importante. De lo contrario, obtendría un error que indica que no hay bloque de este hash de bloque.

Tomemos el hash de la transacción en formato hexadecimal como ejemplo para convertirlo al formato bytearray. El ejemplo es el siguiente:

 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1 

Primero, invierta el hash de la transacción:

 c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279 

Los desarrolladores pueden implementar este paso con la herramienta de conversión Número hexadecimal (little endian) <--> Número proporcionado por SmartX.

Luego, conviértalo a 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} 

Los desarrolladores pueden hacer esto con la herramienta de conversión String <--> Byte Array proporcionada por SmartX. Finalmente, convierta el bytearray resultante en la cadena correspondiente:

 \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 

A continuación se muestra un ejemplo de la función GetTransactionByHash que obtiene una transacción a través de 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 

1.4 GetTransactionHeight


Los desarrolladores pueden usar la función GetTransactionHeight para obtener la altura de la transacción a través del hash de la transacción. Tomemos el hash en el 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 

1.5 GetContract


Puede usar la función GetContract para obtener un contrato a través del hash del contrato. El proceso de conversión del hash de contrato es coherente con el proceso de conversión de hash de transacción 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 

1.6 GetBlock


Puede usar la función GetBlock para obtener el 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, que son GetTransactions, GetTransactionCount y GetTransactionByIndex . Los presentaremos uno por uno.

2.1 GetTransactionCount


Puede usar la función GetTransactionCount 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 

2.2 GetTransactions


Puede usar la función GetTransactions para obtener todas las transacciones en un bloque determinado.

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

2.3 GetTransactionByIndex


Puede usar la función GetTransactionByIndex para obtener transacciones específicas en un bloque determinado.

 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 

Encuentra el tutorial completo en nuestro GitHub aquí .

Epílogo


Blockchain & Block API es la parte más indispensable de los contratos inteligentes, ya que puede usarlos para consultar datos de blockchain y bloquear datos en contratos inteligentes. En los próximos artículos, discutiremos cómo usar otras API para explorar su interacción con la cadena de bloques de Ontology.



¿Eres desarrollador? Asegúrate de unirte a nuestra comunidad tecnológica en Discord . Además, eche un vistazo al Centro de desarrolladores en nuestro sitio web, donde puede encontrar herramientas de desarrollador, documentación y más.

Encuentra ontología en otro lugar


Sitio web de ontología
Github / discordia
Telegram ( inglés / ruso )
Twitter / Reddit /

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


All Articles