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

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

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

有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的参数,結果如下.

set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)transaction cost:30628executioncost:6988
复制代码
set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)transaction cost:196022execution cost:172318
复制代码
test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)transaction cost:25663 (cost only applies when called by a contract)execution cost:2023 (cost only applies when called by a contract) 复制代码
test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)transaction cost:191057(cost only applies when called by a contract)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.

参考资料:以太坊DApp开发实战入门

可以加微信拉以太坊技术群聊。

以太坊智能合约gas如何估计?相关推荐

  1. 以太坊智能合约安全 Dasp Top10

    译者:爱上平顶⼭ 来源:慢雾区 原文链接:https://www.dasp.co/ 这是分布式应⽤安全项⽬(或DASP)2018 年排名前10的漏洞第⼀次迭代 该项⽬是NCC集团的⼀项举措.这是⼀个开 ...

  2. 以太坊智能合约Demo

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战demo示例快速入门,用demo例 ...

  3. 以太坊智能合约开发第二篇:理解以太坊相关概念

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 很多人都说比特币是区块链1.0,以太坊是区块链2.0.在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太 ...

  4. 教程 | 以太坊智能合约编程之菜鸟教程

    教程 | 以太坊智能合约编程之菜鸟教程 译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下 ...

  5. 以太坊智能合约安全入门了解一下(下)

    作者:RickGray 作者博客:http://rickgray.me/2018/05/26/ethereum-smart-contracts-vulnerabilities-review-part2 ...

  6. 以太坊智能合约安全入门了解一下(上)

    作者:RickGray 作者博客:http://rickgray.me/2018/05/17/ethereum-smart-contracts-vulnerabilites-review/ (注:本文 ...

  7. 浅谈以太坊智能合约的设计模式与升级方法

    浅谈以太坊智能合约的设计模式与升级方法 1. 最佳实践 2. 实用设计案例 2.1 控制器合约与数据合约: 1->1 2.2 控制器合约与数据合约: 1->N 2.3 控制器合约与数据合约 ...

  8. 【以太坊智能合约】Embark Framework 开发基础篇

    在之前的文章中,我们看到了使用Solidity开发以太坊智能合约的所有基本知识.我们使用了以太坊钱包,我们能够轻松设置小型产品开发环境.我们会发现开始的时候很不错,但是如果我们想要更深入的话呢?我们要 ...

  9. 以太坊智能合约编程之带菜鸟入门教程

    手把手带你走上智能合约编程之路 译注:原文首发于ConsenSys开发者博客,原作者为Eva以及ConsenSys的开发团队.如果您想要获取更多及时信息,可以访问ConsenSys首页点击左下角New ...

  10. Python开发以太坊智能合约指南(web3.py)

    在以太坊上获得一个基本的智能合约是一个很简单的事,只需google查询"ERC20代币教程",你会发现有关如何做到这一点的大量信息.以编程方式与合约交互完全是另一回事,如果你是一个 ...

最新文章

  1. 可信计算 沈昌祥_沈昌祥院士在南宁开展网络安全前沿知识讲座
  2. 【翻译】HTML5开发——轻量级JSON存储解决方案Lawnchair.js
  3. jvm--动态对象年龄判定
  4. 推荐一套高效的码字工具
  5. hammer用法 jquery.hammer.js
  6. ARP防治攻略————服务器防护
  7. oracle leg函数,032-函数的嵌套与LEGB原则
  8. MySQL 报错 1093
  9. 计算机网络具有双重性特点,计算机网络(本)_201806_模拟卷2_答案
  10. sqlplus 编辑的小技巧
  11. python绘制混淆矩阵
  12. AZPR3.0的脱壳教程.
  13. 如何把大写金额变为小写数字_excel表格技巧:怎么快速把阿拉伯数字小写金额转换成大写金额...
  14. UnionPay-银联支付-netcore(一)
  15. 欧美html游戏,欧美HTML社区服务游戏
  16. 获取windows锁屏壁纸
  17. LM08丨网格系列之网格反转(精)
  18. WIN10 Windows terminal 分屏
  19. java double 占位符_Java输出格式化之占位符
  20. mysql的timestamp,unix_time和时区问题

热门文章

  1. r-cnn 行人检测_了解对象检测和R-CNN。
  2. java自动填充_java-自动使用随机数据填充原始属性?
  3. 无线服务器软件,无线局域网AAA服务器的软件设计与实现
  4. 推导pca的降维损失_这应该是最全的PCA原理总结了(上)
  5. 使用 Vim 的 jump list 看代码
  6. 解密javascript模块载入器require.js
  7. HTML: 和 是何方神圣
  8. Office 365系列(6)------Stage Migrate 搬迁方式至O365上来方法及步骤总结
  9. Java中流的使用和说明(二)
  10. java 安祿山,夏天吃生菜最清爽,生菜上澆點蠔油,做法簡單,卻好吃到不行,換成肉還跟我生氣!...