Як написати смарт-контракт на 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. клік

Ви розробник? Приєднуйтесь до нашої технічної спільноти на Discord. Крім того, загляньте в Центр розробників на нашому сайті, там ви можете знайти інструменти розробника, документацію та багато іншого.

Онтологія

Джерело: habr.com

Додати коментар або відгук