01 · Coordinate system
先分清三种量:工作、单价、账单
如果把 Gas 直接理解成手续费,后面的每一个字段都会混在一起。
目录 PDF · 第七章第二课 · Gas 与 Gas Fee 的区别
Gas 不是一种代币,也不是从账户里扣掉的货币。它是以太坊协议内部的 计算工作量单位:交易要传输字节、执行指令、读取状态、写入存储, 协议就按照 Gas 计量表累计用量。Gas Fee 才是这份工作最终对应的 ETH 费用。[1]
Gas Used|工作量
这笔交易实际消耗了多少 Gas 单位。它由交易数据、执行路径与状态访问共同决定。
Effective Gas Price|单价
每一单位 Gas 最终按多少 Wei 结算。钱包常用 Gwei / gas 展示。
Gas Fee|账单
Gas Used 与有效单价的乘积,以 Wei 计价,再换算成 ETH 展示。
Gas 是协议定义的资源计量单位;Gas Price 是每单位 Gas 的 ETH 价格; Gas Fee 是一笔已执行交易为其实际 Gas 用量支付的总金额。
为什么“电量与电费”比“汽车与汽油”更准确?
家庭用电时,千瓦时衡量用量,元/千瓦时是单价,电费是两者相乘。 以太坊也一样:Gas 类似“度数”,不是钱;Gwei / gas 类似“每度电价”; Gas Fee 才是最后付款。这个比喻仍有边界——Gas 计量表是为确定性与抗滥用设计的协议刻度, 不等于节点真实消耗了多少焦耳或多少 CPU 毫秒。
本课把 Gas、gasUsed、gasLimit、
effectiveGasPrice 和 fee 分开书写。
日常口语中的“Gas 太贵”通常其实在说“Gas Price 高”或“Gas Fee 高”。
02 · The equation
账单只有一个乘法,难点在别拿错数字
结算后读回执里的实际用量与有效单价,而不是把两个上限直接相乘。
对普通以太坊执行费用,最重要的等式是: 实际执行费用 = Gas Used × Effective Gas Price。 交易回执会给出这两个结算量。[3]
因为 1 ETH = 10⁹ Gwei。Gas 单位在乘法中约掉,留下货币单位。
不要用哪两个数字算最终账单?
| 维度 | 预算 / 报价上限 | 最终结算量 | 用途 |
|---|---|---|---|
| Gas 数量 | gasLimit |
gasUsed |
前者防止无限消耗;后者进入实际账单。 |
| Gas 单价 | maxFeePerGas |
effectiveGasPrice |
前者是愿付上限;后者是所在区块的结算单价。 |
| 费用 | gasLimit × maxFeePerGas |
gasUsed × effectiveGasPrice |
前者是执行费用暴露上限;后者是已发生账单。 |
gasLimit × maxFeePerGas 不是“钱包一定会扣掉的手续费”,而是这笔交易在执行费用维度上的最大承受额。
实际完成得更早、结算单价更低,多出来的预算不会变成实际费用。[2]
复杂操作也可能比简单转账便宜
因为用量与单价是两条独立轴。下面的数字只是为了隔离变量,不代表实时主网报价:
费用 0.00126 ETH
用量低,但网络报价高。
费用 0.0006 ETH
用量更高,最终账单反而更低。
费用精确翻倍
代码路径不变,Gas Used 可以不变。
费用精确翻倍
市场不变,执行路径变复杂。
03 · Metering work
Gas Used 从哪里来?
不是按代码行数计费,也不是拿秒表测 CPU 时间。
交易一开始先承担固有成本,随后 EVM 每执行一步,就按当前协议版本的 Gas 计量规则扣减剩余预算。 加减法、复制字节、扩展内存、读取账户、写入持久化存储,成本都不同。[4]
四层 Gas 账本
INTRINSIC
交易还没运行合约,就已有成本
无数据、且接收方不执行代码的经典 ETH 转账基准是 21,000 gas;携带数据、创建合约、访问列表与数据密集型交易还会增加固有成本或最低数据成本。[7]
OPCODES
每条 EVM 指令都有 Gas 规则
例如当前参考表中 ADD 为 3 gas、MUL 为 5 gas;很多指令还有随输入与上下文变化的动态部分。[5]
STATE
第一次访问与重复访问可能不同
EIP-2929 区分冷访问与暖访问:交易内第一次触碰某地址或存储槽通常更贵,之后重复访问较便宜。[6]
CONTEXT
同一个函数也可能用掉不同 Gas
分支、循环次数、数组长度、余额原值、存储槽冷热、外部调用结果都会改变路径。函数名相同,不保证 Gas Used 相同。
深入协议:为什么回执 Gas Used 不只是把 Opcode 标价相加?
当前执行规则先从 Gas Limit 中扣除固有成本与执行消耗,得到原始用量;随后应用受限的状态清理退款,
再与 EIP-7623 的 Calldata 最低成本比较。因而回执里的 gasUsed 是最终计费用量,
不一定等于肉眼把所有 Opcode 成本朴素相加。[13]
退款最多抵扣原始消耗的 20%;Calldata Floor 可能把抵扣后的结果重新抬高。
对 Calldata,令零字节数为 z、非零字节数为 n,
EIP-7623 使用 tokens = z + 4n,并设
calldataFloor = 21,000 + 10 × tokens。
这项规则主要约束数据密集型交易;普通用户通常由钱包与 eth_estimateGas 自动处理。
Gas 计量表是全网必须一致执行的安全与资源定价规则。它近似反映验证、状态访问、数据与存储负担, 但“3 gas”不代表 3 次 CPU 指令,也不保证永远不变。网络升级可以重新定价操作。
三条推导,足以应对大多数钱包界面
- 输入更大或路径更长,通常会增加 Gas Used。
- 写持久状态,通常比只做栈上算术更昂贵,也更依赖上下文。
- Gas Used 相同,不代表 Gas Fee 相同;还要看有效单价。
04 · Budget and settlement
Gas Limit 是预算,不是账单
它告诉 EVM 最多允许消耗多少工作量,也把最坏情况封顶。
发送交易时,钱包填写 gasLimit。执行过程中,EVM 从这份预算里逐步扣 Gas。
如果程序在耗尽前完成,剩余部分不会计入最终用量;如果预算不足,执行就不能无限继续。[1]
进入实际账单
不计入账单
“退回 Gas”其实可能指三件不同的事
未使用的 Gas 预算
gasLimit - gasUsed。它没有变成额外奖励,只是没有成为最终计费用量;协议实现可把预扣部分结算回账户。
未触及的单价上限
maxFeePerGas 高于有效单价的空间不会按上限收费。它是价格保护帽,不是最终报价。
EVM Refund Counter
某些状态清理会产生协议级 Gas 退款计数,并在执行后受上限约束。EIP-3529 把总退款上限降到所用 Gas 的 20%。[8]
钱包通常先模拟交易并留出余量。上限略高时,未用 Gas 不会进入实际账单; 上限过低却可能让本来正确的操作耗尽 Gas 并失败。真正需要审查的是交易内容、估算是否合理,以及最大费用暴露。
钱包发送前在检查什么?
账户通常必须有能力覆盖转账价值,加上按上限计算的潜在执行费用;Blob 交易还需覆盖独立的 Blob 费用上限。 这不代表最终都会扣掉,而是避免执行到一半才发现支付能力不足。对普通用户,钱包会自动调用节点估算 Gas, 但估算基于当时状态:若状态、价格或调用结果变化,真实结算也可能变化。
深入边界:交易 Gas Limit 与区块 Gas Limit 不是同一个上限
交易 Gas Limit 约束一笔交易;区块 Gas Limit 约束一个区块内所有交易的执行 Gas 总量。 截至本课核对日,以太坊主网区块 Gas Limit 约为 60,000,000 gas,EIP-1559 的目标使用量约为其一半; 验证者信号与网络升级可以继续调整这个区块上限。[16]
| 字段 | 约束对象 | 当前边界 |
|---|---|---|
| Transaction gasLimit | 单笔交易愿意提供的执行预算 | EIP-7825 将单笔上限设为 2²⁴,即 16,777,216 gas。[17] |
| Receipt gasUsed | 单笔交易最终计费用量 | 不超过该交易 Gas Limit。 |
| Block gasLimit | 区块中全部普通执行 Gas | 约 60M,属于可演化的网络参数,不是区块字节大小。 |
05 · Failure paths
交易失败了,为什么还会收费?
状态能回滚,节点已经完成的验证与执行工作不能“没发生”。
交易被打包后,许多节点必须按照同一规则执行它,才能共同得出“成功”或“失败”。 即使最终状态变化被撤销,这段计算、读取与带宽工作已经发生,所以已消耗的 Gas 仍按有效单价结算。[1]
协议前置检查不通过
NOT INCLUDED例如 Gas Limit 低于固有要求。无效交易不会被作为正常交易打包,也就没有链上执行费。
成功结束
STATUS · 1状态变化提交;实际费用按 Gas Used 结算,剩余预算不进入账单。
合约主动回滚
STATUS · 0本次顶层状态变化撤销,但 REVERT 可保留尚未消耗的 Gas;费用可能明显低于 Gas Limit。[14]
预算耗尽
STATUS · 0当前调用帧剩余 Gas 被耗尽,顶层未处理时状态回滚;顶层回执的 Gas Used 通常到达 Gas Limit。
status = 0 只告诉你顶层结果失败;还要结合 Gas Used、Limit 与执行追踪判断原因。
回滚的是状态效果,不是计算历史。 余额修改、合约存储与事件日志可以随顶层失败撤销;已经执行的协议工作仍被计量并收费。 对已被区块接受的顶层失败交易,发送者交易 nonce 也已经消耗,不能用同一个 nonce 当作这笔交易从未发生。
深入一层:内部调用失败,不一定让整笔交易失败
一笔顶层交易可以调用合约 A,A 再调用 B。B 若耗尽分配给自己的 Gas,B 的调用帧失败;
A 如果捕获返回值并继续执行,顶层交易仍可能 status = 1。因此“某个内部调用 OOG”
与“整笔交易 OOG”不是同一命题。区块浏览器的调用追踪能展示这层结构,普通回执只保留顶层状态。
先看交易是否被打包;再看回执 status;再比较 gasUsed 与
gasLimit;最后需要时查看 revert reason 或执行追踪。不要只凭“扣了手续费”推断成功。
06 · Interactive lab
亲手拆一张 Gas 账单
同时拨动用量、预算和单价,观察哪些数字真正进入结算。
下面模拟 EIP-1559 类型交易的执行费用。你只需先知道:
有效单价不会高于 maxFeePerGas,并受到所在区块基础费与小费上限约束;
第三课会完整拆解基础费、小费与销毁。
Interactive · 01
Gas Fee 实验室
所有金额仅作机制演示,不代表实时网络价格或任何具体合约的固定 Gas 用量。
实际执行费用
0.001322676 ETH
- 有效 Gas 单价
- 18 Gwei
- 未使用 Gas 预算
- 46,518 gas
- 执行费用上限
- 0.0036 ETH
- 相对上限节省
- 0.002277324 ETH
✓ 单价上限覆盖当前 Base Fee,可被纳入结算计算。
计算:有效单价 = min(maxFeePerGas, baseFee + maxPriorityFeePerGas); 实际执行费用 = gasUsed × 有效单价。若 maxFeePerGas 低于区块 Base Fee,交易当时不能被纳入该区块。
做三个实验
- 保持 Gas Used 不变,只提高 Base Fee:实际费用随有效单价上升。
- 保持所有单价不变,只提高 Gas Limit:只要 Gas Used 不变,实际费用不变。
- 把 Max Fee 调到 Base Fee 以下:不是得到“更便宜的成功交易”,而是当前区块无法按这份报价纳入。
07 · Receipt literacy
交易结束后,去哪里找真实账单?
请求里是预算,回执里才有执行结果。
交易对象告诉节点“我最多愿意用多少 Gas、每单位最多愿付多少”;
交易回执记录“这次实际用了多少、最终每单位按多少结算、顶层是否成功”。
JSON-RPC 的 eth_getTransactionReceipt 会返回这些字段。[3]
{ "status": "0x1", // 成功 "gasUsed": "0x11f0a", // 73,482 "effectiveGasPrice": "0x430e23400", // 18 Gwei "cumulativeGasUsed": "0x8f12c0", "type": "0x2" }
- status1 表示顶层执行成功,0 表示失败;它不是费用字段。
- gasUsed只属于这笔交易,是费用公式中的用量。
- effectiveGasPrice是这笔交易实际每 Gas 结算价格。
- cumulativeGasUsed是本区块截至这笔交易的累计值,不能拿来算这笔交易自己的费用。
区块浏览器通常已经帮你完成换算,但理解原始字段可以避免把累计值、Limit 或报价上限误认成实际值。
回执中还要把三种金额分开
| 金额 | 含义 | 是否属于 Gas Fee |
|---|---|---|
| Transaction value | 交易直接携带、转给目标地址的 ETH。 | 不是 |
| Execution fee | gasUsed × effectiveGasPrice。 |
是 |
| ERC-20 转移额 | 代币合约内部记账变化,通常可从事件与状态读取。 | 不是 |
status = 1 只表示 EVM 顶层执行没有失败,不表示你获得了理想市场价格、没有授权过量,
或合约业务结果符合直觉。费用、执行状态与业务安全需要分别判断。
08 · Units and mental math
Wei、Gwei、ETH:把九个零变成心算
协议用 Wei,钱包常用 Gwei / gas,最终账单常用 ETH。
Wei 是 ETH 的最小单位;1 Gwei 等于 10⁹ Wei,1 ETH 等于 10¹⁸ Wei,也就是 10⁹ Gwei。 Gas Price 常写成 Gwei / gas,只是为了避免展示很长的 Wei 数字。[1]
1 ETH = 10¹⁸ wei
1 gwei = 10⁹ wei
1 ETH = 10⁹ gwei
心算法:Gas Used × Gwei,再除以十亿
先把整数乘完,再把小数点向左移动 9 位。
三个数量级锚点
21,000 × 1 Gwei = 0.000021 ETH21,000 × 10 Gwei = 0.00021 ETH100,000 × 10 Gwei = 0.001 ETH
协议账单以 Wei / ETH 结算。钱包显示的法币金额是用当时汇率做的界面换算, 会随 ETH 市价变化;同一笔历史交易的 ETH 费用不变,事后显示的美元价值却可能变化。
09 · Modern boundaries
这条公式何时需要加括号?
L1 普通执行费用很清晰,但现代以太坊已经有多维费用与不同执行环境。
gasUsed × effectiveGasPrice 是读取以太坊 L1 普通执行费用的核心公式。
但当你进入 Layer 2、Blob 交易、代付或本地模拟时,钱包界面的“总费用”可能还包含别的维度。
普通主网执行
本课主公式直接适用:从交易回执读取 Gas Used 与 Effective Gas Price,计算执行费用。
执行费之外可能还有 L1 数据费
Rollup 在 L2 执行,再把批次数据或证明提交到 L1。不同 L2 的用户总费用拆分不同,不能把主网 21,000 gas 直觉原样搬过去。[11]
与普通执行 Gas 独立计量
EIP-4844 为 Blob 数据建立独立 Gas 与费用市场。Blob 交易的总成本还包括 Blob Gas 费用;它不是普通回执 Gas Used 乘法的一部分。当前完整调节规则还包含后续升级,本课只划清两套计量。[10][15]
用户不付 ETH,不等于没有 Gas
应用、Paymaster 或中继者可以代付,再用代币或业务规则结算。协议仍需计量执行,只是最终承担者和用户界面发生变化。
本地模拟不会产生链上账单
读取 view 函数常通过节点本地执行,不写入区块,因此用户不付链上费;同样代码若作为交易内部执行,仍会消耗 Gas。[2]
具体 Gas 表会演化
网络升级可以调整数据、状态访问与操作码成本。稳定的是“确定性计量 × 单价”的框架,不是每个操作永远固定的数字。
10 · Misconceptions
六个最容易说错的句子
点击展开,把口语直觉改写成协议语言。
“Gas 就是手续费。”
不准确。Gas 是工作量单位;手续费是 Gas Used 与有效 Gas 单价相乘得到的 ETH 金额。
“Gas Limit 填 200,000,就会扣 200,000 gas 的钱。”
不准确。成功执行只按实际 Gas Used 结算;Limit 是预算上限。把 Limit 调高只会提高最大暴露,不会让相同路径自动消耗更多。
“交易失败,手续费应该全部退回。”
不准确。若交易已被打包执行,节点为得出失败结果已经做了工作。状态可以回滚,已用 Gas 仍需结算。
“复杂合约一定比普通转账更贵。”
它通常使用更多 Gas,但最终 ETH 费用还取决于每 Gas 单价。低单价时的复杂调用,可能比高单价时的简单转账便宜。
“区块浏览器里的 cumulativeGasUsed 就是我的 Gas Used。”
不准确。它是区块内截至当前交易的累计用量;计算单笔账单应使用该回执自己的 gasUsed。
“钱包免 Gas,所以网络没有计量这笔执行。”
不准确。更常见的情况是第三方代付、批量摊销或在别的资产中结算。执行资源仍需被某个协议环境计量。
把“为什么贵”翻译成可验证的问题
- 这笔交易在哪条链、属于哪种交易类型?
- 它的
gasUsed是否异常高?执行路径做了什么? - 它的
effectiveGasPrice是否异常高?当时网络报价如何? - 钱包显示的总额是否还含 L1 数据费、Blob 费、服务费或代付结算?
11 · Recap and quiz
把一张账单还原成四步
量工作、设预算、定单价、看回执。
固有成本、数据、指令、内存与状态访问共同形成 Gas Used。
限制最多执行多少工作;未用预算不进入实际账单。
有效 Gas 单价以 Wei / gas 结算,钱包常以 Gwei 展示。
用 gasUsed × effectiveGasPrice 计算已发生的执行费用。
Gas Used 回答“做了多少工作”;Effective Gas Price 回答“每份工作多少钱”; Gas Fee 回答“最后付了多少 ETH”。
01. 下列哪一句最准确?
答案 B。Gas 不是代币;只有乘上每 Gas 的价格后,才得到 Wei / ETH 费用。
02. 一笔交易使用 63,000 gas,有效单价 15 Gwei / gas,实际执行费用是多少?
答案 C。63,000 × 15 Gwei = 945,000 Gwei = 0.000945 ETH。
03. Gas Limit 为 200,000,执行成功只用了 90,000。费用公式里的用量应是哪一个?
答案 A。最终费用用实际 Gas Used;Limit 只是上限。
04. 合约主动 REVERT 后,哪项描述正确?
答案 C。REVERT 不等于“所有执行都免费”,也不必然耗尽全部 Gas Limit。
05. 21,000 gas × 60 Gwei 与 120,000 gas × 5 Gwei,哪一笔实际费用更低?
答案 B。用量更大不代表最终 ETH 费用一定更高,还要乘单价。
06. 从回执计算单笔执行费,应组合哪两个字段?
答案 A。使用这笔交易自己的实际用量与实际单价。
选择答案后,这里会显示你的进度。无论答对与否,每题都会给出解释。
12 · Primary sources
继续查证:从官方文档到协议提案
页面核对日期:2026-07-25。具体 Gas 定价应以当前网络升级后的执行规范为准。
本课以 ethereum.org 的当前开发者文档建立教学主线,再用 EIP 与执行规范解释细节。 黄皮书适合形式化研究,但历史版本中的 Gas 表可能已经被后续升级修改。
-
[01]
ethereum.org · Gas and fees
Gas、Gas Fee、Gas Limit、单位换算、失败费用与当前 EIP-1559 费用概览。 -
[02]
ethereum.org · Transactions
交易字段、Gas Limit、Max Fee、未使用 Gas 与交易生命周期。 -
[03]
ethereum.org · JSON-RPC / eth_getTransactionReceipt
gasUsed、effectiveGasPrice、cumulativeGasUsed、status 等回执字段。 -
[04]
ethereum.org · Ethereum Virtual Machine
EVM、内存、存储、字节码与 Gas 计量的整体关系。 -
[05]
ethereum.org · Opcodes for the EVM
操作码与静态、动态 Gas 成本的可读参考。 -
[06]
EIP-2929 · Gas cost increases for state access opcodes
冷/暖账户与存储访问计量。 -
[07]
EIP-7623 · Increase calldata cost
当前数据密集型交易的最低 Calldata 成本与 Gas Limit 校验边界。 -
[08]
EIP-3529 · Reduction in refunds
状态清理退款变化与 20% 退款上限。 -
[09]
EIP-1559 · Fee market change
Max Fee、Priority Fee、Effective Gas Price 与未用预算结算。 -
[10]
EIP-4844 · Shard Blob Transactions
独立 Blob Gas 计量、Blob 基础费与额外费用边界。 -
[11]
ethereum.org · Scaling
Rollup 在 L2 执行并向 L1 发布数据的基本结构。 -
[12]
Ethereum Execution Layer Specification
跟踪网络升级的可执行规范,适合核对最新交易处理与 Gas 结算细节。 -
[13]
Execution Specs · BPO2 transaction processing
当前主网分叉下原始消耗、退款上限、Calldata Floor 与回执 Gas Used 的结算顺序。 -
[14]
EIP-140 · REVERT instruction
显式回滚状态与保留剩余 Gas 的语义。 -
[15]
EIP-7918 · Blob base fee bounded by execution cost
Fusaka 后 Blob 基础费与执行成本边界的现行补充规则。 -
[16]
ethereum.org · Building on Ethereum in 2026
当前主网区块 Gas Limit、目标使用量与 2026 年协议状态概览。 -
[17]
EIP-7825 · Transaction Gas Limit Cap
单笔交易 2²⁴ Gas 上限与其安全动机。