EIP-1559 是以太坊手续费模型的一次关键改造。它没有把 Gas 费“变便宜”,但把原来难以预估的纯竞价模式,换成了更容易理解的“基础费 + 小费”。
这篇就讲三件事:
- 为什么会有 EIP-1559
- 它具体改了什么
- Gas 费用到底怎么计算(含具体数字例子)
一、为什么会有 EIP-1559
在 EIP-1559 之前,以太坊主要用 First-Price Auction(第一价格拍卖):
- 你给出一个
gasPrice - 矿工优先打包
gasPrice更高的交易 - 你实际支付的单价就是你自己出的那个价
这个模型在高峰期会很难受:
- 费用很难预估:用户往往只能“多给一点”,否则交易容易卡住。
- 过度竞价:很多人同时抬价,结果整体支付高于真实所需。
- 体验不稳定:同样一笔转账,不同时间价格差异非常大。
- 钱包策略复杂:钱包要反复估算“现在到底该出多少”。
所以 EIP-1559 不是来承诺“长期低价”的,它主要解决的是定价不透明和体验抖动。
二、EIP-1559 具体内容
EIP-1559 引入了几个关键概念。
1) Base Fee(基础费)
- 每个区块都有一个基础费
baseFeePerGas - 这个值由协议自动调整,不是矿工随意定价
- 基础费会被销毁(burn),不会给打包者
这点很关键:基础费不是“给矿工/验证者”的收入,而是直接销毁。
2) Priority Fee(小费)
- 也叫
tip,参数通常是maxPriorityFeePerGas - 这部分给打包者(PoW 时期矿工 / PoS 下验证者)
- 本质上是你给打包者的激励
3) Fee Cap(最高可接受总单价)
- 参数名是
maxFeePerGas - 表示你愿意支付的“每单位 gas 总上限”
交易最终每单位 gas 实际支付单价遵循:
effectiveGasPrice = min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas)
并且要满足交易可被执行的基本条件:
maxFeePerGas >= baseFeePerGas
4) 弹性区块(Elastic Block Size)
- 每个区块有一个“目标 gas 使用量”(target gas)
- 实际区块可在目标附近弹性波动(上限通常是目标的 2 倍)
- 如果区块持续高于目标,下一块的
baseFee上升 - 如果持续低于目标,下一块的
baseFee下降
这样做的效果是:短期拥堵不会把手续费一下子拉爆,而是分摊到后续几个区块里。
三、Gas 计算:先看总公式
先看一条最常用的公式:
交易总花费 = gasUsed * effectiveGasPrice
其中(单位常用 gwei):
effectiveGasPrice = min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas)- 用户支付会拆成两部分:
- 销毁:
gasUsed * baseFeePerGas - 小费给验证者:
gasUsed * priorityFeePaid
- 销毁:
这里:
priorityFeePaid = effectiveGasPrice - baseFeePerGas
你可以把它理解成“愿意付到这里为止”,不是“按这个值强制扣费”。
四、具体算例(带数字)
下面都用 gwei 做单价单位,1 ETH = 1,000,000,000 gwei。
例子 1:普通转账
假设:
gasUsed = 21,000baseFee = 30 gweimaxPriorityFee = 2 gweimaxFee = 100 gwei
步骤:
- 先算
baseFee + priority = 32 gwei effectiveGasPrice = min(100, 32) = 32 gwei- 总费用:
21,000 * 32 = 672,000 gwei = 0.000672 ETH
拆分:
- 销毁:
21,000 * 30 = 630,000 gwei = 0.00063 ETH - 小费:
21,000 * 2 = 42,000 gwei = 0.000042 ETH
例子 2:你把 maxFee 设得很高,但不会按高价全扣
假设:
gasUsed = 100,000baseFee = 40 gweimaxPriorityFee = 3 gweimaxFee = 200 gwei
计算:
baseFee + priority = 43 gweieffectiveGasPrice = min(200, 43) = 43 gwei- 总费用:
100,000 * 43 = 4,300,000 gwei = 0.0043 ETH
这个例子想说明一件事:maxFee 设高是为了防止交易卡住,不等于你会按高价成交。
例子 3:maxFee 过低导致交易不可打包
假设:
baseFee = 55 gwei- 你设置
maxFee = 50 gwei
因为 maxFee < baseFee,交易直接不满足基本条件,节点通常会拒绝或一直 pending。
例子 4:合约调用(更大 gasUsed)
假设一次 DEX 交互:
gasUsed = 180,000baseFee = 25 gweimaxPriorityFee = 1.5 gweimaxFee = 35 gwei
先算:
baseFee + priority = 26.5 gweieffectiveGasPrice = min(35, 26.5) = 26.5 gwei
总费用:
180,000 * 26.5 = 4,770,000 gwei = 0.00477 ETH
拆分:
- 销毁:
180,000 * 25 = 4,500,000 gwei = 0.0045 ETH - 小费:
180,000 * 1.5 = 270,000 gwei = 0.00027 ETH
五、设置建议(钱包/脚本)
如果你自己写交易脚本(ethers.js/web3.js),可以按这个思路:
maxPriorityFeePerGas:给一个适中小费(例如 1-3 gwei,拥堵时上调)maxFeePerGas:至少覆盖“当前 base fee + 小费”,并留一定缓冲
常见经验做法是:
maxFeePerGas ≈ 2 * 当前baseFee + priority
这样做的好处是,后面 1-2 个区块就算变贵,交易也不至于马上失效。
六、常见误区
误区 1:EIP-1559 之后手续费就会越来越低
不一定。它主要改善的是定价机制和可预测性,不是保证低价。
误区 2:maxFeePerGas 就是实际支付单价
不是。它只是上限,实际支付看当时的 baseFee + priority。
误区 3:全部手续费都给验证者
不是。基础费被销毁,验证者拿的是小费部分。
七、小结
EIP-1559 可以记成三句话:
- 把“纯拍卖”变成“协议定基础价 + 用户给小费”
- 让费用估算更稳定,减少盲目竞价
- 通过 burn 机制把基础费从流通里移除
只要把 baseFee / maxPriorityFee / maxFee 这三个参数分清楚,Gas 计算基本就通了。更重要的是根据拥堵情况动态调整,而不是记一套固定数字。