原创 | 工匠 (来自本体社区的技术人员)
---------------
写在前面
最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。
由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!
目录:
1. Runtime dAPI有哪些?
2. 如何调用dAPI?
2.1 Runtime.Log
2.2 Runtime.Notify(object[])
2.3 GetTime
2.4 GetCurrentBlockHash
2.5 CheckWitness
1.Runtime dAPI有哪些?
Runtime dAPI就是智能合约在执行时地dAPI,一共有9个,如下图:
1.1 GetTime:
返回最近块的时间戳
1.2 GetCurrentBlockHash :
返回最近块的块哈希
1.3 Runtime.Notify(object[]) :
调用合约之后,返回地结构,在智能合约中,向正在执行此智能合约的客户端发送通知(包括套接字通知或rpc查询)
1.4 Runtime.Log:
用在debug Run时,发送运行的信息,只是在本地调试时用的,预执行和执行是不能用这个dAPI的
1.5 Serialize(item):
将项目序列化为bytearray
1.6 Deserialize(item):
从字节数组反序列化项目
1.7 Base58ToAddress(base58_address):
将base58地址转换为字节数组形式的地址
1.8 AddressToBase58:
将字节数组形式的地址转换为base58地址
1.9 Runtime.CheckWitness(hash_or_pubkey:byte []):
验证用户或合同的操作权限
1.如何调用Runtime dAPI?
2.1 Runtime.Log
copy调用Log的合约代码如下:
编译后,执行debug run,结果如下:
2.2 Runtime.Notify(object[]) :
copy调用Notify的合约代码如下:
编译后,执行debug run,结果如下:
可以看到返回的结果时十六进制数,但是它对应的也是hello world,我们把这个十六进制数转换一下,如下图:
可以看到转换完成的确实时hello world。
2.3 GetTime
copy调用GetTime的合约代码如下:
编译后,不能再执行debug run,因为要从链上读取数据,需要先部署,然后执行预执行,得到的结果时378a185d,然后转换一下,得到的结果是1561889335 ,单位是秒,如下图:
2.4 GetCurrentBlockHash
copy调用GetCurrentBlockHash的合约代码如下:
编译后,需要先部署,然后执行预执行,结果如下:
这个哈希是最近生成的哈希的反序。
2.5 CheckWitness
这个dAPI非常重要,它会对函数的调用者身份进行检查,比如一个智能合约是老板给员工发工资,那么这个合约就只能由老板调用,不能由员工调用,入股检查到合约的调用者不是本人,它就会倒退回原先的状态。
copy调用CheckWitness的合约代码如下:
编译后,部署,然后运行,返回的结果是0,如下:
这是正确的结果,因为代码里的地址不是绑定的钱包的地址,说明调用合约的人和合约规定的人不是同一个人,它检查没通过,所以报错了。
然后我们把合约里的地址改成我们自己钱包的地址,再编译、部署和运行,结果就正确了,如下图:
到这里Runtime相关的dAPI就学完了。
写在最后
希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!
转载:https://blog.csdn.net/ontologycoding/article/details/101213156