Protocol floor
Base Fee 是门槛,不是小费它由协议根据前一块的拥挤程度计算,同一执行区块中的每单位 Gas 面对同一个基础费。
从0到深入理解以太坊
第七章 · 第三课
Ethereum learning path · 07.03
钱包里写着“最高 42 Gwei”,区块里却只按 30 Gwei 结算。 其中 28 Gwei 被销毁,2 Gwei 去了费用接收地址——这张账单背后, 是以太坊如何给稀缺区块空间定价。
42 Gwei 是每单位 Gas 的付款上限,不是报价一经提交就全部支付。 本例实际费用为 0.00154260 ETH;转账金额另算。
Protocol floor
Base Fee 是门槛,不是小费它由协议根据前一块的拥挤程度计算,同一执行区块中的每单位 Gas 面对同一个基础费。
Inclusion signal
Priority Fee 是排序信号用户给出的是“小费上限”;实际小费还会受到总费用上限约束,未必等于钱包里填写的数。
Settlement
上限、用量、去向要分开最终费用取决于实际 Gas 用量与实际单价;基础费销毁,优先费进入费用接收地址,未用额度不构成支出。
00 · Orientation
“Gas 很贵”把计量单位、单价、上限与最终支出揉在了一起。先把它们拆开。
本课主线:以太坊主网执行 Gas 的 EIP-1559 费用模型
Gas 是计算工作量的计量单位;Gas Fee 是为这些单位支付的 ETH。 第七章第三课继续向下拆:每单位 Gas 的实际价格由什么组成,谁决定它, 最终又分别去了哪里。
对常见的 EIP-1559 动态费用交易,实际执行单价等于区块 Base Fee 加上交易的实际 Priority Fee; Base Fee 被协议销毁,Priority Fee 记入执行载荷指定的费用接收地址。[2]
Quantity
程序实际消耗了多少计算单位。简单 ETH 转账通常是 21,000,复杂合约调用可能高得多。
Unit price
每单位 Gas 付多少。Base Fee、Priority Fee、maxFeePerGas 都是“每 Gas 的价格”。
Settlement
最终支出。把实际用量乘以实际单价,再把 Gwei 换算为 ETH:10⁹ Gwei = 1 ETH。
| 看起来相近 | 为什么不能画等号 |
|---|---|
gasLimit ≠ gasUsed |
前者是允许执行消耗的上限,后者是结算时的实际用量。 |
maxFeePerGas ≠ 实际单价 |
它是用户愿意承担的单价天花板;实际单价通常更低。 |
maxPriorityFeePerGas ≠ 实际小费 |
它也是上限;当总费用上限空间不足时,实际小费会被压低。 |
| 转账金额 ≠ 交易费 | value 给接收者;Gas Fee 为执行与区块空间付费,两条账分开。 |
本页所有数字都是离线教学示例,不代表实时主网价格,也不是手续费建议。 钱包通常会自动估算;手动调费前应先理解本课的两个上限。
01 · The bill
费用不是一笔钱从用户直接转给验证者,而是一场有上限、有结算、有分流的状态转换。
假设 Alice 发出一笔动态费用交易:Gas Limit 为 80,000,
maxFeePerGas = 42 Gwei,
maxPriorityFeePerGas = 2 Gwei。
它进入的区块 Base Fee 是 28 Gwei,执行后实际用了 51,420 Gas。
实际优先费 = min(2, 42 - 28) = 2 Gwei
实际单价 = 28 + 2 = 30 Gwei / Gas
实际总费用 = 51,420 × 30 Gwei = 0.00154260 ETH
| 项目 | 公式 | 结果 | 性质 |
|---|---|---|---|
| 可承受的 Gas 最高额 | 80,000 × 42 Gwei | 0.00336000 ETH | 结算保障,不是最终收费 |
| 基础费销毁 | 51,420 × 28 Gwei | 0.00143976 ETH | 从流通供给中移除 |
| 实际优先费 | 51,420 × 2 Gwei | 0.00010284 ETH | 执行层费用收入 |
| 未成为支出的余量 | 最高额 - 实际总费用 | 0.00181740 ETH | 来自未用 Gas 与未触及的价格上限 |
这 0.00181740 ETH 不是“协议奖励”或“隐藏退款”。它只是用户事先允许的最坏情形 与最终情形之间的差:有些 Gas 没用完,实际每 Gas 的价格也没触及 42 Gwei。
02 · London
它没有让区块空间变得不稀缺;它把“大家都猜一个总价”改成“协议门槛 + 用户小费上限”。
伦敦升级在 2021 年把 EIP-1559 费用市场带入以太坊。此前,传统交易主要填写
一个 gasPrice,区块生产者倾向选择报价更高的交易,用户面对的是一场
第一价格式竞价:出高了容易多付,出低了可能长时间排队。[2]
Before · legacy bid
用户猜测每 Gas 愿意付多少;对下一块最低可接受价格缺少协议给出的公开锚点。 钱包只能从近期市场行为推断。
After · EIP-1559
每块有可推导的 Base Fee;用户声明总单价上限和小费上限。 实际结算无需把整个上限交出去。
| 命题 | 结论 | 原因 |
|---|---|---|
| 让下一块基础费更可预测 | 是 | 当前块的 Base Fee 由父块数据按确定公式计算,单块变化有界。 |
| 吸收短时需求波动 | 是 | 区块可在目标用量与上限之间弹性扩张,之后用更高 Base Fee 把平均用量拉回目标。 |
| 保证 Gas 永远便宜 | 否 | 区块空间仍然稀缺;持续高需求会把 Base Fee 推高。 |
| 消灭交易排序竞争 | 否 | Priority Fee 与其他经济激励仍会影响打包与排序。 |
| 让所有费用都归验证者 | 否 | Base Fee 被销毁,只有实际 Priority Fee 属于执行层费用收入。 |
EIP-1559 原文写于 PoW 时代,常使用 miner。The Merge 之后,以太坊由 PoS 验证者提议区块。本课用“区块生产者 / 提议者 / fee recipient”描述当前结算, 引用规范历史语境时才保留 miner。
03 · Base fee
它不读取“还有多少人在排队”,而是用上一块真实消耗的 Gas 作为需求信号。
每个执行区块都有一个 baseFeePerGas。要进入这个区块,
交易愿意承担的总单价至少要覆盖它;同一块中所有普通执行 Gas 都面对同一个
Base Fee。它不是由钱包、RPC 服务商或区块浏览器指定的。
上一块空间偏空 → 下一块 Base Fee 下降
上一块达到 target → 下一块 Base Fee 不变
上一块为 2× target → 下一块约上涨 12.5%
EIP-1559 的弹性倍数为 2:目标 Gas 用量是区块 Gas Limit 的一半。 当突发需求到来,单个区块可以临时从目标扩张到上限;若区块持续高于目标, Base Fee 会逐块上升,直到需求被价格抑制。低于目标时则反向下降。
gasTarget = parentGasLimit ÷ 2
若 parentGasUsed = gasTarget → nextBaseFee = parentBaseFee
若 parentGasUsed > gasTarget → nextBaseFee = parentBaseFee + max(floor[parentBaseFee × (parentGasUsed - gasTarget) ÷ gasTarget ÷ 8], 1 wei)
若 parentGasUsed < gasTarget → nextBaseFee = parentBaseFee - floor[parentBaseFee × (gasTarget - parentGasUsed) ÷ gasTarget ÷ 8]
规范以 wei 进行整数除法并向下取整;上涨分支至少增加 1 wei。 完整判定以 EIP-1559 参考实现为准。[2]Interactive lab
改变父块 Base Fee 与相对目标用量,观察下一块如何调节。100% 是目标,200% 是上限。
这里用小数展示直觉;客户端按 wei 进行整数运算。
父块正好达到目标,下一块 Base Fee 保持不变。
因为连续满块时每块最多上涨约 12.5%,所以未来几块的最坏路径可以估算。
常见钱包会在当前 Base Fee 之上放入缓冲,再加小费上限;例如
2 × currentBaseFee + priorityCap 是一种常见启发式,
能覆盖约五次连续满幅上调;到第六次时 1.125⁶ ≈ 2.03,
已略高于两倍。它只是缓冲思路,不是“六块保证”,也不是协议强制公式。
Base Fee 写在区块头中;EIP-3198 又为 EVM 增加了 BASEFEE (0x48),
Solidity 中可通过 block.basefee 读取当前执行区块的基础费。[4]
04 · Two caps
一只限制“无论如何最多付多少”,另一只限制“其中最多给多少小费”。
Total ceiling
每单位 Gas 的总付款上限,必须同时容纳 Base Fee 和实际 Priority Fee。 Base Fee 高到超过它时,交易无法进入该区块。
Tip ceiling
每单位 Gas 愿意给出的最大小费。它表达紧迫度,但实际小费还会被
maxFeePerGas - baseFeePerGas 的剩余空间截断。
effectivePriorityFeePerGas = min(maxPriorityFeePerGas, maxFeePerGas - baseFeePerGas)
effectiveGasPrice = baseFeePerGas + effectivePriorityFeePerGas
等价写法 = min(maxFeePerGas, baseFeePerGas + maxPriorityFeePerGas)
Tip cap binds
Base Fee 28,maxFee 42,Priority Cap 2。剩余空间 14,足以容纳 2, 所以实际小费是 2,实际单价 30 Gwei。
Fee cap binds
Base Fee 39,maxFee 40,Priority Cap 3。总上限只剩 1, 所以实际小费降为 1,实际单价正好 40 Gwei。
协议还要求 maxFeePerGas ≥ maxPriorityFeePerGas。
即使当前 Base Fee 很低,写出“小费上限高于总上限”的交易也是字段关系无效,
不能靠结算公式自动修好。[2]
Base Fee 被销毁,不能直接补偿区块生产者纳入交易的执行与机会成本。 Priority Fee 为纳入和排序提供协议内的经济信号:在其他条件相近时, 更高的有效小费通常更有吸引力。零小费交易在协议层可以有效, 但不保证有生产者愿意及时纳入。[3]
实际区块构建还受 nonce 依赖、交易有效性、私有订单流、捆绑交易、MEV、 本地策略和区块容量影响。“小费最高者必定最先”不是协议保证。
05 · Settlement
费用计算有两个时间点:交易进入区块前看上限,执行结束后看实际用量。
maxFeePerGas ≥ maxPriorityFeePerGas。value + gasLimit × maxFeePerGas。maxFeePerGas ≥ block.baseFeePerGas。gasUsed × effectiveGasPrice。Interactive lab
调整六个参数,观察交易是否能进入区块、实际小费是否被截断,以及 ETH 最终如何分流。
可进入该区块;总上限空间充足,实际小费为 2 Gwei。
51,420 × min(42, 28 + 2) Gwei;这里未加入 value、Blob Fee 或 Layer 2 的其他费用项。
节点不能先执行完整交易、再发现发送者付不起最坏情形。因此接纳与执行前, 必须确认余额足以覆盖 Gas Limit 乘以单价上限;最终只按实际 Gas 用量和有效单价收费, 未使用的 Gas 与未触及的价格空间不成为净支出。把它理解为“先满足余额前提、后按实际结算” 即可,不要误画成发送给某个账户后又原路退回的一笔普通转账。
区块浏览器中的 Receipt gasUsed 已反映交易级执行结算。
计算真实交易费用时优先使用 Receipt 的 gasUsed 与
effectiveGasPrice,不要拿钱包的 Gas Limit 直接相乘。
06 · Burn
销毁首先是费用市场的机制设计,其次才产生 ETH 供给层面的结果。
如果区块生产者能保留 Base Fee,它就可能通过塞入自己的交易、链下返还或其他安排, 扭曲协议试图建立的公开底价。把 Base Fee 从收入中拿走并销毁, 可以削弱生产者操纵这条底价的动机。[2]
Neutral floor
Base Fee 是网络的拥挤信号,不应成为单个区块生产者可以给自己返还的收入。
Native asset
协议要求用 ETH 支付并销毁基础费,不能让某个应用代币取代全网统一结算资产。
Supply
网络使用越旺盛,被销毁的 ETH 越多;它与 PoS 发行共同决定净供给变化。
从协议会计看,Base Fee 是从发送者余额扣除,却不计入任何普通账户余额; 它在状态转换中被移出供给。把它说成“打进黑洞地址”会让人误以为链上存在一笔 可查询的普通转账,甚至理论上仍有某把未知私钥——那不是 EIP-1559 的结算方式。
本块执行 Gas 销毁量 = block.baseFeePerGas × block.gasUsed
某时段净供给变化 = PoS issuance - protocol burn
所以“每笔交易都销毁 ETH”不等于“ETH 每天都通缩”。只要某时段发行量高于销毁量, 净供给仍增长;销毁量高于发行量时,净供给才下降。价格涨跌也不是“供给通胀/通缩” 这一术语的同义词。[7]
Interactive lab
用抽象的每日 ETH 数量建立关系。这里只讲净供给算术,不预测价格,也不读取实时数据。
现实中的 PoS 发行与 Gas 销毁都会变化;这里的数值只服务于概念。
发行高于销毁:示例净供给每天增加 600 ETH。
“销毁使剩余 ETH 更稀缺”是供给机制描述,不自动推出投资结论。 资产价值还涉及需求、风险、监管、竞争、流动性与宏观环境;第十九章才会系统建立经济分析框架。
07 · Failure & refund
状态回滚不等于计算没有发生;Gas 退款也有两个完全不同的含义。
Success
成功执行状态改变被保留;按结算后的实际 Gas Used 收费,未用的 Gas Limit 不收费。
Revert
主动回滚本次调用的状态改变回滚,但节点已经执行过路径;消耗的 Gas 仍收费,剩余 Gas 可返回。
Out of gas
Gas 耗尽顶层交易因 Gas 不足失败时,提供的执行 Gas 被耗尽;状态回滚,交易费仍支付。
Gas Limit 只是执行预算。交易成功且只用了 51,420 / 80,000 Gas, 剩余 28,580 Gas 不会按实际单价收费。日常界面把这说成“退回未用 Gas”没有问题, 但更准确地说,它没有成为最终净支出。
某些清理存储等操作会积累 Gas refund counter,在执行完成后减少结算用量。
这不是把过去付过的 ETH 原路退回,也不能无限抵扣。EIP-3529 移除了
SELFDESTRUCT 的 Gas refund,并把单笔交易可抵扣的上限降为
执行 Gas 的五分之一。[5]
| 项目 | 发生原因 | 是否属于链上 Gas Refund Counter |
|---|---|---|
| 未用完 Gas Limit | 执行提前结束,仍有 Gas remaining | 不是 |
| 未触及 maxFeePerGas | 实际单价低于用户价格上限 | 不是 |
| 存储清理带来的抵扣 | 特定 EVM 操作累积 refund counter | 是,且受上限约束 |
不要为了“省一点 Gas”把 Gas Limit 设得贴着估算值。估算依赖当时状态; 合约分支、存储状态或被调用合约可能变化。Gas Limit 太高不会自动多收, 太低却可能让交易 Out of Gas,并付出已经耗尽的费用。
08 · Boundaries
主网执行 Gas、Blob Gas、Layer 2 账单和 MEV 可能同时出现,但它们不是同一层机制。
Legacy
gasPrice旧交易仍可存在。伦敦之后,它的单一 gasPrice 同样必须覆盖区块 Base Fee; 其中 Base Fee 被销毁,剩余部分形成有效优先费。不要因此以为旧交易绕过了销毁。
Blob market
EIP-4844 为 Blob 数据引入独立 Gas 与独立 Base Fee。Blob 交易既可能支付普通执行费, 也支付 Blob Fee;Blob Base Fee 同样销毁,但其调节规则和上限字段是另一套。[6]
Rollup bill
L2 用户账单常包含 L2 执行、向 L1 发布数据、运营者附加项等。
不能只拿主网的 gasUsed × (base + tip) 就解释全部费用。
它最容易制造“同一笔交易为什么有两个 Base Fee”的困惑。普通执行 Gas 衡量 EVM
计算与状态访问;Blob Gas 为临时数据可用性定价。EIP-4844 类型交易包含
maxFeePerBlobGas,Blob Base Fee 从独立的拥挤状态计算。
当前机制没有独立的 Blob Priority Fee。Blob Fee 在执行前按 Blob 数量结算并销毁,
交易执行失败也不退还;
网络升级可以调整 Blob 参数,因此本课不把某个时点的 Blob 数量或具体阈值写成永久常量。
从执行层协议账本看,实际 Priority Fee 记入区块中的 feeRecipient。
但现实中的区块构建可能经过 proposer-builder separation 相关基础设施,
还可能有构建者支付、捆绑交易或 MEV 收益。因此:
tx.gasprice 是什么?
EIP-1559 要求 GASPRICE (0x3a) 返回实际
effectiveGasPrice,而不是用户的 maxFeePerGas。
当前块 Base Fee 则由 EIP-3198 的 BASEFEE 提供。
因而合约可以推导实际优先费,但不能把 tx.gasprice 当成用户填写的总上限。
执行 Gas 看 EIP-1559;Blob 数据看独立 Blob 费用市场;L2 用户账单看该 Rollup 的费用组成; 完整区块经济再额外考虑构建与 MEV。先分层,再计算。
09 · Read a transaction
一笔交易、一个区块、一个 Receipt,三处数据拼起来才是完整答案。
| 数据来源 | 关键字段 | 回答的问题 |
|---|---|---|
| Transaction | gas、maxFeePerGas、maxPriorityFeePerGas、value |
用户允许的执行上限、价格上限、小费上限与转账金额是什么? |
| Block | baseFeePerGas、gasUsed、gasLimit、执行载荷 feeRecipient(常由 JSON-RPC miner 暴露) |
本块底价、拥挤程度与协议内费用接收地址是什么? |
| Receipt | status、gasUsed、effectiveGasPrice |
交易成功吗?结算用量与实际每 Gas 单价是多少? |
Interactive lab
切换数据对象,突出显示属于它的字段。示例值与本课账单一致。
Transaction:先看用户签名承诺了哪些上限;它不告诉你最终用了多少 Gas。
JSON-RPC 数值通常以十六进制 wei 返回;区块浏览器会代为换算。审计时要确认单位。
status 判断成功或失败。gasUsed × effectiveGasPrice 得到最终执行 Gas Fee。baseFeePerGas。gasUsed × baseFeePerGas。gasUsed × (effectiveGasPrice - baseFeePerGas)。value、Token 转移、Blob Fee 或 L2 额外费用另列,不混入执行费。burned = receipt.gasUsed × block.baseFeePerGas
priorityPaid = receipt.gasUsed × (receipt.effectiveGasPrice - block.baseFeePerGas)
执行客户端提供 eth_feeHistory:它可返回一段区块范围内的 Base Fee、
Gas 使用率,以及按 Gas 加权的有效优先费分位数。钱包可以据此估计近期市场,
再结合用户希望的确认速度设置上限。结果仍是估计,不是对下一块排序的承诺。[9]
10 · Synthesis
从父块拥挤,到下一块底价;从用户两只上限,到执行后分流。
maxFeePerGas 与 maxPriorityFeePerGas,限定每 Gas 最坏支出和最大小费。Base Fee 回答“这块空间的协议底价是多少”, Priority Fee 回答“我愿意给多少纳入激励”, 两只 max 上限 回答“最坏情形我承担到哪里”, Gas Used 回答“执行最终用了多少”, Burn 回答“基础费为何不成为生产者收入”。
请选择一个答案。
请选择一个答案。
请选择一个答案。
请选择一个答案。
请选择一个答案。
请选择一个答案。
11 · Reference
把钱包界面的简称,重新连回协议字段与官方定义。
Lesson complete · 07.03