一笔交易的一生
交易(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 递增执行。nonce=8 的交易会一直卡着,直到 nonce=7 的先被打包。
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 照扣(因为矿工/验证者确实为你算了)。
Gas 有点像给你的后台任务上了一个"最多消耗多少 CPU 时间"的硬配额(想想 WorkManager 的约束或前台服务的时限)。区别是:这里的配额是你自己出钱买的,且真金白银。写得低效的合约 = 每次调用都更贵,所以第 10、11 章我们会认真讲怎么省 gas——它对应你熟悉的性能优化,只是这次直接体现在账单上。
EIP-1559:为什么手续费分成两截
2021 年的 EIP-1559 改革后,手续费不再是单纯竞价,而是拆成两部分:
- Base Fee(基础费):由协议根据上一个块的拥堵程度自动算出,这部分会被销毁(burn,退出流通)。块越满,下一块 base fee 越高;块空,就降。
- Priority Fee(小费):你额外给验证者的加急费,块空间紧张时多给能优先被打包。
你在钱包里设的 maxFeePerGas 是"总价上限",maxPriorityFeePerGas 是"小费上限"。实际付 = min(maxFee, baseFee + priorityFee)。base fee 波动导致你实付常常低于上限——多出的会退回。
从广播到确认:mempool 里的等待
签好名的交易被广播后,并不会立刻上链,而是先进入 mempool(内存池)——一个全网节点共享的"待打包交易候车厅"。验证者从这里挑交易打包,通常小费高的先上车。你的交易接下来会经历:
- Pending(待处理):在 mempool 里排队,任何人都能看到它(是的,你的交易在上链前就公开了)。
- Included(被打包):某个验证者把它放进新块并执行,状态改变发生。
- Confirmed(被确认):随着后续块不断叠加,它被"埋"得越来越深,回滚的可能性趋近于零。
Pending 阶段的公开性催生了 MEV(最大可提取价值)。机器人监视 mempool,发现你要在某 DEX 大额买入,就抢在你前面买、等你推高价格后卖出获利(三明治攻击)。这是 dApp 开发要正视的现实——第 24 章讲 DeFi 时会再遇到它。别以为"还没上链就是安全的",在以太坊上,意图一广播就等于公开。
一笔交易的一生:构造 → 私钥签名 → 广播进 mempool → 验证者按小费高低打包 → 执行改状态 → 后续块确认。nonce 保证它按序、不被重放;gas 为它的计算量付费;EIP-1559 把费用拆成会被销毁的 base fee 和给验证者的小费。带着这个模型,下一章我们把整个以太坊系统的全貌拼出来。
本章小结
- 交易是唯一能改状态的操作;由 EOA 私钥签名,包含 nonce、to、value、data、gas 参数。
- nonce 是账户级递增序号,防重放又定顺序;低 gas 卡住会连累后续所有交易。
- 手续费 = gas 用量 × gas 价格;EIP-1559 把价格拆成自动销毁的 base fee 与给验证者的小费。
- 交易先进 mempool 公开排队再被打包,确认数越多越安全;公开的 mempool 带来 MEV 风险。