Jak napisać smart kontrakt w Pythonie w sieci Ontology. Część 1: Blockchain i Block API

Jak napisać inteligentny kontrakt w Pythonie w sieci Ontology. Część 1: Blockchain & Block API

To pierwsza część serii artykułów edukacyjnych na temat tworzenia smart kontraktów w Pythonie w sieci blockchain Ontology za pomocą narzędzia do tworzenia smart kontraktów. SmartX.

W tym artykule rozpoczniemy zapoznawanie się z API smart kontraktu Ontology. API smart kontraktu Ontology jest podzielone na 7 modułów:

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

Blockchain i Block API jest kluczową częścią systemu smart kontraktów Ontology. Blockchain API wspiera podstawowe operacje związane z zapytaniami blockchain, takie jak pobieranie bieżącej wysokości bloku, podczas gdy Block API wspiera podstawowe operacje zapytaniowe związane z blokami, takie jak zapytanie o liczbę transakcji dla danego bloku.

Przejdźmy do rzeczy!

Na początek stwórz nowy kontrakt w SmartX, a następnie postępuj zgodnie z poniższymi instrukcjami.

1. Jak używać Blockchain API

Odnośniki do funkcji smart kontraktów są identyczne z odnośnikami w Pythonie. Możesz wprowadzać odpowiednie funkcje w razie potrzeby. Na przykład, poniższa instrukcja wprowadza GetHeight — funkcję do uzyskiwania bieżącej wysokości bloku, oraz GetHeader — funkcję do uzyskiwania nagłówka bloku.

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

GetHeight

GetHeight jest używane do uzyskiwania ostatniego numeru porządkowego bloku w blockchainie, jak pokazano w poniższym przykładzie. W ostatnim przykładzie dla ułatwienia pominiemy funkcję Main, ale możesz ją dodać, jeśli to konieczne.

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 jest używane do uzyskiwania nagłówka bloku, a jego parametrem jest numer porządkowy bloku w blockchainie. Przykład:

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 jest używane do uzyskiwania transakcji na podstawie hasha transakcji. Hash transakcji jest wysyłany do GetTransactionByHash jako parametry w formacie bytearray. Kluczowym elementem tej funkcji jest konwersja hasha transakcji w formacie hex na hash transakcji w formacie bytearray. To ważny krok. W przeciwnym razie otrzymasz błąd, który wskazuje, że nie ma bloku z takim hashem. Weźmy hash transakcji w formacie hex, jako przykład, aby przekształcić go w format bytearray. Przykład wygląda następująco:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Najpierw odwróć hash transakcji:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Programiści mogą wykonać ten krok za pomocą narzędzia konwersji Hex Number (little endian), które jest dostarczane przez SmartX.

Następnie przekształć uzyskany wynik w 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}

Można to zrobić za pomocą narzędzia konwersji String Byte Array, które jest dostarczane przez SmartX. Na koniec przekształć uzyskany bytearray w podobny ciąg:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

Poniżej znajduje się przykład funkcji GetTransactionByHash, która pobiera transakcję za pomocą hasha transakcji:

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 używana jest do uzyskania wysokości transakcji za pomocą hasha transakcji. Weźmy hash z powyższego przykładu:

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

GetContract

Programiści mogą używać funkcji GetContract, aby uzyskać kontrakt za pomocą hasha kontraktu. Proces konwersji hasha kontraktu jest analogiczny do procesu konwersji hasha transakcji, który został wcześniej wspomniany.

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 używana jest do uzyskania bloku. Istnieją dwa sposoby, aby uzyskać konkretny blok.

1. Uzyskać blok po wysokości bloku:

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

2. Uzyskać blok po hashu bloku:

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

2. Jak używać Block API

Istnieją trzy dostępne funkcje w Block API: GetTransactions, GetTransactionCount, i GetTransactionByIndex. Omówimy je jedna po drugiej.

GetTransactionCount

GetTransactionCount używana jest do uzyskania liczby transakcji dla danego bloku.

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

Programiści mogą używać funkcji GetTransactions, aby uzyskać wszystkie transakcje w danym bloku.

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 używa się do uzyskania konkretnej transakcji w danym bloku.

from ontology.interop.System.Blockchain import GetBlock
from ontology.interop.System.Block import GetTransactionByIndex
def demo():
    block=GetBlock(1408)
    tx=GetTransactionByIndex(block,0) # indeks zaczyna się od 0.
    return tx

Pełne instrukcje można znaleźć na naszym GitHub.

Epilog

Blockchain & Block API jest niezastąpioną częścią inteligentnych kontraktów, ponieważ możesz ich użyć, aby zażądać danych blockchaina i danych bloków w inteligentnych kontraktach. W następnych artykułach omówimy, jak używać pozostałych API i wyjaśnimy ich interakcje z blockchainem Ontology.

Artykuł został przetłumaczony przez redakcję Hashrate&Shares specjalnie dla OntologyRussia. klik

Jesteś programistą? Dołącz do naszej społeczności technicznej na Discord. Ponadto zajrzyj do Centrum dewelopera na naszej stronie, tam możesz znaleźć narzędzia dla deweloperów, dokumentację i wiele więcej.

Ontology

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster