Ethereum learning path · 06.01

一次点击,如何成为全网共同确认的事实?sign · relay · execute · attest · finalize

钱包里的一次“确认”不是把钱交给某台中央服务器,而是生成一份可验证的状态变更指令。它要经过签名、提交、节点初筛、局部传播、排序执行、全网复验与共识最终性,才逐步成为难以改写的共同事实。

普通 EOA · Type 2 主线 约 35 分钟 协议基线 · 2026-07

Core thesis

交易不是“从钱包移动到区块”的物体,而是一组已签名字节:执行层判断它能否改变状态,共识层决定哪一个有效状态历史成为共同顺序。

01 · Orientation

先把“发生”拆成五件事

看到交易哈希、看到 pending、看到区块、看到 success、看到 finalized,分别在回答不同的问题。

以太坊交易是一条由外部账户发起、希望改变网络状态的已签名指令。最简单的是转移 ETH;更常见的是调用合约。两者走同一条主干流程,但执行内容不同。

Accepted

某个节点接受了吗?

只说明签名字节通过了这个节点此刻的协议检查与本地策略,可能进入它自己的交易池。

Included

进入某个区块了吗?

有区块号、区块哈希与交易索引,说明它进入了当前规范链的一个候选历史。

Executed

顶层执行成功了吗?

收据 status=1 表示成功;status=0 表示已上链但顶层执行失败。

Finalized

历史最终确定了吗?

区块成为 finalized 后,推翻它需要严重的共识失败与大规模质押罚没。

本课采用哪一种交易?

主线采用“普通 EOA 发起的 EIP-1559 Type 2 交易”。这能清楚展示签名、nonce、费用、交易池与区块执行。当前主网也存在 EIP-7702 Type 4;ERC-4337 的 UserOperation 则先走替代交易池与 bundler。它们不是本课主线,不能把所有钱包动作都硬套成完全相同的路径。

02 · Wallet

钱包先准备,再请你授权

“点击确认”之前,钱包通常已经询问节点、构造字段并做过模拟;签名只证明授权,不保证未来成功。

钱包不是区块链本身。它是账户控制与交易构造界面:从 RPC 节点读取链的当前视图,形成待签名载荷,再让本地密钥或硬件设备签名。

读取环境
确认 chainId、发送账户当前/待处理 nonce、余额、base fee 与费用建议。
形成意图
确定 tovaluedata。合约交互的真正动作往往藏在 calldata 中。
估算资源
eth_estimateGas 在某个状态快照上模拟;之后状态、价格或排序改变,真实结果仍可能不同。
展示确认
钱包把机器字段翻译成人类界面。你看到的是解释层,签名覆盖的是规范编码后的字节。
chainId1 · Ethereum
nonce42 · 顺序位置
to / value0xB0…2048 / 0.08 ETH
data0x · 普通转账
gasLimit21,000
maxFee32 gwei
priority cap1.5 gwei
from由签名恢复,不是 Type 2 编码字段

两个哈希,不要混成一个

Signing hash · 签名哈希

对“尚未加入签名值”的规范载荷求哈希。私钥对它产生 yParity / r / s

keccak256(0x02 || rlp(unsigned fields))

Transaction hash · 交易哈希

对完整已签名交易编码求哈希。钱包、节点与浏览器用它定位同一组字节。

keccak256(signed transaction bytes)

03 · Lifecycle

亲手走完七个阶段

选择阶段,观察“谁在行动、产生了什么证据、此刻还不能断言什么”。

交易旅程显微镜

演示数据不会连接钱包或网络;全部状态都在本页本地切换。

Actor · wallet / signer

密钥对明确字段作出授权

自托管钱包通常在本地软件或硬件设备内签名。私钥不需要、也不应该发给 RPC 节点。

此刻的证据

已签名交易字节;可恢复发送者并检查字段完整性。

Actor · wallet → one node

先把字节交给一个执行节点

