继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

以太坊如何估计估算计算gas?

AI人工智能视频入门
关注TA
已关注
手记 330
粉丝 93
获赞 396

以太坊如何估计估算计算gas?Etherscan上transaction info中有个gas used by txn,结果跟remix给的结果以及geth中getTransactionReceipt的gasUsed给的结果都会是一致的,可以直接用geth或是remix模拟估算gas cost。

之前一直没把这个问题搞清楚,所以干脆做个试验看一下.

remix浏览器下方有个可执行的log页面,可以detail以及debug,非常方便。

https://img2.mukewang.com/5ae071780001452209880410.jpg

有gas cost的地方有两个地方,transaction cost以及 execution cost,這两个有什么不同呢?可以參考一下他们的源码

简单说一下: transaction cost指的是将交易送至ethereum blockchain所耗费的cost,是基于data size的大小,部署合约时就是基于合约內容的大小. execution cost指的是虚拟机(VM)执行所需的cost,而在部署合约时,会去执行建構子以及一些初始化的工作.

在这里做一个简单的合约试验:

contract Test {

bytes32 public tmp;

function test(

bytes32 input,uint num

)

constant returns (bytes32){

bytes32 result = input;for(uint i = 0; i < num; i++) {

result = sha3(result);

}

}

function set(bytes32 input, uint num) {

tmp = test(input, num);

} }

如果直接呼叫constant function的话,因为是由本身节点去计算不会更改到区块链上的值,是不会消耗gas的,但是如果是由一个一般合约(非constant function call)去呼叫一个constant function的話,因为让矿工来计算constant function,所以会消耗gas.

上面的简单合约中,我让test函数对第一个bytes32参数做sha3,第二个uint参数代表做几次loop,我分別对set函数和test函数带入10以及1000的参数,結果如下.

  1. set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)  

  2.   

  3. transaction cost:30628execution  

  4.   

  5. cost:6988   

  6.   

  7.   

  8.   

  9. set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)  

  10.   

  11. transaction cost:196022  

  12.   

  13. execution cost:172318  

  14.   

  15.    

  16.   

  17. test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)  

  18.   

  19. transaction cost:25663 (cost only applies when called by a contract)  

  20.   

  21. execution cost:2023 (cost only applies when called by a contract)   

  22.   

  23.   

  24.   

  25. test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)  

  26.   

  27. transaction cost:191057(cost only applies when called by a contract)  

  28.   

  29. execution cost:167353(cost only applies when called by a contract)  


ps:用transaction cost减去execution cost的话1, 3得到23640,2, 4得到23704

大致上就是这样一个过程.发现参数设定成1000时,也会造成transaction cost的提高.(初步猜想加上ps的计算:transaction cost中是已经包含了execution cost,一并计算在最后要支付给miner的fee,因为每个相减结果都差不多)

另外geth的estimateGas的之所以会不太准确是因为一些不确定性的operator操作会不同,比如说,在一个contract中,若是blockhash的尾数是奇数,他就去执行会消耗大量gas的合约,反之则去执行hello world合约,所以他的gas cost很大的情况下是一半一半.

所以永远要记得设定一个合理的gas limit来防止自己遭受恶意攻击.

另外建议可以参考traceTransaction指令,可以看每一個opcode的gas cost. 为了要确认矿工处理transaction的情况,在ropsten testnet上做个简单的试验.首先在ropsten faucet上拿一点儿ether来玩,然后在metamask上送出交易,因为ropsten是模拟pow的环境,所以我相信应该会是正确的数字.

重要的话再说一次结论:Etherscan上transaction info中有个gas used by txn,结果跟remix给的结果以及geth中getTransactionReceipt的gasUsed给的结果都会是一致的,以后可以直接用geth或是remix模拟估算gas cost.

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP