原创 | 工匠 (来自本体社区的技术人员)
---------------
写在前面
最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。
由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、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的结果是一样的。
写在最后
希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!