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

imagem

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

Neste artigo, começaremos nossa introdução à API de contrato inteligente da Ontology. A API de contrato inteligente da ontologia é dividida em 7 módulos:

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

A API Blockchain & Block é uma parte essencial do sistema de contrato inteligente da Ontology. A API Blockchain suporta operações básicas de solicitação de bloco, como obter a altura atual do bloco, enquanto a API Block suporta operações básicas de solicitação de bloco, como solicitar o número de transações para um determinado bloco.

Vamos começar!

Para começar, crie um novo contrato no SmartX e siga as instruções abaixo.

1. Como usar a API Blockchain


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

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

Getheight


GetHeight é usado para obter o último número de sequência do bloco na blockchain, como mostrado no exemplo abaixo. No último exemplo, por conveniência, pularemos a função Principal, 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 

Getheader


GetHeader, usado para obter o título do bloco, o parâmetro é o número de série do bloco na blockchain. Um 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 essa função é converter o hash da transação no formato hexadecimal em um hash da transação no formato bytearray. Este é um passo importante. Caso contrário, você receberá um erro que indica que não há nenhum bloco com esse hash de bloco. Vamos pegar um hash hexadecimal de uma transação, como exemplo, para convertê-lo no formato bytearray. Um exemplo é o seguinte:

 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1 

Primeiro inverta o hash da transação:

 c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279 

Os desenvolvedores podem dar esse passo com a ferramenta de conversão de número hexadecimal (little endian) fornecida pelo SmartX.

Em seguida, converta o resultado no 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 pelo SmartX. Por fim, converta o bytearray resultante em uma sequência semelhante:

 \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 seguir, é apresentado um exemplo de uma função GetTransactionByHash que obtém uma transação usando um hash de transação:

 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 


GetTransactionHeight


GetTransactionHeight é usado para obter a altura de uma transação através de um hash de 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"\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 

Getcontract


Os desenvolvedores podem usar a função GetContract para obter um contrato através de um hash de contrato. O processo de conversão de hash do contrato é o processo de conversão de hash da transação correspondente mencionado acima.

 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 

Getblock


GetBlock é usado para obter um bloco. Existem duas maneiras de obter um bloco específico.

1. Obtenha o bloco pela altura do bloco:

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

2. Obtenha o bloco por bloco de hash:

 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 a API de bloqueio


Existem três funções disponíveis na API do bloco: GetTransactions , GetTransactionCount e GetTransactionByIndex . Vamos classificá-los um por um.

Gettransactioncount


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 

Gettransactions


Os desenvolvedores podem usar a função GetTransactions para obter todas as transações neste 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 neste 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 

O guia completo pode ser encontrado em nosso GitHub .

Posfácio


A API Blockchain & Block é uma parte indispensável de contratos inteligentes, porque você pode usá-los para solicitar dados de blockchain e bloquear dados em contratos inteligentes. Nos artigos a seguir, discutiremos como usar o restante das APIs e descobriremos sua interação com a blockchain da Ontology.


O artigo foi traduzido por Hashrate & Shares especificamente para OntologyRussia. clique
Você é desenvolvedor? Participe da nossa comunidade de tecnologia no Discord . Além disso, dê uma olhada no Developer Center em nosso site, onde você pode encontrar ferramentas, documentação e muito mais para desenvolvedores.

Ontologia


Source: https://habr.com/ru/post/pt474966/


All Articles