Python智能合约执行API知多少?
wk国际特价机票
发表于 2023-1-9 11:30:42
88
0
0
上一期我们介绍了本体智能合约存储 API,相信很多小伙伴都明白了在本体上进行 Python 智能合约开发时如何调用相关 API 进行持久化存储。本期我们讨论如何使用 Runtime API(合约执行 API)。Runtime API 共有8个相关的 API,提供了合约执行时常用的接口,帮助开发者获取数据、转换数据以及验证数据。这8个 API 的简单描述如下:
下面我们具体讲述一下这8个 API 的使用方法。在这之前,小伙伴们可以在本体智能合约开发工具 SmartX 中新建一个合约,跟着我们进行操作。同样,在文章最后我们将给出这次讲解的所有源代码以及视频讲解。
02 Runtime API 使用方法
Runtime API 的引用分为两个路径,分别是 ontology.interop.System.Runtime 和 ontology.interop.Ontology.Runtime。其中,Ontology 路径下包含了新增的 API。下列语句引用了这几个 API。
from ontology.interop.System.Runtime import GetTime, CheckWitness, Notify, Serialize, Deserialize
from ontology.interop.Ontology.Runtime import Base58ToAddress, AddressToBase58, GetCurrentBlockHas: t4 f; J6 g9 j' D) K6 f. P9 ?
2.1 Notify API1 K" C- \" t N4 j$ E
Notify 函数将事件推送到全网。如下例子中函数 Notify 将会返回 “hello world” 十六进制字符串,并将其推送全网。4 h4 n- B" `" }$ ^- x
from ontology.interop.System.Runtime import Notify- ] e# O1 T. }$ e: t o
def demo():
Notify("hello world")0 ]0 n+ z* l) ]
小伙伴可以在 Logs 中查看:
8 h" ?3 V% G6 d" I* _, `
2.2 GetTime API( M+ V* i( I2 M! E) H: \' q; M$ t
GetTime 函数返回当前时间戳,即返回调用该函数的 Unix 时间,其单位是秒。
from ontology.interop.System.Runtime import GetTime
def demo():
time=GetTime() g+ V. W2 ^7 q2 F4 f0 l/ M# h$ W2 M' b6 O
return time # 返回时间戳, 单位是秒; o- }) P2 ~: h1 G9 `+ Q
2.3 GetCurrentBlockHash API# C1 H8 d y, G) i* S! K
GetCurrentBlockHash 函数返回当前区块的哈希值。
from ontology.interop.Ontology.Runtime import GetCurrentBlockHash
def demo():
block_hash = GetCurrentBlockHash()
return block_hash
2.4 Serialize 和 Deserialize
这是一对序列化和反序列化函数。其中,Serialize 函数将一个对象序列化成 byte array 对象,而 Deserialize 函数将 byte array 反序列化成原先对象。下面的代码片段实现了将传入参数序列化并存入合约的持久化存储中,同时也实现了从合约的持久化存储中取出数据并把它进行反序列化。
from ontology.interop.System.Runtime import Notify, Serialize, Deserialize
from ontology.interop.System.Storage import Put, Get, GetContext
def Main(operation, args):
if operation == 'serialize_to_bytearray':1 K+ l, g7 ]9 I/ J# g, f
data = args[0]
return serialize_to_bytearray(data)
if operation == 'deserialize_from_bytearray':7 S- i* @* n0 A* D
key = args[0]
return deserialize_from_bytearray(key)/ r* A! b& G" Z' n3 `+ @
return False
def serialize_to_bytearray(data):/ ]) Q1 T( ~' J
sc = GetContext()
key = "1"0 r3 L% b9 f: r/ E2 j9 U
byte_data = Serialize(data) # 序列化传入的参数, B P3 H* F; G& f4 ?* b; t; F
Put(sc, key, byte_data) # 将序列化后的数据存入区块链" e4 P6 Z; M/ ^
def deserialize_from_bytearray(key): d$ m9 i- M0 V5 U5 e% D( G+ ~
sc = GetContext()9 c. g1 M; A5 ^# Y
byte_data = Get(sc, key) # 按key从区块链中取出数据0 _& R Y3 w' E( U S, d, I
data = Deserialize(byte_data) # 将bytearray数据反序列化成原先类型数据
return data4 q% g4 I$ b, a. I b7 ]# f
2.5 Base58ToAddress & AdressToBase58
这是一对地址转换函数。其中,Base58ToAddress 函数将 base58 编码的地址转成 byte array 形式地址,而 AddressToBase58 则将 byte array 形式地址转成 base58 编码的地址。
from ontology.interop.Ontology.Runtime import Base58ToAddress, AddressToBase586 l& g* y6 c5 u) p
def demo():
base58_addr="AV1GLfVzw28vtK3d1kVGxv5xuWU59P6Sgn"
addr=Base58ToAddress(base58_addr) # 将 base58 地址转成 bytearray形式地址& U) ~2 t6 f6 v$ ]9 X+ \# i: \
Notify(addr)
base58_addr=AddressToBase58(addr) #将bytearray地址转为base58地址+ w: ~, l) H/ T) n0 x
Notify(base58_addr)
2.6 CheckWitness
CheckWitness(fromAcct) 函数有两个功能:
验证当前的函数调用者是不是 fromAcct 。若是(即签名验证通过),则函数返回通过。% H$ T- V _& I5 {! P1 l
检查当前函数调用者是不是一个合约。若是合约,且是从该合约发起去执行函数,则验证通过。即,验证 fromAcct 是不是 GetCallingScriptHash() 的返回值。其中,GetCallingScriptHash() 函数可以得到调用当前智能合约的合约哈希值。
GetCallingScriptHash():
https://github.com/ontio/ontology-python-compiler/blob/master/ontology/interop/System/ExecutionEngine.py1 `/ J3 ]# y' E1 z7 t. s( } y" ]
from ontology.interop.System.Runtime import CheckWitness. g/ X! q2 F1 _0 L
from ontology.interop.Ontology.Runtime import Base58ToAddress: U |. p! ]7 F7 j
def demo():
addr=Base58ToAddress("AW8hN1KhHE3fLDoPAwrhtjD1P7vfad3v8z")% h: b6 }, X* F( K. L
res=CheckWitness(addr) # 验证调用者地址是否为AW8hN1KhHE3fLDoPAwrhtjD1P7vfad3v8z! a$ Z) J9 ~; H6 H- o8 }- ~( A
return res9 ?8 S! }6 s0 Y" \' \0 Y/ K5 W& h
03 总结
本次技术视点中我们介绍了本体区块链的 Runtime API,该类 API 在本体 Python 智能合约中用处十分巨大。在下一期技术视点中,我们将介绍 Native API,探讨如何在本体智能合约中进行转账等操作。本期讲述的所有语法部分我们提供了中文视频,小伙伴们可以观看学习。
成为第一个吐槽的人