EIP-1559:为什么需要它,以及 Gas 怎么算

EIP-1559 是以太坊手续费模型的一次关键改造。它没有把 Gas 费“变便宜”,但把原来难以预估的纯竞价模式,换成了更容易理解的“基础费 + 小费”。

这篇就讲三件事:

  1. 为什么会有 EIP-1559
  2. 它具体改了什么
  3. 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,000
  • baseFee = 30 gwei
  • maxPriorityFee = 2 gwei
  • maxFee = 100 gwei

步骤:

  1. 先算 baseFee + priority = 32 gwei
  2. effectiveGasPrice = min(100, 32) = 32 gwei
  3. 总费用:
    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,000
  • baseFee = 40 gwei
  • maxPriorityFee = 3 gwei
  • maxFee = 200 gwei

计算:

  • baseFee + priority = 43 gwei
  • effectiveGasPrice = 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,000
  • baseFee = 25 gwei
  • maxPriorityFee = 1.5 gwei
  • maxFee = 35 gwei

先算:

  • baseFee + priority = 26.5 gwei
  • effectiveGasPrice = 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 计算基本就通了。更重要的是根据拥堵情况动态调整,而不是记一套固定数字。