常见入口是 eth_sendRawTransaction。钱包并非直接连接“全网所有节点”。

此刻的证据

RPC 请求已发出;若解码、准入或本地池接纳失败,节点会返回错误,而不是成功哈希。

Actor · execution client

节点初筛,并尝试接纳进自己的交易池

编码、签名、chainId、nonce、余额、intrinsic gas、费用关系与本地池策略都可能让它拒绝。

此刻的证据

接纳成功后,RPC 才返回交易哈希;这只说明该节点愿意暂存和传播。

Actor · execution peers

交易在执行层网络逐跳扩散

提交节点向邻居公告哈希或交易;每个邻居取得字节后独立复核,再决定是否放进自己的 txpool 并继续传播。

此刻的证据

可见范围扩大,但每个节点的 txpool 仍可能不同。

Actor · local txpool

交易成为“可被挑选的候选”

nonce 连续且当前可执行的交易常被归为 pending;有 nonce 缺口的未来交易可能 queued。

此刻的证据

候选不是承诺;可能等待、被替换、逐出或永不包含。

Actor · builder / proposer / clients

排序后逐笔执行,形成 execution payload

交易基于父状态按顺序运行,生成新状态根与收据;提议者把 payload 放进 beacon block。

此刻的证据

有 block inclusion 与 receipt;区块仍可能在链头附近重组。

Actor · validator set

复验、投票,让历史获得最终性

其他节点重放 execution payload;验证者对链头与 checkpoint 投票,区块逐步走向 safe 与 finalized。

此刻的证据

finalized 区块及其祖先获得加密经济最终性。

当前阶段 01:签名只证明授权与完整性,不证明执行会成功。

04 · Admission

节点为什么接纳,也为什么拒绝

“以太坊规则”与“这个客户端的交易池政策”并不是一回事;入池检查与区块执行也不是一回事。

GATE 01

结构与协议

  • 交易类型与编码能否解析
  • chainId 与当前网络是否匹配
  • 签名是否规范、发送者能否恢复
  • intrinsic gas 与费用字段关系是否合法
  • 是否符合当前协议升级规则
GATE 02

当前状态

  • nonce 是否已过期,或是否存在未来缺口
  • 余额能否覆盖 value 与费用最坏上限
  • 发送者在当前规则下是否可发起
  • 同 nonce 是否已有另一候选
  • 区块纳入时还会按新状态重新检查
GATE 03

本地政策

  • 最低 priority fee / tip 门槛
  • 每账户与全池容量
  • 允许的 nonce gap
  • 同 nonce 替换所需涨幅
  • 超时、资源压力与逐出规则

拒绝不是 revert

结果是否进入区块gas 与 noncereceipt
节点预先拒绝不产生链上费用,不消耗链上 nonce
已包含但顶层执行失败消耗 gas,发送者 nonce 已消耗status=0
执行成功按实际执行消耗 gas,nonce 已消耗status=1

status=0 不只可能来自 Solidity 的 REVERT,也可能来自 out-of-gas 或 invalid opcode。普通 Type 2 交易顶层失败时,调用产生的持久状态、转账与日志回滚,但已经支付的 gas 与发送者 nonce 不回滚。内部调用若失败后被外层合约捕获,顶层交易仍可能是 status=1

05 · Propagation

没有一个“云端总候车室”

交易池不是共识状态。它是每个执行节点为了传播与构建区块维护的本地工作集。

不存在一个“全网统一交易池”。节点的连接对象、接收时刻、容量、最低费用、nonce 政策与逐出规则不同,因此同一时刻看到的候选集合也不同。

pending 与 queued 是节点视角

pending
以 Geth 语境为例,通常是按这个节点当前状态可执行、nonce 连续的交易;不代表下一块保证包含。浏览器也常把“未确认”笼统称为 pending。
queued
节点暂时不能顺序执行的未来交易,常见原因是 nonce 缺口。分类与保留时间是客户端实现细节。
replacement
同一发送者、同一 nonce 的另一笔交易,满足这个节点的费用涨幅政策后可替换本地旧候选。
dropped / evicted
某节点因容量、超时、替换或状态变化移除交易;别的节点仍可能保存甚至包含它。

