为什么以太坊Gas费突然大幅下降?
4月25日,以太坊Gas费跌到了50 gwei左右,创下2021年以来的新低。如果你还有印象,就在不久前,链上手续费一度逼近1500 gwei,堪称天价。这次骤降,很可能和以太坊提升了区块Gas Limit有关——4月22日,以太坊将区块Gas Limit从约1250万Gwei提升到了1500万Gwei,增幅约20%。那么,到底哪些因素会影响以太坊的Gas费?这篇内容会帮你理清背后的逻辑。
注:本文首发于2020年9月23日,部分数据为当时数据,阅读时请留意截止今日数据可能已有较大变化。
Uniswap给20多万个地址撒空投那天,很多人一边开心领钱,一边抱怨:“这Gas费也太高了。”
那是以太坊历史上值得记住的一天:建议Gas最高冲到了1000 GWEI,创下历史顶点。更让人抓狂的是,即使你按Wallet建议的最高值交了Gas费,交易还是没法在预期时间内确认——Metamask上一圈圈转个不停,全是Pending状态。
为什么用默认的Gas费金额,却依然没法即时交易?要搞清楚这个问题,得从以太坊的交易费率机制说起。
Gas的逻辑
先聊聊以太坊的账户。
以太坊网络里有两种账户:外部账户(Externally Owned Account)和合约账户(Contract Account)。外部账户就是你我在用的私钥钱&包;合约账户则是由合约代码控制的智能合约,通常归项目方所有。当你使用DeFi应用时,其实就是在用自己的账户跟这些智能合约交互。
各类账户之间可以自由交互——钱&包间转账,合约间互相调用,每一次链上交互都需要消耗计算量。计算量的大小取决于操作难度:比如加法简单,消耗3个Gas;除法复杂一些,就需要5个Gas。Gas就是衡量计算量的单位。
每个单位的Gas都有对应的价格,也就是Gas Price,以Wei为单位。用户需要购买ETH来支付Gas费用。换算关系:1 ETH = 1e18 Wei,我们常说的GWei则是1e9 Wei。通常,Wallet软件会根据历史Gas Price,预估你这笔交易大概需要花多少钱。
为了避免节点过于集中,追求去中心化的区块链会严格限制每个区块的容量——比如比特币的区块大小限制,以及以太坊的区块Gas Limit。写这篇文章时,以太坊每个区块的Gas Limit大约是12,000,000个Gas,也就是每个区块能处理的总计算量上限。平均每15秒出一个区块。当交易需求超过区块容量时,用户要想让自己交易快点被确认,就得跟别人竞价矿工的资源。矿工会优先打包Gas Price高的交易。

转账时,你还会看到Wallet里有个可以手动调节的“Gas Limit”选项。这和区块Gas Limit不同:Gas Limit是指一笔交易中,你愿意承担的最大Gas使用量。因为有些合约可能存在漏洞,导致交易陷入死循环,无限计算——如果没有Gas Limit,这笔交易会把你钱&包里的ETH全部吞掉。矿工实际收费时,按交易实际消耗的计算量(Gas Used by Transaction)结算,Gas Limit内没用完的ETH会退回给你。
所以可以得出一个公式:消耗的ETH数量(Ether Cost)= 交易费用(Gas Fee)= 每笔交易消耗的Gas量(Gas Used By Transaction)× Gas价格(Gas Price)。
待确认交易与加速交易
每次你发起一笔交易,它会被放入一个交易池(Mempool)里。如前面所说,矿工会优先打包池子里Gas Price最高的交易——毕竟矿工也要赚钱。你设的Gas Price决定了交易被打包的速度。网络拥堵时,Gas Price飙升,交易可能长时间处于Pending状态。这时你可以支付更高的Gas Price来“加速”——相当于多给矿工点小费,插个队。
加速交易具体怎么操作?要理解这个,得先知道另一个参数:Nonce。每个地址发出的交易都有一个按顺序排列的编号——Nonce,从0开始,每发起一笔转账,Nonce值就加1。

当你想加速时,在Wallet里选择“加速交易”,系统会要求你支付更高的Gas费。确认后相当于发起了一笔新交易,而这笔新交易与原本Pending的那笔交易的Nonce值相同。以太坊网络规定:Nonce值必须连续且不可跳跃,同一地址的每笔交易Nonce值不能重复。所以矿工会打包新交易,新交易确认后,之前Gas Price较低的那笔交易就会被废弃。
如果你不想加速,只要交易还在池子里没被打包,随时可以取消。取消的原理和加速一样:发起一笔Gas Price更高、Nonce值与Pending交易相同的新交易,但转账金额设为0。本质上,取消交易的成本和加速交易一样,都需要花钱。
需要注意:在Pending交易确认完成之前,后续所有交易都得排队等着。所以千万不要因为等太久就重复发起多笔交易。
交易失败
最常见的交易失败原因是“Gas耗尽”(Out of Gas)。也就是说,这笔交易的实际计算量超过了你设定的Gas Limit。这种情况下,交易状态会显示失败,并提示Gas已用尽,而且你交的Gas费不会退还。
有些用户觉得这不公平,但换个角度想:矿工已经帮你算了一部分活,只是算到一半Gas不够了,他们只能放弃,但之前的工作得付“工资”——所以不退费也算合理。遇到这种情况,只能重新发起交易,并把Gas Limit调高。
另一种失败情况是:当你向智能合约发起交易时,某些错误导致合约无法执行,返回“Bad Instruction”。比如参与众筹时,可能出现以下情形:
额度已满;
或者你不在白名单里;
或者你超额认购代币等等。
这时,你设定的Gas Limit会被全部用完,最终导致交易失败。
不过,以太坊在拜占庭硬分叉后增加了新操作符Reverted(EIP-140)。当合约中间出现错误时,交易不会再耗尽全部Gas,合约会停止执行并退回剩余Gas费用,同时告诉你具体错误原因。
当然,如果你钱&包里的ETH不够支付Gas费,交易也会失败。
没有热点的时候,以太坊网络一片祥和,转账成本(时间和金额)都还可控。但当风口来临,Gas费就成了新人使用钱&包时最大的障碍。基本上,你能遇到的所有Gas费问题,这篇文章都覆盖到了。链上交易没那么复杂,说白了,一切操作上的问题,加钱就能搞定。
回顾这波流动性挖矿热潮,虽然创造了一片泡沫,但也让更多用户习惯了钱&包的使用——钱&包终于成了一个高频工具。而链上交易出的这些幺蛾子,其实也在推动钱&包的优化。未来,“一键加速”“一键取消”这样的功能,或许会出现在越来越多的钱&包里。