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

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

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

En este artículo, comenzaremos a familiarizarnos con la API de contrato inteligente de Ontology. La API de contrato inteligente de Ontology se divide en 7 módulos:

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

Blockchain & Block API es la parte principal 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 Block API admite operaciones básicas de consulta de bloques, como consultar la cantidad de transacciones para un bloque determinado.

¡Empecemos!

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

1. Cómo utilizar la API de cadena de bloques

Los enlaces a funciones de contratos inteligentes son idénticos a los enlaces de Python. Puede introducir las funciones correspondientes según sea necesario. Por ejemplo, la siguiente declaración presenta una función GetHeight para obtener la altura del bloque actual y una función GetHeader para obtener el encabezado del bloque.

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

ObtenerAltura

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, omitiremos la función principal por conveniencia, 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

ObtenerEncabezado

GetHeader se usa para obtener el encabezado del bloque, el parámetro es el número de serie del bloque en la cadena de bloques. 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

Obtener transacción por hash

GetTransactionByHash se utiliza para obtener una transacción a través de un hash de transacción. El hash de la transacción se envía a Obtener transacción por hash como parámetros en formato bytearray. La clave de esta función es convertir el hash de la transacción en formato hexadecimal al 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 ningún bloque con ese hash de bloque. Tomemos el hash de la transacción en formato hexadecimal como ejemplo para convertirlo al formato bytearray. Un ejemplo se ve así:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Primero, invierta el hash de la transacción:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Los desarrolladores pueden realizar este paso utilizando la herramienta de conversión de números hexadecimales (little endian) proporcionada por SmartX.

Luego convierta el resultado 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}

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

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

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

from ontology.interop.System.Blockchain import GetTransactionByHash
def demo():
    # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1"    
    tx_hash=bytearray(b"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f")
    tx=GetTransactionByHash(tx_hash)
    return tx

ObtenerAlturaDeTransacción

GetTransactionHeight se usa 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"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f")
    height=GetTransactionHeight(tx_hash)
    return height

ObtenerContrato

Los desarrolladores pueden usar la función GetContract para obtener un contrato a través del hash del contrato. El proceso de conversión de hash de contrato es el mismo que 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"xfax98x96x21x32x32xbbxf0x9fx23x91xfaxefx95x9bxffxa5x75x1axd8")
    contract=GetContract(contract_hash)
    return contract

Getblock

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

1. Obtenga la altura bloque por bloque:

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

2. Obtenga un hash bloque por bloque:

from ontology.interop.System.Blockchain import GetBlock
def demo():    
    block_hash=bytearray(b'x16xe0xc5x40x82x79x77x30x44xeax66xc8xc4x5dx17xf7x17x73x92x33x6dx54xe3x48x46x0bxc3x2fxe2x15x03xe4')
    block=GetBlock(block_hash)

2. Cómo usar la API de bloques

Hay tres funciones disponibles en Block API: ObtenerTransacciones, ObtenerCuentaTransaccionesY ObtenerTransacciónPorÍndice. Los desglosaremos uno por uno.

ObtenerCuentaTransacciones

GetTransactionCount se utiliza para obtener el número de transacciones de 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

ObtenerTransacciones

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

ObtenerTransacciónPorÍndice

GetTransactionByIndex se usa para obtener una transacción específica en un bloque dado.

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

Puede encontrar una guía completa en nuestro GitHub.

Epílogo

Blockchain & Block API es una parte indispensable de los contratos inteligentes, ya que 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 cómo interactúan con la cadena de bloques de Ontology.

El artículo fue traducido por los editores de Hashrate&Shares especialmente para OntologyRussia. клик

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

Ontología

Fuente: habr.com

Añadir un comentario