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

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

Esta es la primera parte de una serie de artículos educativos sobre cómo crear contratos inteligentes en 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 contratos inteligentes de Ontology. La API de contratos inteligentes de Ontology se divide en 7 módulos:

  1. Blockchain & Block API,
  2. Runtime API,
  3. Storage API,
  4. Native API,
  5. Upgrade API,
  6. Execution Engine API y
  7. Static & Dynamic Call API.

Blockchain & Block API es la parte principal del sistema de contratos inteligentes de Ontology. La API de Blockchain admite operaciones básicas de consulta blockchain, como la obtención de la altura actual del bloque, mientras que la API de Block admite operaciones básicas de consulta de bloques, como la solicitud de la cantidad de transacciones para un bloque dado.

¡Vamos a empezar!

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

1. Cómo usar la API de Blockchain

Los enlaces a las funciones de los contratos inteligentes son idénticos a los enlaces de Python. Puedes introducir las funciones correspondientes 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

GetHeight

GetHeight se utiliza para obtener el último número secuencial del bloque en la blockchain, como se muestra en el ejemplo a continuación. En el último ejemplo, por conveniencia, omitiré la función Main, pero puedes 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 se utiliza para obtener el encabezado del bloque, cuyo parámetro es el número secuencial del bloque en la blockchain. 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 mediante el hash de la transacción. El hash de la transacción se envía a GetTransactionByHash como parámetros en formato bytearray. La clave para esta función es convertir el hash de la transacción en formato hex a un hash de transacción en formato bytearray. Este es un paso importante. De lo contrario, recibirías un error que indica que no hay bloque con ese hash. Tomemos un hash de transacción en formato hex, por ejemplo, para convertirlo a formato bytearray. El ejemplo es el siguiente:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Primero, invierte el hash de la transacción:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Los desarrolladores pueden realizar este paso utilizando la herramienta de conversión Hex Number (little endian) que proporciona SmartX.

Luego, convierte el resultado obtenido en 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 mediante la herramienta de conversión String Byte Array que ofrece SmartX. Finalmente, convierte el bytearray obtenido en una cadena similar:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

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

GetTransactionHeight

GetTransactionHeight se utiliza para obtener la altura de la transacción mediante el 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

GetContract

Los desarrolladores pueden utilizar la función GetContract para obtener un contrato mediante el hash del contrato. El proceso de conversión del hash del contrato es similar al proceso de conversión del hash de la 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. Obtener un bloque por la altura del bloque:

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

2. Obtener un bloque por el hash del bloque:

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

2. Cómo utilizar la API de Block

Hay tres funciones disponibles en la API de Block: GetTransactions, GetTransactionCountcomo GetTransactionByIndex. Las analizaremos una por una.

GetTransactionCount

GetTransactionCount se utiliza para obtener la cantidad de transacciones para un bloque dado.

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

GetTransactions

Los desarrolladores pueden utilizar 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) # el índice comienza desde 0.
    return tx

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

Póscrito

La API de Blockchain & Block es una parte indispensable de los contratos inteligentes, ya que puede utilizarlas para solicitar datos del blockchain y datos de bloques en los contratos inteligentes. En los siguientes artículos, discutiremos cómo usar el resto de las API y cómo interactúan con el blockchain de Ontology.

El artículo fue traducido por el equipo de Hashrate&Shares especialmente para OntologyRussia. clic

¿Eres desarrollador? Únete a nuestra comunidad técnica en Discord. Además, echa un vistazo al Centro de Desarrolladores en nuestro sitio, allí puedes encontrar herramientas para desarrolladores, documentación y mucho más.

Ontology

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster