Как разработать смарт-контракт с помощью Python в сети Ontology
Часть первая
Все упомянутые логотипы и торговые марки являются собственностью соответствующих компаний.
Оригинал текста. Перевод hashrate-and-shares.ru.
Предисловие
В предыдущих технических статьях мы представили систему смарт-контрактов, поддерживаемую основной сетью (MainNet) Ontology и инструмент разработки смарт-контрактов SmartX. Мы уверены, что многие из вас ждут, чтобы испытать их.
В этой статье мы начнём знакомство с API смарт-контракта Ontology. API смарт-контракта Ontology разделен на 7 модулей: Blockchain & Block API, Runtime API, Storage API, Native API, Upgrade API, Execution Engine API и 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
1.1 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
1.2 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
1.3 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 в подобную строку:
\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f
Ниже приведен пример функции GetTransactionByHash, которая берёт транзакцию посредством хеша транзакции:
from ontology.interop.System.Blockchain import GetTransactionByHash
def demo():
# tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1"
tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f")
tx=GetTransactionByHash(tx_hash)
return tx
1.4 GetTransactionHeight
Разработчики могут использовать функцию GetTransactionHeight, чтобы получить высоту транзакции посредством хеша транзакции. Давайте возьмём хеш из примера выше:
from ontology.interop.System.Blockchain import GetTransactionHeight
def demo():
# tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1"
tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f")
height=GetTransactionHeight(tx_hash)
return height
1.5 GetContract
Разработчики могут использовать функцию GetContract, чтобы получить контракт посредством хеша контракта. Процесс преобразования хеша контракта является соответствующим процессу преобразования хеша транзакции, который упомянут выше.
from ontology.interop.System.Blockchain import GetContract
def demo():
# contract_hash="d81a75a5ff9b95effa91239ff0bb3232219698fa"
contract_hash=bytearray(b"\xfa\x98\x96\x21\x32\x32\xbb\xf0\x9f\x23\x91\xfa\xef\x95\x9b\xff\xa5\x75\x1a\xd8")
contract=GetContract(contract_hash)
return contract
1.6 GetBlock
Разработчики могут использовать функцию GetBlock, чтобы получить блок. Существует два пути, чтобы получить конкретный блок.
1.6.1 Получить блок по высоте блока:
from ontology.interop.System.Blockchain import GetBlock
def demo():
block=GetBlock(1408)
return block
1.6.2 Получить блок по хешу блока:
from ontology.interop.System.Blockchain import GetBlock
def demo():
block_hash=bytearray(b'\x16\xe0\xc5\x40\x82\x79\x77\x30\x44\xea\x66\xc8\xc4\x5d\x17\xf7\x17\x73\x92\x33\x6d\x54\xe3\x48\x46\x0b\xc3\x2f\xe2\x15\x03\xe4')
block=GetBlock(block_hash)
2. Как использовать Block API
Существуют три доступные функции в Block API: GetTransactions, GetTransactionCount, и GetTransactionByIndex. Мы разберём их одну за другой.
2.1 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
2.2 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
2.3 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.
Вы разработчик? Присоединяйтесь к нашему техническому сообществу на Discord. Кроме того, загляните в Центр разработчиков на нашем сайте, там вы можете найти инструменты разработчика, документацию и многое другое.
Об Ontology
- Как разработать смарт-контракт с помощью Python в сети Ontology. Часть вторая
- Как разработать смарт-контракт с помощью Python в сети Ontology. Часть первая
- Ontology: подробно об Ontology, новости Ontology, курс ONT онлайн
- Графики изменения курса ONT (Ontology) в реальном времени к USD и USDT
- Обзор ONTO Wallet и стейкинга криптовалюты Ontology
Новости Ontology
На сайте
- Callisto Network Overview Three Years After Mainnet Launch
- Разработчики из EthereumPoW Core объявили о роспуске своей команды
- Расскажем простым языком о Биткоине
- Как разработать WASM-контракт с помощью Rust в сети Ontology
- Протокол с нулевым разглашением
- Масштабирование Ethereum (ETH) 2.0 с помощью bloXroute
- Помощь проекту
- Майнинг: пулы и программы для майнинга, блогер Солёный, NiceHash
- Леса — основа стабильного климата. Как технологии помогут их защитить?
- Графики изменения курса BNB (Binance Coin) в реальном времени к BTC, USD и USDT
06.11.2019