一文讲清楚以太坊的gas,gasPrice,gasLimit

版权声明

-----------------------------------------

在开发DApp应用或者使用以太坊转账的时候,经常会接触到gas, gas price, gas limit几个词汇。很多人被他们绕晕了。本文希望能对这个问题提供一些解读,解决大家普遍的疑惑。

GAS机制的意义

欧神说过,凡事都要看到T-1层的运行规则。我们对于gas,要先理解背后的设计哲学。追踪溯源,我们不得不先从比特币说起。

比特币是一个大的账本,矿工打包区块,给予BTC激励。但受限于网络的速度,区块的大小是受限的,为1M。在这么大的区块链里,能容纳的交易显然是有限的。那么如果交易很多,怎么办?这有限资源配置的经济学问题。兼顾公平,还是效率?

比特币给出的解决方案是这样的,每笔需要收取一定的手续费,谁给的多,谁就更加有机会被打包。完全是利益驱动矿工,非常符合人性。因为区块链的去中心特质,决定了需要用直接的经济效益驱动参与者

区块链发展到以太坊这里时,我们同样面临类似的问题,如何设定区块的大小,如何收取手续费?能直接照搬比特币的机制吗?

难!以太坊本质是一个超级计算机,交易不仅仅是一个简答的记账,背后有很多合约执行操作。你想想,部署一个复杂的合约要比执行一个简单的以太坊转账要复杂很多,所占用的资源要多很多。这两笔交易,显然是不对等的。那该怎么收费呢?这个地方我们就需要兼顾公平与效率。不能太随意,最好有量化的计算机制。

这个时候,GAS机制的自然引入进来。通过gas去量化交易的复杂度,保证公平性。通过设定gasPrice(基本单位为wei,以太坊的最小单位)来保证效率,保证资源调配的高效。这样, gas x gasPrice就是最终的手续费。这样整个逻辑就很自然。平时不堵,大家意思意思,一旦堵了,就得提高gasPrice,保证交易能给很快被打包。当然,要是不着急,慢慢等也可以。

新的问题来了,gas是如何量化的呢?

说破了其实很简单。合约编译成字节码在EVM中执行,字节码程序跟我们计算机的汇编程序差不多。就是把上面的代码翻译成底层的各种操作,比如加减乘除,数据存储,条件语句这些。这样我们可以把所有的操作符都统计出来,每种运算设定一个gas费用。整个执行过程所有字节码加起来,就是本次交易的gas总费用。大家有兴趣可以去查一下以太坊这一块的资料,他有一个详细的表去列出操作对应的gas费。

以太坊在解决交易的收费问题之后,我们还剩下交易区块的大小问题。既然用gas费用去量化交易的费用,我们很自然地想到可以限定区块的总的gas,去限定一个完整的区块。这个总gas就是区块的gasLimit。

好,到此为止,应该差不都讲清楚起基本的运作机制,我们在来看看下面几个问题。

gas和gasLimit区分

接上章,我们明白整个gas的设计哲学和工作机制之后,我们在实际开发或者使用以太坊的过程经常会遇到gas, gasLimit这两个词,他们有着不同的含义,经常容易被混淆,我们更加不同的场景来讲述一下。

交易时:

我们随便看一笔以太坊的交易:

看标红的地方,有Gas Limit, Gas Used By Txn。 两个值还不一样,是不是很晕?且听我慢慢道来。

Gas Limit: 就是我们在交易过程中,指定的!其实这个数值一般钱包自动把我们计算完。标准的以太坊转账是21000。在web3接口通过制定Gas的值来指定Gas Limit。

Gas Used By Txt: 是指这一笔交易执行完成之后,实际消耗的Gas值。最终的交易费用是根据它计算来的。

那为什么者两个值会不一样呢?

应该有些复杂的操作,我们提前是不能精确地知道它的gas消耗的。简单来说,如果有if操作,你要进入那一块代码,是受限于外部输入的。所以,Gas Limit只能是比Gas Used By Txt多。

它通过可以有web3.js提供的estimateGas接口预估出来。当然,这些对于一般用户来说,钱包都帮我们做得很好了,不用关心。

区块打包:

看一个典型的区块数据:

同样也存在Gas Limit 和 Gas Used的区别。

此处的Gas Limit就是一个区块能容纳的所有交易的Gas总和。矿工在打包交易的时候,只要他不傻,会优先把gasPrice高的交易搞进来,然后依次组装成一个区块。最终这些交易消耗的gas总和就是 Gas Used。

是的,对于一般用户来说,不必要关心这个值。但是,对于开发者来说:

非常重要,非常重要,非常重要。

因为这个值决定了,你的合约不能太复杂,如果太复杂,部署的时候gas消耗超过800w,根本无法部署到链上

超过800w不是啥难事,代码多一点,预先多存储点东西上去,就可以做到了。这也是为什么经常需要拆分合约,通过合约互调的方式来写逻辑。真的不是炫技,不这样干,无法部署上链,一点招都没有!

gasPrice设定

懂得如何设定合理的gasPrice是一项非常重要的技能。因为它可以让你在以太坊上行走,懂得这项技能有几大优势:

1. 总是比别人少花点钱

2. 提前抢到额度。经常发生在1CO的公募时期

3. 买到更便宜的价格,玩过F3D应该明白吧

我们一个典型的案例:

这些被堵很长时间的,比如50分钟以上的,就是典型的失败者。还有那种给了居高gas费用的好心人,就不在此展示,实在伤人。

其实很简单,交易的时候参考网站:

https://ethgasstation.info/

看看当前是什么价格,特别是写合约开发,做批量处理处理的兄弟,多看看最新的价格,设定好,非常关键,可以省不少钱!

常见错误和解决方法

out of gas

一看就是交易的gas费用太低

gas limit error

经常出现在私链部署合约,由于私链默认的区块的gas limit大概在500w左右,合约一大就无法部署上去。在测试链中也有可能这个问题。kovan不错,跟主链一样,800w

一直pending

gasPrice给得太低,被矿工嫌弃不愿意打包。也有解决方案。等待下篇详细分析。

常用工具

梳理一下文章中主要用到的工具:

1. 区块链浏览器:https://etherscan.io/

2. 价格查看器:https://ethgasstation.info/

3. 查看交易的分布,看看谁把以太坊搞堵住:https://ethgasstation.info/gasguzzlers.php

我们有专门的付费群讨论区块链应用开发,添加下面的微信,可加入。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180816G0P58300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券