Como escribir un contrato intelixente en Python na rede Ontology. Parte 1: Blockchain e Block API

Como escribir un contrato intelixente en Python na rede Ontology. Parte 1: Blockchain e Block API

Esta é a primeira parte dunha serie de tutoriais sobre a creación de contratos intelixentes de Python na rede blockchain de Ontology mediante a ferramenta de desenvolvemento de contratos intelixentes. SmartX.

Neste artigo, comezaremos a coñecer a API do contrato intelixente de Ontology. A API do contrato intelixente de Ontology divídese en 7 módulos:

  1. Blockchain e Block API,
  2. API de execución,
  3. API de almacenamento,
  4. API nativa,
  5. Actualizar API,
  6. API do motor de execución e
  7. API de chamada estática e dinámica.

Blockchain & Block API é a parte principal do sistema de contrato intelixente de Ontology. A API Blockchain admite operacións básicas de consulta de blockchain, como obter a altura actual do bloque, mentres que a API Block admite operacións básicas de consulta de bloques, como consultar o número de transaccións para un determinado bloque.

Imos comezar!

En primeiro lugar, crea un novo contrato SmartXe despois siga as instrucións a continuación.

1. Como usar a API Blockchain

As ligazóns ás funcións de contrato intelixente son idénticas ás ligazóns de Python. Pode introducir as funcións correspondentes segundo sexa necesario. Por exemplo, a seguinte instrución introduce unha función GetHeight para obter a altura actual do bloque e unha función GetHeader para obter a cabeceira do bloque.

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

GetHeight

GetHeight úsase para obter o último número de secuencia de bloques na cadea de bloques, como se mostra no seguinte exemplo. No último exemplo, omitiremos a función Principal por comodidade, pero podes engadila se é 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 úsase para obter a cabeceira do bloque, o parámetro é o número de serie do bloque na cadea de bloques. Exemplo:

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 úsase para obter unha transacción mediante un hash de transacción. O hash da transacción envíase a GetTransactionByHash como parámetros en formato bytearray. A clave desta función é converter o hash da transacción en formato hexadecimal ao hash da transacción en formato bytearray. Este é un paso importante. En caso contrario, obtería un erro que indica que non hai ningún bloque con ese hash de bloque. Tomemos o hash de transacción en formato hexadecimal como exemplo para convertelo a formato bytearray. Un exemplo é así:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Primeiro, inverte o hash da transacción:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Os desenvolvedores poden realizar este paso usando a ferramenta de conversión de números hexadecimales (little endian) proporcionada por SmartX.

Despois converte o resultado ao 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}

Isto pódese facer usando a ferramenta de conversión String Byte Array proporcionada por SmartX. Finalmente, converte a matriz de bytes resultante nunha cadea similar:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

O seguinte é un exemplo da función GetTransactionByHash, que leva unha transacción usando o hash da 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 úsase para obter a altura da transacción a través do hash da transacción. Tomemos o hash do exemplo 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

Os desenvolvedores poden usar a función GetContract para obter un contrato a través do hash do contrato. O proceso de conversión de hash de contrato é o mesmo que o 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 úsase para obter un bloque. Hai dúas formas de obter un bloque específico.

1. Obtén a altura de bloque por bloque:

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

2. Obtén un hash bloque por bloque:

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

2. Como usar Block API

Hai tres funcións dispoñibles na API Block: GetTransactions, GetTransactionCountE GetTransactionByIndex. Irémolos desglosando un por un.

GetTransactionCount

GetTransactionCount úsase para obter o número de transaccións para un determinado bloque.

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

Os desenvolvedores poden usar a función GetTransactions para obter todas as transaccións nun 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

GetTransactionByIndex

GetTransactionByIndex úsase para obter unha transacción específica nun 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

Pódese atopar unha guía completa na nosa web GitHub.

Posterior

A API de Blockchain & Block é unha parte indispensable dos contratos intelixentes, xa que pode usalos para solicitar datos de blockchain e bloquear datos en contratos intelixentes. Nos seguintes artigos, discutiremos como usar o resto das API e descubrir como interactúan coa cadea de bloques de Ontology.

O artigo foi traducido polos editores de Hashrate&Shares especialmente para OntologyRussia. chorar

Vostede é un programador? Únete á nosa comunidade tecnolóxica en Discordia. Ademais, bótalle un ollo Centro de Desenvolvedores no noso sitio web, onde podes atopar ferramentas para desenvolvedores, documentación e moito máis.

Ontoloxía

Fonte: www.habr.com

Engadir un comentario