01 前言
在之前的技术视点文章中,我们介绍了目前本体主网支持的
本体的智能合约 API 分为7个模块,分别是 Blockchain & Block API、Runtime API、Storage API、Native API、Upgrade API、Execution Engine API 以及 Static & Dynamic Call API。本期我们将介绍Blockchain & Block API,这是本体智能合约体系中最基础的部分。其中,Blockchain API 支持基本的在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。
02 Blockchain API 使用方法
智能合约函数的引用与
from ontology.interop.System.Blockchain import GetHeight, GetHeader
2.1 GetHeight
开发者可以使用 GetHeight 来获取当前最新块高,具体例子如下。在后面的例子中,为了节省空间,我们将省略 Main 函数,小伙伴在练习的时候可以根据需要加入。
from ontology.interop.System.Runtime import Notifyfrom ontology.interop.System.Blockchain import GetHeightdef Main(operation): if operation == 'demo': return demo() return False
def demo(): height=GetHeight() Notify(height) # 打印height return height #在函数运行结束后返回height
2.2 GetHeader
开发者可以使用 GetHeader 来获取区块头,参数是某个块的块高。具体例子如下:
from ontology.interop.System.Runtime import Notifyfrom ontology.interop.System.Blockchain import GetHeaderdef demo(): block_height=10 header=GetHeader(block_height) Notify(header)return header
2.3 GetTransactionByHash
开发者可以使用 GetTransactionByHash 函数通过交易哈希获取交易。交易哈希以 bytearray 的格式,作为参数传入 GetTransactionByHash。这个函数的关键在于如何转换将十六进制格式的交易哈希转变为 bytearray 格式的交易哈希。
我们以16进制格式的交易哈希为例,实现将十六进制格式的交易哈希转变为 bytearray 格式的交易哈希。示例哈希如下:
9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1
首先,将该交易哈希反序得到:
c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279
开发者可以通过 SmartX 提供的转换工具 Hex Number(little endian) Number 实现这一步。
然后,将其转成 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}
开发者可以通过 SmartX 提供的转换工具 String Byte Array 实现这一步。
最后,将得到的 bytearray 转换成相应的字符串:
\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f
GetTransactionByHash 函数通过交易哈希获取交易的例子如下:
from ontology.interop.System.Blockchain import GetTransactionByHashdef 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
2.4 GetTransactionHeight
开发者可以使用 GetTransactionHeight 函数通过交易哈希获取交易高度。我们还是以上个例子中的哈希为例:
from ontology.interop.System.Blockchain import GetTransactionHeightdef 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
2.5 GetContract
开发者可以使用 GetContract 函数通过合约哈希获取合约。其中,合约哈希的转换过程与上面讲到的交易哈希转换过程一致。
from ontology.interop.System.Blockchain import GetContractdef 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
2.6 GetBlock
开发者可以使用 GetBlock 函数获取区块。有两种方法可以获取指定区块:
1. 通过块高获取区块:
from ontology.interop.System.Blockchain import GetBlockdef demo(): block=GetBlock(1408) return block
2. 通过区块哈希获取区块:
from ontology.interop.System.Blockchain import GetBlockdef 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)
03 Block API 使用方法
Block API 中可供引用的函数有三个,它们分别是 GetTransactions、GetTransactionCount 和 GetTransactionByIndex。我们依次介绍下这三个函数。
3.1 GetTransactionCount
开发者可以使用 GetTransactionCount 函数获取指定区块的交易数量。
from ontology.interop.System.Blockchain import GetBlockfrom ontology.interop.System.Block import GetTransactionCountdef demo(): block=GetBlock(1408) count=GetTransactionCount(block) return count
3.2 GetTransactions
开发者可以使用 GetTransactions 函数获取获取指定区块的所有交易。
from ontology.interop.System.Blockchain import GetBlockfrom ontology.interop.System.Block import GetTransactions def demo(): block=GetBlock(1408) txs=GetTransactions(block) return txs
3.3 GetTransactionByIndex
开发者可以使用 GetTransactionByIndex 函数获取指定区块的指定交易。
from ontology.interop.System.Blockchain import GetBlockfrom ontology.interop.System.Block import GetTransactionByIndexdef demo(): block=GetBlock(1408) tx=GetTransactionByIndex(block,0) # index starts from 0. return tx
04 后记
Blockchain & Block API 在智能合约中起到查询区块链数据和区块数据的作用,是智能合约最不可缺少的一部分。在后面的技术视点中,我们将讨论如何使用其它 API,探讨它们和本体区块链的交互。本期讲述的所有语法部分我们提供了中文视频,小伙伴们可以观看和学习。
免责声明:本文来自网络投稿,观点仅代表作者本人,不代表自链财经赞同其观点或证实其描述,版权归原作者所有,转载请注明出处。
温馨提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。