06 · Architecture

交易与区块,走两张网络

执行客户端传播交易并运行 EVM;共识客户端传播 beacon block 与投票。它们在同一节点内通过 Engine API 协作。

出块时,两个客户端怎样交接?

  1. 共识协议已为 slot 确定提议者职责;Fusaka 后的 proposer lookahead 让未来安排更明确,不是 slot 到来才临时“抽签”。
  2. 提议节点的共识客户端请求一个 execution payload;它可能来自本地执行客户端,也可能经链下 builder / relay 路径取得。
  3. payload 包含一组已排序交易及执行结果承诺。共识客户端把它嵌入并签名 beacon block。
  4. 其他节点收到区块后,共识层检查元数据,执行层按该顺序重放交易并核对状态根。

07 · Execution

打包不是装箱,而是先算出结果

区块中的交易有严格顺序。第 n 笔看到的是前 n−1 笔已经产生的新状态,因此调换顺序可能改变结果。

每 12 秒是一个 slot,也就是一次提议区块的机会;一个 slot 不保证一定出现区块。提议者离线、网络延迟或其他故障都可能让 slot 被错过。

为什么不能简单说“按 gas price 从高到低”?

协议没有规定统一 FIFO 或单纯价格排序。构建者会考虑当前 effective tip、同账户 nonce 依赖、剩余 block gas、MEV、私有 bundle 与自身策略。无论排序如何,最终 payload 必须能从父状态确定性重放,并满足区块规则。

演示:base fee = 18 gwei,priority cap = 1.5 gwei,max fee = 32 gwei
effectiveGasPrice = 18 + min(1.5, 32 − 18) = 19.5 gwei
普通转账 gasUsed = 21,000 → 实际执行费 = 21,000 × 19.5 gwei = 0.0004095 ETH

gasLimit × maxFeePerGas 更接近签名者愿意承担的费用上限与余额准入预算,不是默认实际账单。Type 2 的 base fee 被销毁,priority fee 进入 execution fee recipient。

收据证明了什么?

0x1
status
0x1 · top-level success
blockNumber
0x… · 已包含
transactionIndex
0x2a · 区块内顺序
gasUsed
0x5208 · 21,000
effectiveGasPrice
0x… · 实际每 gas 价格
logs
[] · 本例无事件日志

receipt 是“已进入某区块并执行”的结构化结果,不保存合约函数返回值,也不等于协议最终性。查询尚未包含的交易时,eth_getTransactionReceipt 通常返回 null

08 · Consensus

“确认”不是一个瞬间

从进入链头到 finalized,信心逐层增强。应用显示的 confirmations 只是后继区块计数,不等于 PoS 最终性。

其他节点收到 beacon block 后,不是相信提议者的计算结果,而是让自己的执行客户端重放交易,并检查 state root、receipts root 与 gas 等是否一致。共识客户端同时检查提议者、slot、父块、签名与 fork choice。

block inclusion → head → justified → finalized

为什么通常要跨越 epoch?

一个 epoch 有 32 个 slot,约 6.4 分钟。活跃验证者在每个 epoch 内完成投票;当代表至少三分之二总质押的投票形成 successive checkpoint 的 supermajority link,较新的 checkpoint 可 justified,较早者可 finalized。因此健康网络下常说最终性大约需要十几分钟,但这不是服务等级保证:若足够多验证者离线,链可能继续出块却暂时停止最终化。

09 · Explorer

浏览器页面应该按什么顺序读?

先判断是否包含与顶层结果,再核对意图、费用和最终性;不要只看绿色图标。

01交易哈希

确认你跟踪的是同一组已签名字节;哈希本身不表示成功。

02状态与区块

