在《从零开始构建区块链》里,我们亲手搓过一条玩具链:转账、挖矿、查余额,全程免费,转账像发微信消息一样轻快。但那条链有个没说破的”作弊”:真实链上不是这样的。你在以太坊上哪怕只转 0.001 ETH,也得先掏一笔手续费;赶上牛市高峰,一次 DeFi 操作的 gas 费够吃顿火锅,部署合约更是”豪门消费”。
很多新手第一次被 web3 劝退,不是因为看不懂钱包界面,而是被 gas 吓退的:为什么转个账还要钱?为什么贵的时候一笔要几十美元?这笔钱到底给了谁?为什么不干脆免费?
这篇文章就把 gas 掰开揉碎讲明白:它是什么、怎么定价、EIP-1559 之后钱包里那三个数字(base fee、priority fee、max fee)到底是什么意思,以及为什么有一部分费用会被当众”烧掉”。老规矩,最后用 Python 把整个机制模拟一遍,所有输出都是真实运行结果,欢迎对着敲。
为什么链上做什么都要钱
先回答灵魂拷问:为什么玩具链可以免费,真实链不行?你琢磨一下自助餐厅为什么要限时、限盘——答案就藏在里面。三个原因,一个比一个硬。
第一,防垃圾交易:自助餐不限量,大胃王会把店吃垮。 假如链上免费,任何人都能零成本发交易。我写个脚本一天发十亿笔”从 A 转 0 ETH 给 B”,全网每个节点都得验证、广播、存储它们——区块链没有客服,也没有防火墙,唯一能挡住洪水猛兽的就是价格。收费之后,发一亿笔垃圾等于烧一亿笔的钱,就像每拿一盘菜都要付盘子的钱,拿一亿盘谁也付不起,攻击这事自然就没人干了。
第二,防死循环:给全网装一个共享充电宝式的计费表。 以太坊的 EVM 是图灵完备的,合约里可以写 while(true)。如果没有计价机制,一个”永远跑不完”的合约就能把全网节点的 CPU 永久占死——一台笔记本就能瘫痪整条链。Gas 的解法和共享充电宝一模一样:借的时候先预付,按小时扣费,余额归零直接断电。执行前先预付 gas,执行中每条指令都在扣表,表跑光了 EVM 直接抛 out of gas、交易回滚。你的循环再疯狂,也最多烧掉你预付的那点电费,绝不会无限吃掉节点资源。
第三,给验证者发工资,顺便给计算定价。 节点帮你验证交易、存储整条链,电费和硬盘是真金白银的支出,没有运费谁肯给你跑腿。而”收多少钱”不能拍脑袋:读一次余额、算一次哈希、写一个存储位,成本天差地别,就像寄信、寄家具、寄冷链海鲜不能一个价。Gas 就是这套统一定价体系——把一切链上行为折算成”计算量”,再统一乘以单价。
一句话总结:gas 不是以太坊想赚你钱,而是一家不限量的自助餐厅,必然被大胃王吃垮。
Gas 到底是什么:电表上的”度”
用最顺手的比喻:gas 是电表上的”度”,不是钱。 你在家用电,电表走字,月底按度数交电费。链上完全一样:
gasUsed:这笔交易实际走了多少”度电”(计算量),要等执行完才知道,所以钱包里显示的永远是”预估”。gasPrice:每一度电的单价,单位是 gwei。- 实际费用 = gasUsed × gasPrice。
先说说 gwei 这个怪名字。1 gwei = 十亿分之一 ETH(10⁻⁹),1 ETH = 10 亿 gwei。为什么要发明这么小的单位?因为 gas 单价动辄十几、几十 gwei,换算成 ETH 就是 0.000000015——眼睛数零都数不过来。有了 gwei,就像日常说”一瓶水三块五”而不是”0.0000035 万元”,说人话而已。
那 ETH 在其中的角色是什么?注意 gas 本身是抽象的”计算量”,不是钱,它必须锚定到一种资产才有价格,以太坊选择了自家的 ETH。所以完整的心智模型是:gas 是用电量,gwei 是每度电的单价,ETH 是结算货币。你在链上的每一步操作,本质上都是用 ETH 交电费。
顺带一提,这也是 ETH 需求的基本盘之一:只要有人在用这条链,就有人在买入 ETH 来交 gas。这个伏笔我们后面讲燃烧时再回收。
常见操作要烧多少 gas
直接上直觉表(数字是量级参考,会随合约实现和链版本浮动,不用背精确值):
| 操作 | 大约耗量(gas) | 备注 |
|---|---|---|
| ETH 转账 | 21000 | 协议固定值,转 1 分钱和转 1 个亿耗量一样 |
| ERC-20 transfer | 约 5 万 ~ 6.5 万 | 代币转账是合约调用,比原生转账贵 3 倍左右 |
| approve 授权 | 约 4.6 万 | 所以”授权一次、用 N 次”是常见省钱策略 |
| SSTORE 写新存储槽 | 20000 / 槽 | 单步最贵的操作之一 |

