版权声明
-----------------------------------------
在开发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
我们有专门的付费群讨论区块链应用开发,添加下面的微信,可加入。
领取专属 10元无门槛券
私享最新 技术干货