pending 通常没有 block number;有 receipt 才说明已经包含。核对区块是否仍在规范链。

03from / to / value

发送者由签名恢复;to 若是合约,value 只是随调用发送的 ETH,不是全部动作。

04nonce

同一发送账户的顺序坐标。相同 nonce 的不同哈希通常意味着替换竞争。

05input / method

浏览器的函数名来自 ABI 或启发式解释;真正执行的是 calldata 字节。

06gasUsed × effectiveGasPrice

这是普通执行 gas 账单的核心;gas limit 与 max fee 是上限,不应直接当实际支出。

07logs

成功执行时合约可发出事件。日志是索引线索,不等于合约所有状态变化。

08finality

确认页面是在显示 confirmations、safe 还是 finalized;这些概念不能互换。

10 · Diagnosis

它究竟卡在哪一层?

选择你观察到的症状。诊断首先区分:是否有哈希、是否有 receipt、是否存在同 nonce 竞争、区块是否仍在规范链。

交易命运诊断器

它提供协议层排查顺序,不替代具体钱包或 RPC 的错误信息。

预先拒绝

从错误文本检查编码/签名、chainId、nonce too low、余额、intrinsic gas、费用关系与本地最低政策。没有 receipt 就没有链上 gas 与 nonce 消耗。

仍是本地候选

检查当前 base fee 是否高于 max fee、priority fee 是否缺乏竞争力、nonce 前序是否已完成,以及交易是否只停留在少量节点。

nonce 缺口

同一账户必须按 nonce 顺序执行。较早 nonce 未包含时,较晚交易即使费用高也通常只能等待;先定位最小缺口。

本地替换竞争

相同发送者与 nonce 的另一笔交易被某节点接纳。比较两笔费用与传播范围;旧交易并未从全网被“删除”。

局部逐出或过期

某 RPC 查不到不等于所有节点都没有。检查其他可信节点与链上 nonce;贸然重发相同意图前,先排除原交易仍会被包含的可能。

有效但执行失败

交易已经上链、nonce 已消耗且要支付 gas。结合 trace、revert data 与调用前状态定位合约条件;提高费用通常不能修复逻辑失败。

链头重组

原区块离开规范链。交易可能重新 pending、在另一块出现或因新状态失效;以当前规范链 receipt 与 finality 为准。

当前判断:节点在入池前拒绝;先读 RPC 错误,不要把它当作链上 revert。

11 · Recap

把整课压缩成一条责任链

钱包负责表达与授权;执行节点负责传播和计算;共识验证者负责顺序与最终性;你负责不要把中间状态误认成终点。

意图 → 构造 → 签名 → 单节点提交请求 → 初筛并接纳本地 txpool → 返回 tx hash → 执行层 gossip → 各 peer 复核并入各自 txpool → payload 构建 → 区块提议 → 全网重放 → attestation → finalized

十个必须拆掉的误区

“钱包把私钥交给节点。”

自托管主线只提交已签名字节;私钥留在本地或硬件签名环境。

“签名证明交易会成功。”

签名证明授权与字段完整性,不预测合约状态或排序。

“返回 tx hash 就成功了。”

哈希是标识;receipt 才说明包含和顶层执行结果。

“交易池是全网统一数据库。”

每个执行节点维护自己的局部候选集合。

“入池前节点完整执行合约。”

准入以结构、状态与政策检查为主;模拟也不是未来保证。

“验证者只按 gas price 排序。”

排序还受 effective tip、nonce、MEV、bundle 与 builder 策略影响。

“每 12 秒必有区块。”

12 秒是 slot 时长;slot 是机会,可以错过。

“revert 不收费,nonce 不变。”

已包含失败交易仍消耗 gas,发送者 nonce 仍推进。

“12 confirmations 就是 finalized。”

确认数是应用惯例;PoS finality 由 checkpoint 投票形成。

“其他验证者拿自己的池逐笔比对。”

