原创 | 工匠 (来自本体社区的技术人员)
---------------
写在前面
最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。
由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!
学习本篇的目的:
在《本体SmartX到底是个是啥》一文中我们学习了使用SmartX进行智能合约开发,其中提到智能合约的部署和运行都需要消耗gas,就是ONG,这样篇我们来学学为什么需要消耗gas。
目录:
1. 本体部署和运行智能合约为何要gas?
2. 部署和运行要消耗多少gas?
3. 合约消耗gas的具体过程
智能合约的部署是什么?简单来说就是把智能合约编译出来的可执行文件放到区块链中。部署的过程可以可以理解成你在windows上安装一个软件,但是只是安装,还没有运行。智能合约的调用,就好比是windows上安装的这个软件运行起来了。
一开始我不能理解为什么部署也要消耗gas,后经社区专业人员的讲解弄懂了。区块链上的资源,如RAM、CPU和网络等,都非常的宝贵的,就像EOS中租用任意一种资源都要收费的。把合约部署到区块链上,其实是会占用RAM的,所以智能合约的内容越大,需要消耗的gas就越贵。
而智能合约执行,需要消耗gas也好理解了,因为代码执行是需要占用CPU和网络资源的,这些资源有些是节点提供的,所以消耗的gas都会奖励给节点(即矿工)。
在SmartX进行智能合约部署时,会调用Cyano wallet钱包。就像你在网上买东西,付款时要绑定银行卡一样。调用的界面如下:
里面会涉及到连个数量,Gas price和Gas limit。
Gas limit 是在执行智能合约的 opcode 过程中计步时使用,理论上智能合约越复杂,需要的 GAS limit 数量越高,Ontology 交易设定最低的 GAS limit 数量是 20000。
我们知道代码在计算机上时一步一步执行的,本体中智能合约也时按步计费的,智能合约余额复杂,执行的步数就越多,就消耗越多的gas。
GAS price 是给执行 opcode 定价,GAS price 越高,共识节点会优先打包该笔交易。
GAS price 其实就时每步的单价,那么需要消耗的总gas = Gas limit x GAS price 。
这里社区的专业人员用出租车来类比,会很好理解。我们坐出租车按里程计算,里程数就相当于Gas limit,出租车有起步价,就是三公里,而Gas limit 也有起步价,为20000,即你的智能合约执行步数少于20000,也按20000来算。
而每公里的单价就和GAS price 一样,高峰期时我们很难打到车,可以通过加价来更快地打到车,同样的在区块链拥堵时,把GAS price 设的高一点,合约就会被优先执行。
交易费用= GAS limit x GAS price ,实际的交易费用分以下三种情形:
执行 opcode 步数等于 GAS limit
交易费用 = GAS Price x GAS limit
执行 opcode 步数大于 GAS limit
交易费用 = GAS Price x GAS limit
交易失败,但 GAS 不会退还。
执行 opcode 步数小于 GAS limit
交易费用 = GAS Price x (opcode实际消耗)
多余的 GAS 会退还,但最低消费是 20000。
所有的 ONT, ONG 的转账 GAS limit 消费默认固定都是20000。
我们在部署和执行合约要先填写GAS limit 和 GAS price的具体数量,其实就是支付预付款,但实际用款不一定和预付款一样,当实际用款和预付款一样多时,就正好,实际用款小于预付款时,多余的会退回钱包,当实际用款大于预付款是,合约就不能部署或运行成功,但预付款也不会退的。
所以我们在设定GAS limit 时一定要稍微设置的到一点,因为小了,合约不成功,gas也没了。所以要做好gas的估算。
其实合约部署过程中消耗gas,也是一笔交易过程,交易的一方时合约开发者,另一方是本体系统,只不过消耗的这笔gas最终本体系统还要奖励给矿工。
当合约部署成功后,就是交易成功后,SmartX中会显示出这笔交易的相关信息,如下图:
我们可以根据交易的哈希值,到区块链上查询这笔交易,或者直接在solo-chain里面查询,如下如的第一行就是刚刚部署智能合约成功的交易,
点击右侧“Detail”按钮,可以看到详细的信息如下图:
可以看到消耗的gas是10000000000,相当于10个ONG,而交易涉及的两个地址,发送方是我钱包的账户,接受方是治理合约地址,这个gas还会根据本体合约内部的分配规则分配给矿工。
写在最后
希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!