Як напісаць смарт-кантракт на Python у сетцы Ontology. Частка 1: Blockchain & Block API

Як напісаць смарт-кантракт на Python у сетцы Ontology. Частка 1: Blockchain & Block API

Гэта першая частка з серыі навучальных артыкулаў аб стварэнні смарт-кантрактаў на Python у блокчейн сеткі Ontology пры дапамозе інструмента распрацоўкі смарт-кантрактаў. SmartX.

У гэтым артыкуле мы пачнем знаёмства з API смарт-кантракта Ontology. API смарт-кантракта Ontology падзелены на 7 модуляў:

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

Blockchain & Block API з'яўляецца асноўнай часткай сістэмы смарт-кантрактаў Ontology. Blockchain API падтрымлівае базавыя аперацыі блокчэйн-запыту, як напрыклад атрыманне бягучай вышыні блока, тады як Block API падтрымлівае базавыя аперацыі блок-запыту, як напрыклад запытванне колькасці транзакцый для дадзенага блока.

Давайце прыступім!

Для пачатку стварыце новы кантракт у SmartX, а затым выконвайце інструкцыі ніжэй.

1. Як выкарыстоўваць Blockchain API

Спасылкі да функцый смарт-кантрактаў з'яўляюцца ідэнтычнымі спасылкам Python. Вы можаце ўводзіць адпаведныя функцыі па меры патрэбы. Напрыклад, ніжэйпрыведзеная інструкцыя ўводзіць GetHeight - функцыю для атрымання бягучай вышыні блока, і GetHeader - функцыю для атрымання загалоўка блока.

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

GetHeight

GetHeight выкарыстоўваюць для атрымання апошняга парадкавага нумара блока ў блокчейне, як паказана ў ніжэйпрыведзеным прыкладзе. У апошнім прыкладзе для зручнасці мы прапусцім функцыю Main, але Вы можаце дадаць яе, калі гэта неабходна.

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, выкарыстоўваюць для атрымання загалоўка блока, параметрам з'яўляецца парадкавы нумар блока ў блокчейне. Прыклад:

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 выкарыстоўваюць для атрымання транзакцыі з дапамогай хеша транзакцый. Хеш транзакцыі пасылаецца ў GetTransactionByHash як параметры ў фармаце bytearray. Ключом да дадзенай функцыі з'яўляецца пераўтварэнне хеша транзакцыі ў hex фармаце ў хэш транзакцыі ў фармаце bytearray. Гэта важны крок. Інакш Вы атрымалі б памылку, якая паказвае, што няма блока з такім хэшам блока. Давайце возьмем хэш транзакцыі ў фармаце hex, як прыклад, каб канвертаваць яго ў фармат bytearray. Прыклад выглядае наступным чынам:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Спачатку рэверсуе хэш транзакцыі:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Распрацоўнікі могуць ажыццявіць гэты крок з дапамогай прылады канвертавання Hex Number(little endian)Number, які падаецца SmartX.

Затым пераўтварыце атрыманы вынік у фармат 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}

Гэта можна зрабіць з дапамогай інструмента пераўтварэнні String Byte Array, які прадастаўляецца SmartX. Напрыканцы, пераўтварыце атрыманы bytearray у такі радок:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

Ніжэй прыведзены прыклад функцыі GetTransactionByHash, якая бярэ транзакцыю з дапамогай хеша транзакцыі:

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 выкарыстоўваюць для атрымання вышыні транзакцыі з дапамогай хеша транзакцыі. Давайце возьмем хэш з прыкладу вышэй:

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

GetContract

Распрацоўнікі могуць выкарыстоўваць функцыю GetContract, каб атрымаць кантракт з дапамогай хеша кантракту. Працэс пераўтварэння хеша кантракту з'яўляецца адпаведным працэсу пераўтварэння хеша транзакцыі, які згаданы вышэй.

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 выкарыстоўваюць для атрымання блока. Існуе два шляхі, каб атрымаць канкрэтны блок.

1. Атрымаць блок па вышыні блока:

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

2. Атрымаць блок па хешу блока:

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

2. Як выкарыстоўваць Block API

Існуюць тры даступныя функцыі ў Block API: GetTransactions, GetTransactionCount, І GetTransactionByIndex. Мы разбяром іх адну за адной.

GetTransactionCount

GetTransactionCount выкарыстоўваюць для атрымання колькасці транзакцый для дадзенага блока.

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

Распрацоўнікі могуць выкарыстоўваць функцыю GetTransactions, каб атрымаць усе транзакцыі ў дадзеным блоку.

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 выкарыстоўваюць для атрымання канкрэтнай транзакцыі ў гэтым блоку.

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

Поўнае кіраўніцтва можна знайсці на нашым GitHub.

пасляслоўе

Blockchain & Block API з'яўляецца незаменнай часткай смарт-кантрактаў, паколькі Вы можаце выкарыстоўваць іх, каб запытаць дадзеныя блокчейна і дадзеныя блока ў смарт-кантрактах. У наступных артыкулах мы абмяркуем, як выкарыстоўваць астатнія API і высветлім іх узаемадзеянне з блокчейном Ontology.

Артыкул быў перакладзены рэдакцыяй Hashrate&Shares спецыяльна для OntologyRussia. клік

Вы распрацоўшчык? Далучайцеся да нашай тэхнічнай супольнасці на дысананс. Акрамя таго, зазірніце ў Цэнтр распрацоўшчыкаў на нашым сайце, там вы можаце знайсці інструменты распрацоўшчыка, дакументацыю і многае іншае.

Ontology

Крыніца: habr.com

Дадаць каментар