上链ON-CHAIN BLOCK 04 / 26
卷一 · 世界观BLOCK 04

一笔交易的一生


交易(transaction)是 Web3 里唯一能改变世界状态的东西——没有交易,链就是一潭死水。这一章我们跟着一笔转账,从你按下"确认"的那一刻,走过签名、广播、进入 mempool、被打包、被确认的全过程,顺带把 nonce、gas、EIP-1559 这几个总让新人困惑的概念一次说清。

一笔交易长什么样

剥开钱包的 UI,一笔以太坊交易就是这样一个结构体(签名前):

交易字段
{
  nonce:                 7,          // 我这个账户发出的第几笔交易
  to:                    "0xAlice…",  // 收款方(或合约地址)
  value:                 1.5 ETH,    // 转多少原生币
  data:                  "0x",        // 调合约时的 calldata,纯转账为空
  gasLimit:              21000,      // 我愿意为这笔交易花的最大 gas 量
  maxFeePerGas:          30 gwei,    // 每单位 gas 我最多出的总价
  maxPriorityFeePerGas:  2 gwei,     // 给验证者的小费
  chainId:               1           // 主网=1,防止交易被跨链重放
}

钱包用你的私钥给它签名(见第 3 章),得到一个任何人都能验证"确实来自你、且一字未改"的已签名交易。然后把它扔进网络。

nonce:账户自己的序号计

每个 EOA 有一个从 0 开始、每发出一笔交易就加 1 的计数器,就是 nonce。它有两个作用:

风险记账

nonce 是新手事故高发区。如果你发了一笔 nonce=7 的交易但 gas 给太低卡在 mempool,那么之后所有交易(8、9、10…)都会跟着卡住,因为它们必须排在 7 后面。解决办法是用相同的 nonce=7 重新发一笔更高 gas 的交易把它顶替掉(俗称加速/替换)。理解 nonce 是串行序号,就能想通这类"我的交易怎么全卡住了"。

Gas:链上世界的计价器

凭什么你能让全球几千台机器帮你执行代码?因为你付费。以太坊把每一种操作都标了价——加法多少、存储多少、部署合约多少——用 gas 作单位。你的交易消耗的总 gas × 单价,就是手续费。

概念含义类比
gas used这笔交易实际执行消耗的计算量你开了多少公里
gas price(gwei)每单位 gas 的价格,1 gwei = 10⁻⁹ ETH每公里油价
gasLimit你允许它最多烧多少 gas 的上限油箱容量,防失控
手续费gas used × gas price油钱 = 里程 × 油价

纯 ETH 转账固定消耗 21000 gas。调用合约则视复杂度而定,可能几万到几十万。gasLimit 是你设的上限:执行若在上限内完成,多退;若超出上限,交易失败但 gas 照扣(因为矿工/验证者确实为你算了)。

Android 类比

Gas 有点像给你的后台任务上了一个"最多消耗多少 CPU 时间"的硬配额(想想 WorkManager 的约束或前台服务的时限)。区别是:这里的配额是你自己出钱买的,且真金白银。写得低效的合约 = 每次调用都更贵,所以第 10、11 章我们会认真讲怎么省 gas——它对应你熟悉的性能优化,只是这次直接体现在账单上。

EIP-1559:为什么手续费分成两截

2021 年的 EIP-1559 改革后,手续费不再是单纯竞价,而是拆成两部分:

你在钱包里设的 maxFeePerGas 是"总价上限",maxPriorityFeePerGas 是"小费上限"。实际付 = min(maxFee, baseFee + priorityFee)。base fee 波动导致你实付常常低于上限——多出的会退回。

Gas 费计算器DEMO
试试把 Gas 用量改成 120000(约一次合约调用),或把 Base Fee 调到 100(网络拥堵),感受费用如何变化。

从广播到确认:mempool 里的等待

签好名的交易被广播后,并不会立刻上链,而是先进入 mempool(内存池)——一个全网节点共享的"待打包交易候车厅"。验证者从这里挑交易打包,通常小费高的先上车。你的交易接下来会经历:

  1. Pending(待处理):在 mempool 里排队,任何人都能看到它(是的,你的交易在上链前就公开了)。
  2. Included(被打包):某个验证者把它放进新块并执行,状态改变发生。
  3. Confirmed(被确认):随着后续块不断叠加,它被"埋"得越来越深,回滚的可能性趋近于零。
风险记账

Pending 阶段的公开性催生了 MEV(最大可提取价值)。机器人监视 mempool,发现你要在某 DEX 大额买入,就抢在你前面买、等你推高价格后卖出获利(三明治攻击)。这是 dApp 开发要正视的现实——第 24 章讲 DeFi 时会再遇到它。别以为"还没上链就是安全的",在以太坊上,意图一广播就等于公开

要点入账

一笔交易的一生:构造 → 私钥签名 → 广播进 mempool → 验证者按小费高低打包 → 执行改状态 → 后续块确认。nonce 保证它按序、不被重放;gas 为它的计算量付费;EIP-1559 把费用拆成会被销毁的 base fee 和给验证者的小费。带着这个模型,下一章我们把整个以太坊系统的全貌拼出来。

本章小结

◆ 返回目录