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

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

以太坊如何估计估算计算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: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.

如果对以太坊开发有兴趣,推荐两个教程:

1.适合区块链新手的以太坊DApp开发:

http://xc.hubwiz.com/course/5a952991adb3847553d205d1

2.用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建以太坊DApp电商平台:

http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6

如果想加入以太坊技术开发群可以加微信拉你入群。



相关文章
|
JavaScript API
vue 模板引用
vue 模板引用
|
存储 算法 Linux
VDO卷的配置
在CentOS 7环境下,VDO通过重删和压缩技术节省磁盘空间,使1T磁盘可存储1.5T数据,降低成本。创建VDO步骤包括:添加64GB新硬盘,安装vdo和kmod-kvdo软件,使用`vdo create`命令创建VDO卷,如`vdo create --name=myvdo --device=/dev/sdb --vdoLogicalSize=200G`。之后,可通过`vdo list`、`vdo status`和`vdostats`检查状态和空间使用。最后,格式化VDO卷,创建挂载点并挂载,完成设置。
146 0
|
算法 容器
[leetcode] 连接所有点的最小费用 -MST
这道题是最小生成树板子题 可以用并查集实现,贪心排序边权 讲一个二元组放在一个vector容器里面,其中的元素为<weight,<u,v>>对应<int,<int,int> >类型,第一个参数代表边权的大小,后面的为两个点u,v,然后按照第一个值边权从小到大排序,然后用并查集实现是否连通,从而实现最小生成树 代码有点套娃(
127 0
[leetcode] 连接所有点的最小费用 -MST
|
网络协议
TCP的长连接和短连接
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
17550 1
|
安全 网络安全 网络协议
带你读《网络防御与安全对策:原理与实践(原书第3版)》之一:网络安全概述
本书全面介绍了网络防御和保护网络的方法,内容包括网络安全的基本知识、虚拟专用网络、物理安全和灾备、恶意软件防范以及防火墙和入侵检测系统,加密的基础知识,对网络的攻击、用于确保安全的设备和技术,安全策略的概貌如何评估网络安全,基于计算机的取证等。每一章的末尾都给出了多项选择题、练习、项目和一个案例研究。
|
SQL 关系型数据库 Perl
|
监控 API C++
利用API NtQueryInformationThread和I_QueryTagInformation实现对Windows日志监控的绕过
本文讲的是利用API NtQueryInformationThread和I_QueryTagInformation实现对Windows日志监控的绕过,在上篇文章《渗透技巧——Windows日志的删除与绕过》中提到一个绕过Windows日志监控的思路:使用API NtQueryInformationT...
2086 0
kde
|
3天前
|
JSON Linux 数据格式
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
1531 4
|
12天前
|
Java Linux Maven
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)
本文详细介绍了Maven的项目管理工具特性、安装步骤和配置方法。主要内容包括: Maven概述:解释Maven作为基于POM的构建工具,具备依赖管理、构建生命周期和仓库管理等功能。 安装步骤: 从官网下载最新版本 解压到指定目录 创建本地仓库文件夹 关键配置: 修改settings.xml文件 配置阿里云和清华大学镜像仓库以加速依赖下载 设置本地仓库路径 附加说明:包含详细的配置示例和截图指导,适用于各种操作系统环境。 本文提供了完整的Maven安装和配置
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)