以太坊如何估计估算计算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 = ; 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:30628execution

cost:6988

set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)

transaction cost:196022

execution 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. 科普贴 | 以太坊网络中的Gas Limit 和 Gas Price 是什么概念?

    接触以太坊的同学都听过 Gas/ Gas Price/ Gas Limit,那么这些词汇究竟是什么意思? 还有,为什么有时候你的ETH转账会很慢?如何提高ETH转账速度? Ethereum平台 Vit ...

  2. 区块链入门到实战(25)之以太坊(Ethereum) – 以太币单位

    以太币的主要单位是以太/Ether,即一个以太币,以太币的最小单位是wei. 以太币最小单位 wei 是以虚拟币先驱人物:戴伟 Wei Dai 命名,戴伟 W Dai 是一位兴趣广泛的密码学专家,他在 ...

  3. 以太坊中的账户、交易、Gas和区块Gas Limit等概念

    什么是账户 以太坊账户与我们所知的账户概念有一定相似之处,却又有很大的区别,更不同于比特币中UTXO. 账户分两类: - 外部拥有账户(EOA),也就是普通账户 - 合约账户 普通账户 所谓的普通账户 ...

  4. 以太坊ETH中智能合约消耗的Gas、Gas Limit是什么?

    以太坊ETH中智能合约消耗的Gas.Gas Limit是什么? 数字货币交易一般是有交易费的,比特币(BTC)的交易费很容易理解,就是直接支付一定额度的BTC作为手续费.而以太坊(ETH)的交易费表面 ...

  5. 以太坊智能合约虚拟机(EVM)原理与实现

    以太坊 EVM原理与实现 以太坊底层通过EVM模块支持合约的执行与调用,调用时根据合约地址获取到代码,生成环境后载入到EVM中运行.通常智能合约的开发流程是用solidlity编写逻辑代码,再通过编译 ...

  6. 以太坊挖矿源码:ethash算法

    本文具体分析以太坊的共识算法之一:实现了POW的以太坊共识引擎ethash. 关键字:ethash,共识算法,pow,Dagger Hashimoto,ASIC,struct{},nonce,FNV ...

  7. 如何在以太坊上搭建一个Dapp?

    原创: 前哨小兵甲 区块链前哨 昨天 策划|Tina作者|Mahesh Murthy俗话说,实践出真知!对于开发人员来说,最好的学习办法就是亲自动手做一个小项目.所以,接下来我们将会以一个投票程序为例 ...

  8. 以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. C#以太坊基础入门

    在这一部分,我们将使用C#开发一个最简单的.Net控制台应用,来接入以太坊节点,并打印 所连接节点旳版本信息.通过这一部分的学习,你将掌握以下技能: 如何使用节点仿真器 如何在命令行访问以太坊节点 如 ...

随机推荐

  1. 数据库中插入数据时发生ora-00984错误

    操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...

  2. 读论文系列:Object Detection CVPR2016 YOLO

    CVPR2016: You Only Look Once:Unified, Real-Time Object Detection 转载请注明作者:梦里茶 YOLO,You Only Look Once ...

  3. 248&258--高级软件工程第三次作业

    0 小组成员 马帅 / 2017202110248 齐爽爽 / 2017282110258 1 项目 GitHub 地址 GitHub:https://github.com/whumashuai/QT ...

  4. 在Apache中运行Python WSGI应用

    我们介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用. 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装 ...

  5. vue 的模板编译—ast(抽象语法树) 详解与实现

    首先AST是什么? 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言 ...

  6. vue class与style 绑定详解——小白速会

    一.绑定class的几种方式 1.对象语法 直接看例子: <div id="app3"> <div :class="{'success':isSucce ...

  7. RadioButton的图标改变大小(TextView也适用)

    RadioButton的图标大小并没有相应的布局参数,本文通过自定义属性的方式自定义RadioButton,实现控制图片大小. 本文要点: 自定义属性的使用. 解决RadioButton文字上.下.左 ...

  8. 新概念英语(1-43)Hurry up!

    新概念英语(1-43)Hurry up! How do you know Sam doesn't make the tea very often? A:Can you make the tea, Sa ...

  9. Spark入门(1-2)Spark的特点、生态系统和技术架构

    一.Spark的特点 Spark特性 Spark通过在数据处理过程中成本更低的洗牌(Shuffle)方式,将MapReduce提升到一个更高的层次.利用内存数据存储和接近实时的处理能力,Spark比其 ...

  10. 粒子系统(二):Canvas绘制精美图案

    准备 IDE:Visual Studio Code Language:JavaScript / ECMAScript 6+ GitHub:Natural2D.JS 本文主要讲述 Particles - ...