你可能要问了:写一个存储槽 20000 gas,而 EVM 的加法指令 ADD 只要 3 gas,差了六千多倍,凭什么?
打个比方就明白了。算术是”打过就扔的草稿纸”——全网每个节点各自算一遍 1+1,算完就可以把草稿揉掉。存储不一样:你写进合约的一个数字,全网每个节点都必须立刻同步,并且从今往后永远记住、永远复制。这相当于你在草稿纸上涂了一笔 vs 在全村每家每户的账本上各记一笔,人家得替你记一辈子。存储的成本不是”一次性支出”,而是”全体节点的永久性负债”。存储贵,不是协议小气,是它真的贵。
再看 21000 这个数字。ETH 原生转账之所以便宜,是因为它只是账本上改两个数字;ERC-20 转账要执行合约代码、读写存储、发事件,每一步都在电表上跳字,所以贵出三倍。理解了这一点,你就理解了”链上行为的价格 = 全网为它付出的记忆和计算”。
EIP-1559:钱包里那张账单
2021 年 8 月伦敦升级之前,gas 定价是纯拍卖:你自己喊一个 gasPrice,矿工挑喊得最高的打包,钱全进矿工口袋。就像打车不打表、全凭司机喊价——拥堵时你永远不知道该给多少:喊低了排不上队,喊高了白花钱,全靠赌,体验极差。
EIP-1559 之后改成打表计价,一张账单拆成了三个数。拿打车来对照,一一对应:
- base fee:计价器上的官方车费。 协议根据区块拥挤度自动算出,同一区块内所有人价格一致,你不用猜。画个重点:这部分会被直接销毁,司机拿不到、平台也拿不到,谁也拿不到。
- priority fee(小费):给司机的小费。 自愿加,想让交易插队就多给,不急就少给。
- max fee:你的预算上限。 出发前跟司机说好”最多花这么多”,实际按”官方车费 + 小费”结算,没用完的退给你,多退少不补。
钱包里那个吓人的”最大费用”预估就是这么来的:
1 | 最大费用 = maxFeePerGas × gasLimit (按最坏情况先锁定的预算) |
注意两行用的不是同一组数:上面是”单价上限 × 用量上限”,下面是”实际单价 × 实际用量”,两头都留了余量,所以实际费用通常明显小于最大费用,差额自动退回。交易完成后你经常看到”实际花费比预估少”,那不是钱包算错了,是多退少不补在正常工作。
那 max fee 这个上限,钱包是怎么拍出来的?一个常见做法是 maxFee = 2 × 当前 base fee + 小费。为什么是 2 倍?因为你的交易未必下一块就被打包,而 base fee 每块最多涨 12.5%,连涨 6 块正好约 2 倍(1.125⁶ ≈ 2.03)。留 2 倍余量,就算接下来连续 6 个满块,你的交易也不会因为出价低于官方价而卡死。
对比一下老的 legacy 交易:它只有一个 gasPrice 字段,相当于不打表的侃价车,现在也还能发。链会从里面先扣掉当时的 base fee 烧掉,剩下的差价全部当小费给验证者——注意,没有退款。也就是说 legacy 是”喊多少付多少”,EIP-1559 是”最多付这么多,用不完退给你”。所以主流钱包默认都走 EIP-1559,你日常看到的那张小账单,就是上面这三个数。
base fee 是怎么自动调节的
base fee 不是拍脑袋定的,每个区块都按上一块的拥堵情况重新计算。把它想成景区门票,规则一下子就通了:
景区每天最多卖 3 万张票(区块 gas 上限,伦敦升级时是 30M gas),但运营方最舒服的状态是每天 1.5 万人进园——目标正好是上限的一半(15M gas)。于是定三条规矩:
- 今天进园人数超过 1.5 万,说明景区太挤,明天门票涨价,把一部分游客”劝”到别的时间来;
- 今天人少,说明票价太贵没人来,明天降价促销;
- 每天最多涨跌 12.5%,不许一天翻倍,防止票价坐过山车。
公式:
1 | 下一块 base fee = 本块 base fee + 本块 base fee × (used − target) / target / 8 |
拆开看这个公式:(used − target) / target 是”今天比目标多进了百分之几”,范围从 -100%(空块)到 +100%(满块);再除以 8,就把涨跌幅压到了 ±12.5% 以内。满块时 (30M − 15M) / 15M / 8 = 1/8 = 12.5%,空块时正好相反是 -12.5%。
直觉上这是一台恒温器:房间太热(景区太挤)就涨价把人热出去,下块凉快了价格自然回落;房间太冷(没人来)就降价促销,吸引交易填进来。理想状态是让区块大小稳定悬浮在目标值附近——不挤,也不空。
(上限不是写死的,由验证者投票调节,这几年上调过几轮;但”目标 = 上限的一半”和”每块最多变动 12.5%”这两条规则一直没变。下面的模拟就用经典的 30M/15M 参数。)
燃烧:把协议收入还给全体持币人
传统互联网里,手续费是平台的收入,进老板口袋。但以太坊做了一个非常反直觉的设计:base fee 直接销毁,这笔 ETH 从流通中永久消失,没有任何地址能把它取出来。
你可能要问了:好好的钱,为什么要当众烧掉?
第一,防操纵。 假设官方车费归司机所有,会发生什么?司机最有利可图的事,就是雇一群人站到马路中间——故意把区块塞满(哪怕塞垃圾交易),把下一块的 base fee 抬上去,自己多收。烧掉之后,制造拥堵一分钱好处都没有,操纵动机直接归零。
第二,价值回流。 gas 费本质是全体用户为网络安全和运行支付的成本,这笔钱不该被中间环节截留。当众烧掉,等价于按持币比例给所有 ETH 持有者变相分红——你琢磨一下:流通中的 ETH 变少了,剩下的每一枚 ETH 对应的那份”链上股份”就变多了。全网用得越旺,烧得越多,你手里的币就越稀缺。和上市公司回购股票注销是同一个道理:股本少了,每股含金量就上去了。
这就接上了代币经济学的通缩叙事:以太坊按 PoS 规则每年增发新 ETH 作为验证者奖励,如果某段时间网络繁忙、燃烧量超过增发量,ETH 总供应量就净减少——这就是 2021 年之后反复被讨论的”ETH 通缩”的机制源头,详细的分析在我那篇《代币经济学:如何判断一个代币值不值得买》里。
为什么 L2 便宜
L1 的问题不是计算慢,而是地皮小:全网每 12 秒只有一块空间(伦敦升级时上限 30M gas),全球所有用户、所有协议都在抢同一块地皮,地价自然被拍上天。
L2 的思路是拼车:把成百上千笔交易搬到链下执行,最后只把一份压缩后的”结果数据”放回 L1 存证。一个人付一次 L1 的钱,几百人分摊,单价自然掉下来。而 2024 年上线的 blob(EIP-4844)又给 L2 数据开辟了独立的收费市场,让数据成本再降一个量级——这部分机制我在《blob:你的 L2 转账为什么只要几分钱》里有展开。往根上讲,L2 存在的动机就是”L1 gas 太贵”,想看它具体怎么实现的,可以翻《从零实现区块链 - 侧链与L2》。
用 Python 算一笔账
概念讲完了,老规矩,上代码。先讲直觉:一笔交易的真实美元成本 = 走了多少度电(gasUsed)× 每度电单价(base fee + 小费)× ETH 汇率。下面的计算器就是把这三个数乘起来:
1 | # -*- coding: utf-8 -*- |
真实运行结果:
1 | 假设:ETH = $3000,base fee = 15 gwei,priority fee = 1 gwei |
解读一下:在一个不堵不空的午后(base fee 15 gwei),ETH 转账大约 $1,授权 $2.21,代币转账 $3.12。再对照下图看结构:每一笔的大头都是红色(base fee,直接烧掉),给验证者的蓝色小费只有零头。换个角度感受 gas 的尺度:21000 gas × 16 gwei 只有 0.000336 ETH——链上一次操作的”电量”其实小得惊人。平时让你肉疼的从来不是计算本身,而是拥堵时段的单价,以及把成千上万次运算卷进一帧交易的复杂合约。

