Como escrever um contrato inteligente com Python ontologia? Parte 4: API nativa

imagem

Anteriormente, introduzi o Contrato inteligente de ontologia em
Parte 1: Blockchain e API de bloco e
Parte 2: API de armazenamento
Parte 3: API de tempo de execução
Hoje, vamos falar sobre como invocar um contrato inteligente nativo da Ontologia por meio da API nativa . Uma das funções mais típicas da chamada de contrato nativo é a transferência de ativos.

1. Introdução


A API nativa possui apenas uma API. Ao usar a função Invoke, você precisa usar a função de estado interno para ajudá-lo a encapsular os parâmetros. Veja abaixo para aprender como usar as funções.

imagem

Agora vamos entrar em mais detalhes sobre como usar essas 2 APIs. Antes disso, você pode criar um novo contrato na ferramenta de desenvolvimento de contratos inteligentes Ontology SmartX e siga as instruções abaixo. Como de costume, no final do artigo, fornecerei um link para o código-fonte.

Como usar a API nativa


Como de costume, você precisa importar as 2 funções da seguinte maneira antes de usá-las.

from ontology.interop.Ontology.Native import Invoke from ontology.builtins import state 

Lista de contratos nativos de ontologia


Atualmente, existem 6 contratos nativos de ontologia disponíveis para desenvolvedores. Abaixo está a lista dos 6 contratos nativos que podem ser chamados pela API nativa.

imagem

No contrato, você só precisa converter o endereço do contrato em um formato de bytearray e invocá-lo.

Por exemplo , quando você precisar chamar um contrato do ONT Token, poderá primeiro converter o endereço do contrato do ONT Token para o formato bytearray e depois chamar a função Invoke. Ao chamar a função Invoke, os parâmetros importados são o número da versão, o endereço do contrato, o método do contrato invocado e os parâmetros relacionados à transferência encapsulados pela função state.

Um ponto particular a ser observado aqui é que, ao fazer uma transferência de contrato para uma ONG, a quantidade preenchida é 10 vezes a quantidade real. Ou seja, se você precisar transferir 10 ONGs, a quantidade precisa ser preenchida é 10¹⁰. Ao usar uma carteira, como ONTO ou Cyano para transferir, a quantidade inserida é o valor da transferência.

 contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') param = state(from_acct, to_acct, ont_amount) res = Invoke(1, contract_address_ONT, 'transfer', [param]) 

Código do contrato de transferência


Abaixo, apresentamos um exemplo detalhado de como usar o Python para transferir ONT e ONG . No código abaixo, o tipo de parâmetro da conta de envio importada e o endereço de recebimento é uma sequência. Além disso, também pode ser entregue com um tipo de endereço de parâmetro de conta, economizando a taxa de Gás por invocar o contrato. O processo é o seguinte:

  1. Defina as variáveis ​​de endereço do contrato contract_address_ONT e contract_address_ONG;
  2. Converta o endereço de envio e recebimento do formato base58 para o formato bytearray;
  3. Verifique a assinatura e confirme se o endereço de envio é o mesmo que o endereço de chamada do contrato;
  4. A função state encapsula os parâmetros relacionados à transferência;
  5. A função Invoke chama o contrato nativo ONT Token e ONG Token para transferência;
  6. Determine se a transferência foi bem-sucedida retornando res. Se o valor de retorno for b '\ x01', a transferência será bem-sucedida e o evento "transferência bem-sucedida" será enviado.

 from ontology.interop.System.Runtime import Notify, CheckWitness from ontology.interop.Ontology.Runtime import Base58ToAddress from ontology.interop.Ontology.Native import Invoke from ontology.builtins import state # contract address contract_address_ONT = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') contract_address_ONG = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') def Main(operation, args): if operation == 'transfer': from_acct = args[0] to_acct = args[1] ont_amount = args[2] ong_amount = args[3] return transfer(from_acct,to_acct,ont_amount,ong_amount) return False def transfer(from_acct, to_acct, ont_amount, ong_amount): # convert base58 address to address in the form of byte array from_acct=Base58ToAddress(from_acct) to_acct=Base58ToAddress(to_acct) # check whether the sender is the payer if CheckWitness(from_acct): # transfer ONT if ont_amount > 0: param = state(from_acct, to_acct, ont_amount) res = Invoke(1, contract_address_ONT, 'transfer', [param]) if res and res == b'\x01': Notify('transfer succeeded') else: Notify('transfer failed') # transfer ONG if ong_amount > 0: param = state(from_acct, to_acct, ong_amount) res = Invoke(1, contract_address_ONG, 'transfer', [param]) if res and res == b'\x01': Notify('transfer succeeded') else: Notify('transfer failed') else: Notify('CheckWitness failed') 

Prática em SmartX


Você também pode compilar e executar o exemplo de código acima no SmarX, seguindo as etapas abaixo:

  • Compile o contrato. Primeiro, crie um projeto no SmartX e compile o código neste projeto.

imagem
  • Implante o contrato. Se você precisar de um token de teste para implantar o contrato, inscreva-se aqui . O resultado da implantação é o seguinte:

imagem

  • Execute a função de transferência. Antes de executar a função de transferência, você precisa configurar os parâmetros conforme necessário. No exemplo abaixo, você precisa inserir o endereço de envio, o endereço de recebimento e a quantidade transferida de ONT e ONG:

imagem

  • Transferência realizada. Depois de configurar os parâmetros corretamente, a transferência será bem-sucedida ao executar a função de transferência. O token transferido será exibido no endereço de recebimento acima:

imagem

Sumário


Neste artigo, introduzimos a API nativa da blockchain Ontology. Os desenvolvedores podem usar essa API para invocar contratos nativos da Ontologia. No próximo artigo, apresentaremos a API de atualização para explorar como atualizar o contrato nos contratos inteligentes da Ontologia.

Encontre o tutorial no GitHub aqui .



Este é um tutorial oficial publicado anteriormente no blog Ontology Medium
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/pt471358/


All Articles