Como escrever um contrato inteligente em Python na rede Ontology. Parte 1: Blockchain e API de bloqueio

Como escrever um contrato inteligente em Python na rede Ontology. Parte 1: Blockchain e API de bloqueio

Esta é a primeira parte de uma série de tutoriais sobre como criar contratos inteligentes Python na rede blockchain Ontology usando a ferramenta de desenvolvimento de contratos inteligentes. SmartX.

Neste artigo, começaremos a nos familiarizar com a API de contrato inteligente Ontology. A API de contrato inteligente Ontology é dividida em 7 módulos:

  1. API Blockchain e Bloco,
  2. API de tempo de execução,
  3. API de armazenamento,
  4. API nativa,
  5. Atualizar API,
  6. API do mecanismo de execução e
  7. API de chamada estática e dinâmica.

Blockchain & Block API é a parte principal do sistema de contrato inteligente Ontology. A API Blockchain oferece suporte a operações básicas de consulta de blockchain, como obter a altura atual do bloco, enquanto a API Block oferece suporte a operações básicas de consulta de bloco, como consultar o número de transações para um determinado bloco.

Vamos começar!

Primeiro, crie um novo contrato em SmartXe siga as instruções abaixo.

1. Como usar a API Blockchain

Os links para funções de contrato inteligente são idênticos aos links do Python. Você pode inserir as funções correspondentes conforme necessário. Por exemplo, a instrução a seguir apresenta uma função GetHeight para obter a altura atual do bloco e uma função GetHeader para obter o cabeçalho do bloco.

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

ObterAltura

GetHeight é usado para obter o número de sequência do último bloco no blockchain, conforme mostrado no exemplo abaixo. No último exemplo, omitiremos a função Main por conveniência, mas você poderá adicioná-la se necessário.

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

ObterHeader

GetHeader é usado para obter o cabeçalho do bloco, o parâmetro é o número de série do bloco no blockchain. 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 é usado para obter uma transação por meio de um hash de transação. O hash da transação é enviado para GetTransactionByHash como parâmetros no formato bytearray. A chave para esta função é converter o hash da transação no formato hexadecimal para o hash da transação no formato bytearray. Este é um passo importante. Caso contrário, você receberá um erro indicando que não há bloco com esse hash de bloco. Vamos pegar o hash da transação no formato hexadecimal como exemplo para convertê-lo para o formato bytearray. Um exemplo é assim:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Primeiro, inverta o hash da transação:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Os desenvolvedores podem realizar esta etapa usando a ferramenta de conversão de número hexadecimal (little endian) fornecida pela SmartX.

Em seguida, converta o resultado para o 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}

Isso pode ser feito usando a ferramenta de conversão String Byte Array fornecida pela SmartX. Finalmente, converta o bytearray resultante em uma string semelhante:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

A seguir está um exemplo de uma função GetTransactionByHash que utiliza uma transação usando o hash da transação:

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

ObterTransactionHeight

GetTransactionHeight é usado para obter a altura da transação por meio do hash da transação. Vamos pegar o hash do exemplo acima:

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

ObterContrato

Os desenvolvedores podem usar a função GetContract para obter um contrato por meio do hash do contrato. O processo de conversão de hash de contrato é igual ao processo de conversão de hash de transação mencionado acima.

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 é usado para obter um bloco. Existem duas maneiras de obter um bloco específico.

1. Obtenha a altura bloco por bloco:

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

2. Obtenha um hash bloco por bloco:

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

2. Como usar a API de bloqueio

Existem três funções disponíveis na API Block: Obter transações, ObterTransactionCountE GetTransactionByIndex. Vamos dividi-los um por um.

ObterTransactionCount

GetTransactionCount é usado para obter o número de transações para um determinado bloco.

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

Obter transações

Os desenvolvedores podem usar a função GetTransactions para obter todas as transações em um determinado bloco.

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 é usado para obter uma transação específica em um determinado bloco.

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

Um guia completo pode ser encontrado em nosso GitHub.

Posfácio

A API Blockchain & Block é uma parte indispensável dos contratos inteligentes, pois você pode usá-los para solicitar dados de blockchain e bloquear dados em contratos inteligentes. Em artigos futuros, discutiremos como usar o restante das APIs e descobrir como elas interagem com o blockchain Ontology.

O artigo foi traduzido pelos editores da Hashrate&Shares especialmente para a OntologyRussia. clique

Você é um desenvolvedor? Junte-se à nossa comunidade de tecnologia em Discord. Além disso, dê uma olhada Centro do Desenvolvedor em nosso site, onde você pode encontrar ferramentas para desenvolvedores, documentação e muito mais.

Ontologia

Fonte: habr.com

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster