返回知识库
Day 3

交易结构与Gas机制

深入理解以太坊交易结构、EIP-1559费用机制、Nonce原理,并优化GasTracker组件

2025-01-13
交易GasEIP-1559NonceBase FeePriority Fee

核心概念

什么是以太坊交易?

一句话定义: 交易是由EOA发起的、改变以太坊状态的签名指令。

类比理解: 就像银行转账单,包含发起人、收款人、金额、手续费,但还多了"执行指令"(data)的功能,可以调用智能合约。

为什么要理解交易和Gas?

  • 每次链上操作都是交易,理解结构才能排查问题
  • Gas费用直接影响用户体验和成本
  • EIP-1559是以太坊重要升级,面试常考
  • 开发DApp需要正确估算和设置Gas

交易结构详解

交易字段

Transaction (EIP-1559 Type 2)
├── chainId: 1 (主网)
├── nonce: 5 (发送者的第6笔交易)
├── maxPriorityFeePerGas: 2 Gwei (给验证者的小费)
├── maxFeePerGas: 50 Gwei (愿意支付的最高Gas价格)
├── gasLimit: 21000 (最大Gas用量)
├── to: 0x接收地址
├── value: 1000000000000000000 (1 ETH,单位Wei)
├── data: 0x (空=普通转账,有值=合约调用)
├── accessList: [] (EIP-2930访问列表)
└── v, r, s: 签名数据

字段详解

字段说明示例
nonce发送者已发交易数,防重放0, 1, 2...
to接收地址,空则创建合约0x123...abc
value转账金额(Wei)1e18 = 1 ETH
data合约调用数据0xa9059cbb...
gasLimit最大Gas消耗21000
maxFeePerGas最高Gas单价50 Gwei
maxPriorityFeePerGas小费2 Gwei

交易类型演进

类型名称费用字段说明
Type 0LegacygasPrice最早的交易格式
Type 1EIP-2930gasPrice + accessList添加访问列表
Type 2EIP-1559maxFeePerGas + maxPriorityFeePerGas当前主流

EIP-1559 费用机制

核心创新

EIP-1559 (2021年8月伦敦升级) 彻底改变了以太坊的费用机制:

旧模式 (竞价模式):
用户出价 → 矿工选高价交易 → 费用全给矿工
问题: Gas价格波动大,用户难以预估

新模式 (EIP-1559):
Base Fee (算法定价) + Priority Fee (小费)
Base Fee 被销毁 → Priority Fee 给验证者
优势: 费用更可预测,ETH通缩

三个关键概念

1. Base Fee (基础费用)

  • 定义: 由协议算法自动调整的最低Gas价格
  • 特点: 这部分费用会被销毁,不给验证者
  • 调整规则:
  • 区块Gas使用 > 50%目标 → Base Fee上涨(最多12.5%)
  • 区块Gas使用 < 50%目标 → Base Fee下降(最多12.5%)
区块目标: 15M Gas (50%容量)
区块容量: 30M Gas (100%容量)

示例:
区块1: 使用20M Gas (67%) → Base Fee +8%
区块2: 使用10M Gas (33%) → Base Fee -8%

2. Priority Fee / Tip (优先费/小费)

  • 定义: 用户额外支付给验证者的小费
  • 作用: 激励验证者优先打包你的交易
  • 设置: 网络空闲时1-2 Gwei即可,拥堵时需要更高

3. Max Fee (最高费用)

  • 定义: 用户愿意支付的Gas单价上限
  • 公式: Max Fee ≥ Base Fee + Priority Fee
  • 退款: 多付的部分会退还

费用计算公式

实际Gas价格 = Base Fee + Priority Fee
交易费用 = 实际Gas价格 × Gas Used

示例:
Base Fee = 20 Gwei
Priority Fee = 2 Gwei
Gas Used = 21000

交易费用 = (20 + 2) × 21000 = 462000 Gwei = 0.000462 ETH

其中:
- 销毁: 20 × 21000 = 420000 Gwei
- 给验证者: 2 × 21000 = 42000 Gwei

退款机制

设置:
maxFeePerGas = 50 Gwei
maxPriorityFeePerGas = 2 Gwei

实际:
Base Fee = 20 Gwei

计算:
实际支付 = 20 + 2 = 22 Gwei
退款 = 50 - 22 = 28 Gwei (每单位Gas)

Gas 详解

什么是Gas?

定义: Gas是衡量以太坊计算工作量的单位,每个操作消耗固定Gas。

类比: 就像汽车的燃油,不同操作(市区/高速)消耗不同油量,Gas价格就是油价。

常见操作Gas消耗

操作Gas消耗费用估算(@20Gwei)
ETH转账21,000~$1
ERC20转账~65,000~$3
ERC20 Approve~46,000~$2
Uniswap Swap~150,000~$7
NFT Mint~100,000-300,000~$5-15
合约部署~1,000,000+~$50+

Gas Limit vs Gas Used

Gas Limit: 你愿意支付的最大Gas (设置值)
Gas Used: 实际消耗的Gas (执行后)

情况1: Gas Used < Gas Limit
→ 交易成功,多余Gas退还

情况2: Gas Used = Gas Limit (执行中耗尽)
→ 交易失败(Out of Gas),Gas不退还!

建议: Gas Limit设置比预估高20%,避免失败

Nonce 机制

什么是Nonce?

定义: Nonce是账户发送交易的计数器,从0开始递增。

作用:

1. 防止重放攻击: 同一笔交易不能执行两次

2. 保证交易顺序: 必须按nonce顺序执行

3. 取消/加速交易: 用相同nonce覆盖pending交易

Nonce执行规则

当前账户nonce: 5 (已成功发送5笔交易)

发送 nonce=5 → ✅ 成功执行,nonce变为6
发送 nonce=6 → ⏳ 等待(nonce=5还没执行)
发送 nonce=4 → ❌ 失败(nonce太低,已用过)
发送 nonce=8 → ⏳ 等待(需要5,6,7先执行)

利用Nonce加速/取消交易

场景: 发了一笔低Gas交易,一直pending

方法1: 加速交易
→ 发送相同nonce、相同内容、更高Gas的新交易
→ 新交易被打包,旧交易作废

方法2: 取消交易
→ 发送相同nonce、to=自己、value=0、更高Gas
→ 相当于给自己转0 ETH,取消原交易

注意: Gas必须比原交易高,否则不会被替换

链上实操记录

操作1: 在Etherscan查看交易详情

步骤:

1. 打开 https://etherscan.io

2. 找一笔最近的交易

3. 分析各字段含义

观察示例:

Transaction Hash: 0x123...
Status: Success
Block: 18500000
From: 0xabc...
To: 0xdef...
Value: 0.1 ETH

Transaction Fee: 0.00042 ETH
Gas Price: 20 Gwei
Gas Limit & Usage: 21000 | 21000 (100%)

Burnt & Txn Savings Fees:
- Burnt: 0.00038 ETH (Base Fee部分)
- Txn Savings: 0.00012 ETH (退款)

操作2: 发送测试网交易观察Gas

步骤:

1. 在MetaMask切换到Sepolia

2. 发送0.001 ETH给另一个地址

3. 在发送前查看Gas设置

4. 在Sepolia Etherscan查看交易详情

观察:

  • 测试网Gas很便宜
  • 可以看到Base Fee和Priority Fee
  • Gas Limit默认21000(ETH转账)

操作3: 优化GasTracker组件

改动:

  • 添加Base Fee显示
  • 添加Low/Average/Fast三档推荐
  • 添加预估确认时间
  • 添加自动刷新(30秒)
  • 添加最后更新时间

今日思考

问题1: 为什么EIP-1559要销毁Base Fee?

  • 控制ETH供应: 交易越多,销毁越多,可能导致通缩
  • 减少矿工操纵: 矿工无法通过发垃圾交易赚取费用
  • 价值回馈: 销毁相当于让所有ETH持有者受益
  • 实际效果: 高峰期ETH销毁量可超过新发行量

问题2: Gas Limit设置多少合适?

  • ETH转账: 21000 (固定)
  • 合约交互: 查看历史类似交易,+20%余量
  • 复杂操作: 使用eth_estimateGas预估,+30%余量
  • 设太低: 交易失败,Gas不退
  • 设太高: 没关系,多余会退还

问题3: 交易一直pending怎么办?

1. 等待: 网络拥堵时会慢,可以等

2. 加速: 用相同nonce发更高Gas的交易

3. 取消: 用相同nonce发给自己的0 ETH交易

4. MetaMask: 有内置的加速/取消按钮


学习资源

视频教程

资源语言说明
Finematics - EIP-1559英文动画讲解EIP-1559
Whiteboard Crypto - Gas英文Gas概念详解

文档阅读

资源说明
ethereum.org Gas官方Gas文档
EIP-1559费用机制提案原文
ethereum.org Transactions交易结构文档

工具网站

工具用途
Etherscan Gas Tracker实时Gas数据
Blocknative Gas EstimatorGas预测工具
Ultra Sound MoneyETH销毁数据
ETH Burn Bot实时销毁推送

面试题准备

Q: 什么是EIP-1559?解决了什么问题?

30秒版本:

EIP-1559是2021年的以太坊升级,将Gas费分为Base Fee(销毁)和Priority Fee(给验证者)。解决了旧模式下Gas价格波动大、难以预估的问题,同时通过销毁机制让ETH可能通缩。

2分钟版本:

  • 背景: 旧模式是竞价制,用户出价、矿工选高价,导致Gas价格波动大
  • 改进:
  • Base Fee由协议算法自动调整,可预测
  • Priority Fee是给验证者的小费,用户自设
  • Base Fee被销毁,不再给验证者
  • 好处:
  • 费用更可预测(知道Base Fee就能估算)
  • ETH可能通缩(高峰期销毁>发行)
  • 减少矿工操纵空间
  • 数据: 截至目前已销毁超过300万ETH

可能追问:

  • Base Fee如何调整? → 区块使用>50%则涨,<50%则跌,每次最多12.5%
  • 什么是Ultra Sound Money? → 指ETH因销毁变得通缩,比"Sound Money"(BTC)更稀缺

Q: 如何加速一笔pending的交易?

30秒版本:

发送一笔相同nonce但更高Gas的新交易。新交易会替换旧交易被打包,旧交易作废。MetaMask有内置的加速按钮可以一键操作。

2分钟版本:

  • 原理: 同一nonce只有一笔交易能成功,Gas高的更容易被打包
  • 操作步骤:

1. 记录pending交易的nonce

2. 发送新交易: 相同nonce、相同to/value/data、更高Gas

3. 新交易被打包后,旧交易自动失效

  • 取消交易: 发送相同nonce、to=自己、value=0的交易
  • 注意事项:
  • 新交易Gas必须比旧交易高(通常+10%以上)
  • 要快速操作,否则旧交易可能先被打包
  • 工具: MetaMask/Rabby都有一键加速/取消功能

Q: Gas Limit设置太低会怎样?

30秒版本:

交易会因Out of Gas失败,但已消耗的Gas不会退还。所以Gas Limit要设置足够高,建议比预估值高20-30%。


代码实践

今日代码改动

文件: src/components/GasTracker.tsx

改动说明:

优化GasTracker组件,添加EIP-1559相关信息展示

新增功能:

  • Base Fee显示(EIP-1559核心)
  • Low/Average/Fast三档Gas推荐
  • 预估确认时间
  • 30秒自动刷新
  • 最后更新时间显示

关键代码:

interface GasData {
  baseFee: number    // Base Fee
  low: number        // SafeGasPrice
  average: number    // ProposeGasPrice
  fast: number       // FastGasPrice
}

// 从Etherscan API获取
const baseFee = parseFloat(result.suggestBaseFee)
const low = parseFloat(result.SafeGasPrice)
const average = parseFloat(result.ProposeGasPrice)
const fast = parseFloat(result.FastGasPrice)

明日预告

Day 4: EVM原理与账户模型深入

  • EVM执行原理
  • 状态树(State Trie)
  • 在Etherscan查看交易详情
  • 理解Input Data