Como escrever um contrato inteligente com Python ontologia? Parte 1: a API de Blockchain e Block

imagem

Este é um tutorial oficial publicado anteriormente no blog Ontology Medium
Animado para publicá-lo para os leitores da Habr. Sinta-se à vontade para fazer qualquer pergunta relacionada e sugerir um formato melhor para os materiais do tutorial

Prefácio


Neste artigo, começaremos a apresentar a API de contrato inteligente da Ontologia. A API de contrato inteligente da Ontology é dividida em 7 módulos:


Neste artigo, apresentaremos a API Blockchain & Block , que é a parte mais básica do sistema de contrato inteligente da Ontology. A API Blockchain suporta operações básicas de consulta de blockchain, como obter a altura atual do bloco, enquanto a API Block suporta 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 no SmartX e siga as instruções abaixo.

1. Como usar a API do Blockchain


As referências a funções inteligentes de contrato são idênticas às referências do Python. Os desenvolvedores podem introduzir as funções apropriadas conforme necessário. Por exemplo, a instrução a seguir apresenta GetHeight , a função para obter a altura atual do bloco, e GetHeader , a função para obter o cabeçalho do bloco.

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

1.1 Getheight


Você pode usar GetHeight para obter a altura mais recente do bloco, conforme mostrado no exemplo a seguir. No último exemplo, por conveniência, omitiremos 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 

1.2 GetHeader


Você pode usar GetHeader para obter o cabeçalho do bloco e o parâmetro é a altura do bloco. Aqui está 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 

1.3 GetTransactionByHash


Você pode usar a função GetTransactionByHash para obter transações através do hash da transação. O hash da transação é enviado para GetTransactionByHash como parâmetros no formato bytearray. A chave para esta função é como converter um hash de transação no formato hexadecimal em um hash de transação no formato bytearray. Este é um passo importante. Caso contrário, você receberá um erro que indica que não há nenhum bloco desse hash de bloco.

Vamos pegar o hash da transação no formato hexadecimal como exemplo para convertê-lo no formato bytearray. O exemplo é o seguinte:

 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1 

Primeiro, inverta o hash da transação:

 c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279 

Os desenvolvedores podem implementar esta etapa com a ferramenta de conversão Número hexadecimal (little endian) <--> Número fornecido pelo SmartX.

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

Os desenvolvedores podem fazer isso com a ferramenta de conversão String <--> Byte Array fornecida pelo SmartX. Por fim, converta o bytearray resultante na string correspondente:

 \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 

Abaixo está um exemplo da função GetTransactionByHash que obtém uma transação por meio de 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 

1.4 GetTransactionHeight


Os desenvolvedores podem usar a função GetTransactionHeight para obter a altura da transação através do hash da transação. Vamos pegar o hash no 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 

1.5 GetContract


Você pode usar a função GetContract para obter um contrato através do hash do contrato. O processo de conversão do hash do contrato é consistente com o processo de conversão de hash da transação 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 

1.6 GetBlock


Você pode usar a função GetBlock para obter o 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, que são GetTransactions, GetTransactionCount e GetTransactionByIndex . Vamos apresentá-los um por um.

2.1 GetTransactionCount


Você pode usar a função GetTransactionCount 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 

2.2 GetTransactions


Você pode 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 

2.3 GetTransactionByIndex


Você pode usar a função GetTransactionByIndex para obter transações específicas 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 

Encontre o tutorial completo em nosso GitHub aqui .

Posfácio


A API Blockchain & Block é a parte mais indispensável dos contratos inteligentes, pois você pode usá-los para consultar dados de blockchain e bloquear dados em contratos inteligentes. Nos próximos artigos, discutiremos como usar outras APIs para explorar sua interação com a blockchain da Ontology.



Você é desenvolvedor? Verifique se você se juntou à nossa comunidade de tecnologia no Discord . Além disso, dê uma olhada no Developer Center em nosso site. Lá você encontra ferramentas, documentação e muito mais para desenvolvedores.

Encontre ontologia em outro lugar


Site de ontologia
Github / discord
Telegrama ( inglês / russo )
Twitter / Reddit /

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


All Articles