01 前言
在之前的技术视点文章中,我们介绍了目前本体主网支持的智能合约体系以及相应的智能合约开发工具 SmartX。很多小伙伴都想上手练一练。在本期的本体技术视点中,我们将正式开始讲述智能合约语法部分。本体的智能合约 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 支持基本的区块链查询操作,如获取当前块高等;Block API 支持基本的区块查询操作,如查询指定区块交易数等。同时,文末将提供视频讲解。
在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。
02 Blockchain API 使用方法
智能合约函数的引用与 Python 的引用如出一辙。开发者可以根据需要引入相应的函数。例如,下面语句引入了获取当前最新块高函数 GetHeight 和获取区块头函数 GetHeader。
2.1 GetHeight
开发者可以使用 GetHeight 来获取当前最新块高,具体例子如下。在后面的例子中,为了节省空间,我们将省略 Main 函数,小伙伴在练习的时候可以根据需要加入。
2.2 GetHeader
开发者可以使用 GetHeader 来获取区块头,参数是某个块的块高。具体例子如下:
2.3 GetTransactionByHash
开发者可以使用 GetTransactionByHash 函数通过交易哈希获取交易。交易哈希以 bytearray 的格式,作为参数传入 GetTransactionByHash。这个函数的关键在于如何转换将十六进制格式的交易哈希转变为 bytearray 格式的交易哈希。我们以16进制格式的交易哈希为例,实现将十六进制格式的交易哈希转变为 bytearray 格式的交易哈希。示例哈希如下:
首先,将该交易哈希反序得到:
开发者可以通过 SmartX 提供的转换工具 Hex Number(little endian) <--> Number 实现这一步。然后,将其转成 bytearray 格式:
开发者可以通过 SmartX 提供的转换工具 String <--> Byte Array 实现这一步。最后,将得到的 bytearray 转换成相应的字符串:
GetTransactionByHash 函数通过交易哈希获取交易的例子如下:
2.4 GetTransactionHeight
开发者可以使用 GetTransactionHeight 函数通过交易哈希获取交易高度。我们还是以上个例子中的哈希为例:
2.5 GetContract
开发者可以使用 GetContract 函数通过合约哈希获取合约。其中,合约哈希的转换过程与上面讲到的交易哈希转换过程一致。
2.6 GetBlock
开发者可以使用 GetBlock 函数获取区块。有两种方法可以获取指定区块:1. 通过块高获取区块:
2. 通过区块哈希获取区块:
03 Block API 使用方法
Block API 中可供引用的函数有三个,它们分别是 GetTransactions、GetTransactionCount 和 GetTransactionByIndex。我们依次介绍下这三个函数。
3.1 GetTransactionCount
开发者可以使用 GetTransactionCount 函数获取指定区块的交易数量。
3.2 GetTransactions
开发者可以使用 GetTransactions 函数获取获取指定区块的所有交易。
3.3 GetTransactionByIndex
开发者可以使用 GetTransactionByIndex 函数获取指定区块的指定交易。
04 后记
Blockchain & Block API 在智能合约中起到查询区块链数据和区块数据的作用,是智能合约最不可缺少的一部分。在后面的技术视点中,我们将讨论如何使用其它 API,探讨它们和本体区块链的交互。本期讲述的所有语法部分我们提供了中文视频,小伙伴们可以观看和学习。
视频观看链接:https://v.qq.com/x/page/x0822d6u8xl.html
*详细代码信息可能显示不全,可参考:https://mp.weixin.qq.com/s/t1sX3aDi5WVTthnc4sMHkQ
文章作者: 本体Ontology我要纠错
原创文章,作者:币圈吴彦祖,如若转载,请注明出处:https://www.kaixuan.pro/news/6790/