它们按区块给定顺序重放,核对执行承诺是否一致。

六题校准

1. eth_sendRawTransaction 返回交易哈希,最准确的含义是?

请选择一个答案。

2. 哪项最准确地描述 mempool / txpool?

请选择一个答案。

3. nonce 44 的交易为何可能等待 nonce 42、43?

请选择一个答案。

4. 已包含交易的 receipt 为 status=0,哪项正确?

请选择一个答案。

5. 其他节点怎样检查提议区块里的 execution payload?

请选择一个答案。

6. 为什么 confirmations 不能直接等同于 finalized?

请选择一个答案。

尚未作答。完成六题后,用自己的话复述“哈希、receipt 与 finality 各证明什么”。

12 · Reference

术语与一手资料

以 2026 年 7 月已激活的 Fusaka 主网规则为基线;协议仍会升级,遇到精确边界应回到规范。

核心术语

raw transaction · 原始已签名交易

按交易类型编码、包含签名值的字节序列,可通过 eth_sendRawTransaction 提交。

transaction hash · 交易哈希

完整已签名交易字节的 Keccak-256 摘要,用作稳定标识;它不是成功或最终性证明。

txpool / mempool · 交易池

执行节点维护的本地待处理交易集合,不进入共识状态,也不要求不同节点完全一致。

execution payload · 执行载荷

嵌入 beacon block 的执行层区块内容,包含交易序列和执行结果承诺。

receipt · 交易收据

交易被包含后的执行摘要,包括 status、gasUsed、logs、blockHash 与 transactionIndex 等。

attestation · 见证投票

验证者对其所见链头与 checkpoint 关系签名投票,服务于 fork choice 与最终性。

reorg · 链重组

fork choice 改选另一分支,使链头附近部分区块离开规范链;未 finalized 交易结果可能随之变化。

finality · 最终性

区块成为 finalized checkpoint 或其祖先后获得的加密经济保证;推翻需要严重共识故障与质押罚没。

官方与规范资料

  1. ethereum.org · Transactions

    交易字段、签名、交易生命周期与 typed transaction 总览。

  2. ethereum.org · JSON-RPC API

    eth_sendRawTransaction、receipt 查询与 latest / safe / finalized 标签。

  3. Ethereum Execution APIs · eth_getTransactionReceipt

    收据字段、status、effectiveGasPrice 与未找到时的返回边界。

  4. ethereum.org · Networking layer

    执行层交易 gossip、共识层区块 gossip 与 Engine API 协作。

  5. ethereum.org · Block proposal

    slot、区块提议、execution payload 与接收节点复验。

  6. ethereum.org · Attestations

    验证者投票的组成、传播与 checkpoint 作用。

  7. ethereum.org · Gasper and finality

    justified、finalized、两阶段升级与 LMD-GHOST fork choice。

  8. EIP-2718 · Typed Transaction Envelope

    交易类型前缀与 payload / receipt envelope。

  9. EIP-1559 · Fee market change

    Type 2 字段、签名哈希、base fee 与 priority fee 规则。

  10. EIP-658 · Receipt status code

    receipt 中 status=0/1 的协议来源。

  11. Geth · txpool namespace

    pending、queued 与同账户同 nonce 多候选的客户端视图。

  12. ethereum.org · Fusaka

    2025-12 激活的 Fulu / Osaka 升级、proposer lookahead 与交易 gas cap。

  13. EIP-7825 · Transaction Gas Limit Cap

    Fusaka 后单笔交易 2²⁴ gas 上限。

  14. EIP-7702 · Set EOA account code

    Type 4 交易的现代边界;其失败回滚语义不能与普通 Type 2 完全混同。

  15. EIP-4337 · Account abstraction

    UserOperation、替代 mempool 与 bundler 流程的规范入口。

One sentence

你签的是一份可验证指令;节点传播的是候选;EVM计算的是结果;共识决定的是哪条结果历史成为共同事实。