Como escribir un Contrato Inteligente (Smart Contract) en Ontology con Python | Parte 1

Prefacio

En los artículos técnicos anteriores (visita el Blog en Medium de Ontology para mas información al respecto, artículos en ingles.), presentamos el sistema de contrato inteligente compatible con Ontology MainNet y la herramienta de desarrollo de contrato inteligente SmartX. Estamos seguros de que muchos de ustedes simplemente no pueden esperar para probarlo.

En este artículo, comenzaremos a presentar la API de contrato inteligente de Ontología. La API de contrato inteligente de Ontology se divide en 7 módulos, Blockchain & Block API, Runtime API, Storage API, Native API, Upgrade API, Execution Engine API y Static & Dynamic Call API.

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 Blockchain admite operaciones básicas de consulta de Blockchain, como obtener la altura actual del bloque, mientras que la Block API 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 un 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 declaració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

Los desarrolladores pueden 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

Los desarrolladores pueden 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 GeTransactionByHash

Los desarrolladores pueden usar la función GetTransactionByHash para obtener transacciones a través del hash de la transaccion o 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 a un hash de transacción en formato bytearray (Mas informacion sobre 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 Hex Number(little endian) < — > Number proporcionado por SmartX.

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

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

1.5 GetContract

Los desarrolladores pueden 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

Los desarrolladores pueden usar la función GetBlock para obtener el bloque. Hay dos formas de obtener un bloque específico:

  1. Obtener el Bloque por la altura de Bloque:

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

2. Obtener el Bloque por el Hash del 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- Como usar Block API

Hay tres funciones disponibles en la API de bloque (Block API en Ingles), que son GetTransactions, GetTransactionCount y GetTransactionByIndex. Los presentaremos uno por uno.

2.1 GetTransactionCount

Los desarrolladores pueden 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

Los desarrolladores pueden usar la función GetTransactions para obtener todas las transacciones de 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.2 GetTransactionByIndex

Los desarrolladores pueden 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 pueden usarlos para consultar datos de la Blockchain y bloquear datos en contratos inteligentes, en palabras mas cortas, filtrar datos necesarios. En los próximos artículos, discutiremos cómo usar otras API para explorar su interacción con la Blockchain de Ontology.

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

--

--

Construyendo comunidades. Apasionado del ecosistema Crypto.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Butneversaved

Butneversaved

29 Followers

Construyendo comunidades. Apasionado del ecosistema Crypto.