用 Python 模拟 base fee 的心跳
第二个模拟:把 EIP-1559 的 base fee 调节公式完整实现一遍,看看景区票价在”连续爆满 → 突然空场 → 平稳”的客流量下如何呼吸。直觉先行:满块就是”3 万张票全卖光”,连续爆满就连续涨价(每次最多 12.5%);空块就是”一张票没卖出去”,连续降价;用量正好等于目标时,票价原地不动。
1 | # -*- coding: utf-8 -*- |
真实运行结果:
1 | 初始 base fee = 30 gwei,目标 = 15M gas,上限 = 30M gas |

三个值得咂摸的观察:
- 连续拥挤是复利式上涨:5 个满块,base fee 从 30 gwei 涨到 54 gwei,每块精确 +12.5%。这就是 NFT mint 和热门代币发行时 gas 指数飙升的数学原理——景区连着爆满五天,票价就一路爬坡,拥堵持续得越久,价格爬得越陡。
- 有个反直觉的细节:涨了 5 块(30 → 54),为什么 3 块空闲只跌回 36.2,没回到 30?因为”跌 12.5%”的基数也在变——先涨 12.5% 再跌 12.5%,回不到原点,百分比涨跌不是对称可逆的。这个设计让票价对持续爆满反应充分、对短暂空场回落温和,避免价格来回剧烈震荡。
- 平稳块上价格冻结:用量正好等于目标时 delta = 0,恒温器到达设定温度就停机。这就是协议想要的稳态:区块大小悬浮在目标值附近,价格不涨不跌。
实用小贴士
原理讲完,给几个日常真正用得上的。
1. 什么时候 gas 便宜?景区人少的时候。 base fee 只看拥挤度,所以答案就是挑人少。经验上,链上的高峰大体跟着美国的工作时段走,相对便宜的窗口是周末、深夜,以及非美国时段——比如美东时间的凌晨,对应北京时间的午后到傍晚。重要但不着急的操作(给冷钱包转账、做授权),挑低谷发能省下不少。不过这只是经验规律,一次热门 mint 就能把景区挤爆,动手前看一眼 gas 追踪器上的实时 base fee 最靠谱。
2. 撤销授权也要花 gas。 撤销的原理是再调一次 approve,把额度设成 0——所以它本身就是一笔真实的链上交易,和前面表里的 approve 是同一个量级,一样要付钱。定期清理授权时,记得把这笔预算算进去:安全从来不是免费的。授权为什么有风险、该怎么管理,见《Web3 中的授权与撤销授权》。
3. 多签交互贵,贵出了 MPC。 在以太坊上,多签本质是一个智能合约:钱包本身要先花 gas 部署,之后每动一次钱都是一次合约调用,合约还得在链上把 M 个签名挨个验一遍。对照前面的直觉表就明白了——普通转账只要 21000,而走合约、验签、读写存储,每一步都在电表上跳字,所以它天然比一笔普通转账贵。这正是 MPC 钱包出现的动机之一:把”多方共同签名”这件事挪到链下用密码学解决,链上看到的只是一笔普通交易,自然也只付普通交易的 gas。详见《更加安全的区块链钱包:MPC 钱包》。
总结
把这篇的硬核知识收进口袋:
- gas 是计算量单位,不是钱;费用 = gasUsed × gasPrice;gwei 是单价单位(10⁻⁹ ETH),ETH 是结算货币。
- 收费的三重动机:防垃圾交易(自助餐不能不限量)、防死循环(给图灵完备的 EVM 装电表)、付验证者工资。
- 耗量直觉:ETH 转账固定 21000;代币转账和授权是它的三倍量级;写存储槽 20000 一档,因为存储是”全网所有节点永久记住”的负债。
- EIP-1559 把账单拆成三个数:base fee(协议定价、自动调节、直接燃烧)+ priority fee(给验证者的小费)+ max fee(用户上限,多退少不补)。
- base fee 是景区门票:目标 = 上限的一半,人多了涨价、人少了降价,每块最多 ±12.5%。
- 燃烧把”协议收入”按持币比例变相还给全体持币人,是 ETH 通缩叙事的机制源头。
- L2 便宜是因为执行搬到了链下、只把压缩数据放回 L1,blob 让数据成本再降一个量级。
一句话:理解了 gas,你就理解了区块链”一切行为皆有价格”的世界观——这条链上没有免费的午餐,但正因为每一步都有价,它才挡得住垃圾、跑不死循环、养得活全球成千上万个节点。
相关阅读
- 《从零开始构建区块链》:免费玩具链 vs 真实链
- 《Web3 中的授权与撤销授权》:approve 和撤销都是真实交易,都要花 gas
- 《更加安全的区块链钱包:MPC 钱包》:多签每次交互都烧 gas 的痛点
- 《代币经济学:如何判断一个代币值不值得买》:EIP-1559 燃烧与 ETH 通缩
- 《从零实现区块链 - 侧链与L2》:L2 存在的动机就是 L1 gas 贵
- 《blob:你的 L2 转账为什么只要几分钱》:blob 交易让 L2 数据成本再降一个量级