Cum să scrii un smart contract pe Python în rețeaua Ontology. Partea 1: Blockchain & Block API

Cum să scrii un contract inteligent în Python pe rețeaua Ontology. Partea 1: Blockchain & Block API

Aceasta este prima parte dintr-o serie de articole educaționale despre crearea de contracte inteligente în Python în rețeaua blockchain Ontology, folosind instrumentul de dezvoltare a contractelor inteligente. SmartX.

În acest articol, vom începe să ne familiarizăm cu API-ul contractului inteligent Ontology. API-ul contractului inteligent Ontology este împărțit în 7 module:

  1. Blockchain & Block API,
  2. Runtime API,
  3. Storage API,
  4. Native API,
  5. Upgrade API,
  6. Execution Engine API și
  7. Static & Dynamic Call API.

Blockchain & Block API este partea principală a sistemului de contracte inteligente Ontology. API-ul Blockchain susține operațiuni de bază pentru cererile blockchain, cum ar fi obținerea înălțimii curente a blocului, în timp ce API-ul Block susține operațiuni de bază pentru cererile de bloc, cum ar fi solicitarea numărului de tranzacții pentru un anumit bloc.

Să începem!

Pentru început, creați un nou contract în SmartX, apoi urmați instrucțiunile de mai jos.

1. Cum să utilizați Blockchain API

Legăturile către funcțiile contractelor inteligente sunt identice cu legăturile Python. Puteți introduce funcțiile corespunzătoare după necesitate. De exemplu, instrucțiunea de mai jos introduce GetHeight— funcția pentru obținerea înălțimii curente a blocului, și GetHeader— funcția pentru obținerea titlului blocului.

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

GetHeight

GetHeight este utilizat pentru a obține ultimul număr de ordine al blocului în blockchain, așa cum se arată în exemplul de mai jos. În ultimul exemplu, pentru comoditate, vom omite funcția Main, dar o puteți adăuga dacă este necesar.

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 este utilizat pentru a obține titlul blocului, parametrul fiind numărul de ordine al blocului în blockchain. Exemplu:

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 este utilizat pentru a obține tranzacția prin hash-ul tranzacțiilor. Hash-ul tranzacției este trimis în GetTransactionByHash ca parametru în format bytearray. Cheia acestei funcții este conversia hash-ului tranzacției din format hex în hash-ul tranzacției în format bytearray. Acesta este un pas important. Altfel, veți primi o eroare care indică că nu există un bloc cu acest hash. Să luăm hash-ul tranzacției în format hex ca exemplu pentru a-l converti în format bytearray. Exemplul arată astfel:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Mai întâi, răsturnați hash-ul tranzacției:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Dezvoltatorii pot realiza acest pas cu ajutorul instrumentului de conversie Hex Number (little endian) oferit de SmartX.

Apoi, transformați rezultatul obținut într-un format 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}

Acest lucru se poate face cu ajutorul instrumentului de conversie String Byte Array, care este furnizat de SmartX. La final, transformați bytearray-ul obținut într-un string similar:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

Mai jos este un exemplu de funcție GetTransactionByHash, care preia o tranzacție prin intermediul hash-ului tranzacției:

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 este utilizat pentru a obține înălțimea unei tranzacții prin intermediul hash-ului tranzacției. Să luăm hash-ul din exemplul de mai sus:

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

GetContract

Dezvoltatorii pot utiliza funcția GetContract pentru a obține un contract prin intermediul hash-ului contractului. Procesul de conversie a hash-ului contractului este similar cu cel al hash-ului tranzacției menționat mai sus.

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 este utilizat pentru a obține un bloc. Există două modalități de a obține un bloc specific.

1. Obțineți blocul după înălțimea blocului:

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

2. Obțineți blocul după hash-ul blocului:

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

2. Cum să utilizați Block API

Există trei funcții disponibile în Block API: GetTransactions, GetTransactionCount, și GetTransactionByIndex. Le vom analiza una câte una.

GetTransactionCount

GetTransactionCount este utilizat pentru a obține numărul de tranzacții pentru un anumit bloc.

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

Dezvoltatorii pot utiliza funcția GetTransactions pentru a obține toate tranzacțiile din acest bloc.

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 este utilizat pentru a obține o tranzacție specifică din acest bloc.

from ontology.interop.System.Blockchain import GetBlock
from ontology.interop.System.Block import GetTransactionByIndex
def demo():
    block=GetBlock(1408)
    tx=GetTransactionByIndex(block,0) # indexul începe de la 0.
    return tx

Ghidul complet poate fi găsit pe site-ul nostru GitHub.

Cuvânt înainte

Blockchain & Block API este o parte esențială a contractelor inteligente, deoarece le puteți utiliza pentru a solicita datele blockchain-ului și datele blocului în contractele inteligente. În articolele următoare, vom discuta despre utilizarea celorlalte API-uri și vom explora interacțiunile lor cu blockchain-ul Ontology.

Articolul a fost tradus de redacția Hashrate&Shares special pentru OntologyRussia. clic

Ești dezvoltator? Alătură-te comunității noastre tehnice pe Discord. De asemenea, aruncă o privire pe Centrul de Dezvoltatori pe site-ul nostru, unde puteți găsi instrumente pentru dezvoltatori, documentație și multe altele.

Ontology

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster