从零学本体dApp开发(22): 分片合约也可调用执行引擎API

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

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

写在前面

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

 

由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!

 

目录:

1. 执行引擎相关的API有哪些?

2. GetExecutingScriptHash怎么用?

3. GetCallingScriptHash怎么用?

4. GetEntryScriptHash怎么用?

1.执行引擎相关的API有哪些?

 

本体执行相关的API主要有如下3个:

GetExecutingScriptHash:得到智能合约的哈希值,这个哈希值是真实哈希值的倒序

GetCallingScriptHash:得到调用该API的调用者者(通常是函数)的合约哈希

GetEntryScriptHash:得到源头的合约的哈希

 

GetCallingScriptHash和GetEntryScriptHash一般放在一起使用,这样可以避免黑客通过跨合约调用,攻击你的合约。

 

2.GetExecutingScriptHash怎么用?

 

将包含GetExecutingScriptHash这个API的合约的代码copy到SmartX中,如下图:

编译没错误的话,就可以部署了,部署的时候发现返回了错误,如下图:

 

这里错误的原因是solo-chain没有打开,如下图:

可以看到区块高度是0,我们点击“Start”启动solo-chain,再部署一次合约就成功了。

部署成功后我们选择运行的函数是get_contract_hash,如下图:

 

 

因为这个函数是从区块链上查询讯息,所以我们可以不运行,使用运行与执行来减少ONG的消耗,

我们可以看到与执行返回的哈希如下图:

显示的合约值和SmartX右上角真实的哈希值是反序的关系,即第一个byte是真实的最后一个byte,再虚拟机中用到的所有合约的哈希都是真实哈希的倒序。如下图:

 

 

3.GetCallingScriptHash怎么用?

 

将包含GetExecutingScriptHash这个API的合约的代码copy到SmartX中,如下图:

 

我们可以看到这个代码里有两个函数,内容都是一样的,即都是调用GetExecutingScriptHash这个API。

编译后,部署成功,同样只要预执行,可以选择运行的函数有两个,一个是GetCallingScriptHash_test1,里一个是GetCallingScriptHash_test2,我们分析运行这两个函数,得到的结果如下图:

 

 

可以看到两次调用返回的哈希值是不一样的,这样就可以理解为给了每个函数唯一的ID号,

决定ID不同的条件一个是函数不同,还有一个是调用这个函数的合约不同,但是切换一个钱包账号来调用得到的哈希是一样的,所以决定返回哈希值的因数一个是函数本身,另一个是调用它的合约。

 

4.GetEntryScriptHash怎么用?

 

这里涉及一个合约调用另外一个合约,所以实验需要两个合约,要打开两个SmartX窗口,

复制合约B到一个SmartX窗口中,如下:

 

 

合约A是对合约B进行调用,复制到另一个窗口,这里需要注意,代码中需要填入B合约的哈希值,所以要先编译合约B得到哈希值,然后复制到合约A的代码里,如下图:

 

 

部署并预执行B合约,分别执行它的两个函数,得到结果如下:

 

第一行得到的两个哈希值是一样的,说明B在没被其他合约调用的情况下,GetCallingScriptHash和GetEntryScriptHash的结果是一样的。

 

写在最后

希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值