How to write a smart contract in Python on the Ontology network. Part 1: Blockchain & Block API

How to write a smart contract in Python on the Ontology network. Part 1: Blockchain & Block API

This is the first part in a series of tutorials on creating Python smart contracts on the Ontology blockchain network using the smart contract development tool. SmartX.

In this article, we will begin our acquaintance with the Ontology smart contract API. The Ontology smart contract API is divided into 7 modules:

  1. Blockchain & Block API,
  2. runtime API,
  3. storage API,
  4. native API,
  5. Upgrade API,
  6. Execution Engine API and
  7. Static & Dynamic Call API.

Blockchain & Block API is the main part of the Ontology smart contract system. The Blockchain API supports basic blockchain query operations, such as getting the current block height, while the Block API supports basic block query operations, such as querying the number of transactions for a given block.

Let's get started!

First, create a new contract in SmartXand then follow the instructions below.

1. How to use Blockchain API

Links to smart contract functions are identical to Python links. You can enter the corresponding functions as needed. For example, the following statement introduces a GetHeight function to get the current block height, and a GetHeader function to get the block's header.

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

GetHeight

GetHeight is used to get the last block sequence number in the blockchain, as shown in the example below. In the last example, we will omit the Main function for convenience, but you can add it if necessary.

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 is used to get the block header, the parameter is the serial number of the block in the blockchain. Example:

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 is used to get a transaction via a transaction hash. The transaction hash is sent to GetTransactionByHash as parameters in bytearray format. The key to this function is to convert the transaction hash in hex format to the transaction hash in bytearray format. This is an important step. Otherwise, you would get an error that indicates that there is no block with that block hash. Let's take the transaction hash in hex format as an example to convert it to bytearray format. An example looks like this:

9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

First, reverse the transaction hash:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Developers can accomplish this step using the Hex Number(little endian)Number conversion tool provided by SmartX.

Then convert the result to bytearray format:

{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}

This can be done using the String Byte Array conversion tool provided by SmartX. Finally, convert the resulting bytearray to a similar string:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

The following is an example of a GetTransactionByHash function that takes a transaction using the hash of the transaction:

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 is used to get the transaction height via the transaction hash. Let's take the hash from the example above:

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

GetContract

Developers can use the GetContract function to get a contract via the hash of the contract. The contract hash conversion process is the same as the transaction hash conversion process mentioned above.

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 is used to get a block. There are two ways to get a specific block.

1. Get block by block height:

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

2. Get a block by block hash:

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

2. How to use Block API

There are three available functions in the Block API: GetTransactions, GetTransactionCountand GetTransactionByIndex. We will break them down one by one.

GetTransactionCount

GetTransactionCount is used to get the number of transactions for a given block.

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

Developers can use the GetTransactions function to get all transactions in a given block.

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 is used to get a specific transaction in a given block.

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

A complete guide can be found on our GitHub.

Afterword

The Blockchain & Block API is an indispensable part of smart contracts as you can use them to request blockchain data and block data in smart contracts. In the following articles, we will discuss how to use the rest of the APIs and find out how they interact with the Ontology blockchain.

The article was translated by the editors of Hashrate&Shares especially for OntologyRussia. ΠΊΠ»ΠΈΠΊ

Are you a developer? Join our tech community at Discord. Also, take a look at Developer Center on our website, where you can find developer tools, documentation, and more.

Ontology

Source: habr.com

Add a comment