小言_互联网的博客

从零学本体dApp开发(20): 分片合约也有Runtime dAPI

251人阅读  评论(0)

原创 | 工匠 (来自本体社区的技术人员)

---------------

写在前面

最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。

 

由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场