从0到深入理解以太坊 · 第二篇 / 第二章 / 第四课

改一笔记录,为什么整条链都会知道?

“不可篡改”不是一个神奇按钮。它来自一条可以逐层验证的因果链: 内容承诺、父区块引用、独立执行、质押投票与经济最终性

  • 02 · 04 第二章 · 第四课
  • ≈ 65 MIN 建议学习时间
  • 02.03 前置:哈希函数

先记住这一句

哈希让改动可见,父引用让改动向后传播; 独立验证与共识,才让替代历史很难成为规范历史
01 / WHAT COUNTS AS HISTORY

先别急着说“不可篡改”:历史到底是什么?

区块浏览器显示的表格不是历史本身;某一台服务器保存的数据库,也不是全网的最终答案。

在以太坊里,历史是网络按照同一套协议规则认可的、从创世区块一路延伸到当前链头的 规范区块序列。英文通常称为 canonical chain

区块高度只是顺序编号。真正把“第 N 块”和“第 N+1 块”锁进一段具体历史的,是后者对前者的密码学引用; 真正决定哪一条有效分支叫“以太坊主链”的,是节点共同执行的分叉选择与最终性规则。

因此,“改历史”不是在一张中心数据库表里改一格。攻击者必须造出另一段从某个旧区块分出去的历史, 让每个区块都满足执行与共识规则,并让足够多的质押权重把它当成规范分支。

01 · Detect

发现内容变了

哈希与根承诺把大批数据压成短指纹。输入哪怕只变一位,承诺通常都会完全不同。

02 · Link

把变化传下去

子区块引用父区块的根或哈希。旧块一变,原来的下一块就不再指向它。

03 · Agree

决定承认哪条链

多条分支都可能通过协议有效性检查;PoS 用最新投票权重与 justified / finalized 检查点规则决定规范历史,罚没则惩罚可证明的矛盾共识行为。

02 / COMMIT BEFORE YOU LINK

一个区块先承诺自己的内容,才有资格成为链的一环

区块哈希不是对“一笔交易”的简称。交易、执行后状态与收据,各有自己的根承诺。

一个真实区块可以包含大量交易、日志和状态变化。节点不必把所有内容塞进下一个区块的父引用; 它们先用认证数据结构得到少数几个根哈希,再把这些根写入区块头。

以太坊执行层的区块头包含三项关键承诺: transactionsRoot 承诺本区块按顺序排列的全部交易; stateRoot 承诺执行完本区块后的世界状态; receiptsRoot 承诺交易执行结果与日志收据。 它们来自 Merkle-Patricia Trie。[2]

这里的“承诺”可以理解为:先公开一个几乎无法针对性伪造的短指纹,日后任何人拿到完整数据, 都能重新计算并检查它是否与指纹一致。它证明“这批数据对应这个根”,却不会单独证明这个根属于主链; 后一个问题必须交给共识。

有序交易列表交易字节或顺序改变,交易根会改变
执行后世界状态账户、余额、合约代码与存储
交易执行收据状态、累计 Gas、日志与 Bloom 等
transactionsRoot本区块交易 trie 的根
stateRoot执行层世界状态 trie 的根
receiptsRoot本区块收据 trie 的根
执行区块头 · Header
parentHash stateRoot transactionsRoot receiptsRoot number timestamp gasUsed
图 01 · 从内容到区块头 执行区块哈希由序列化后的完整区块头计算而来。根承诺进入区块头,所以相关内容改变会沿着“数据 → 根 → 区块头 → 区块哈希”传播。

一笔交易改变,三个根都会变吗?

在哈希抗碰撞的安全假设下,交易字节或顺序改变,transactionsRoot 就会不同。stateRootreceiptsRoot 是否改变,要看执行结果。 例如两种不同输入在特殊情况下可能得到相同的最终业务状态;课程中常画成“三个根一起变”,那只是典型情形,不是逻辑必然。

严格地说,固定长度哈希面对无限多输入,数学上必然存在碰撞;密码学保证的是: 在现实计算资源下,主动找到可利用的碰撞应当不可行。因此“不同”是一项经过工程验证的安全假设,而不是集合论上的绝对命题。

即便后续状态偶然重新收敛到同一个 stateRoot,父哈希链仍会保留中间历史的差异。 因为父引用承诺的是具体前序区块,而不只是当前余额的快照。

03 / TWO LINKS, TWO LAYERS

今天的以太坊,实际有两套嵌套的父引用

执行层负责交易与世界状态;共识层负责提议、证明与规范顺序。两个层都“指向父块”,但对象与算法不同。

初学时说“每个区块保存上一个区块的哈希”没有错,但还不够精确。 The Merge 之后,一个 Beacon 区块在共识层包裹一个执行载荷;两层各自形成连续历史。

Consensus layer

BeaconBlock · 共识层区块

parent_root 指向前一个 Beacon 区块的 SSZ hash_tree_root。共识层 SSZ Merkleization 使用 SHA-256;区块还包含 slot、proposer、证明与 execution payload。

slotproposer_indexparent_rootstate_rootbody
Execution layer

Execution payload · 执行层载荷

parent_hash 指向父执行区块头的 Keccak-256 哈希。执行区块头用 RLP 编码,包含交易根、世界状态根、收据根、Gas 与时间等字段。

parent_hashstate_rootreceipts_roottransactionsblock_hash
同名陷阱 BeaconBlock 的 state_root共识层 BeaconState 的根;execution payload 的 state_root 才是账户、余额与合约存储组成的执行层世界状态根。它们不是同一个对象。
图 02 · 两层区块 X 光图 共识层 parent_root 与执行层 parent_hash 相互嵌套,却不能混为一个字段。官方区块文档列出了两层结构。[1]

Keccak-256 也不要写成 SHA3-256

两者来自同一家族,但标准化时采用了不同的填充规则,结果并不相同。 以太坊执行层传统上使用 Keccak-256;共识层 SSZ 的哈希树使用 SHA-256。说“以太坊所有哈希都是 SHA-256”或“都是 SHA3-256”都不准确。

提议者签名不在父引用里面

共识区块由提议者用 BLS 密钥签名。签名覆盖区块消息的签名根,但不是 parent_root 字段的一部分。改变区块内容后,除了根会变化,原提议者签名也不再对应新消息; 攻击者不能靠重算哈希伪造别人的签名。

04 / THE TAMPER CASCADE

现在动手改一笔:变化会怎样穿过整条链?

先看典型的传播顺序,再亲手比较“断链”与“重算出另一条分支”。

  1. 交易字节改变若改动金额、calldata 等被签名覆盖的交易字段,原签名不再授权新内容;若换成另一笔有效交易,必须带有相应账户的有效签名。
  2. 交易根改变即使用另一笔有效交易替换,transactionsRoot 也会变化。
  3. 区块头改变根是头字段;头变化意味着执行区块哈希变化。
  4. 下一块断开后继区块仍保存旧 parentHash,因此不再指向修改后的父块。
  5. 后缀全部重算逐块更新父引用,只会得到一条新的、自洽但尚未被承认的分支。

篡改传播实验

编辑第二块的记录。先观察原链为何断裂,再“重算后续哈希”,看清数学连续与共识承认的区别。

Interactive 01
Block 01有效

检查点锚 · 0xF0

parent
hash
计算中…
Block 02有效

Alice → Bob · 1.0 ETH

parent
计算中…
hash
计算中…
Block 03有效

Carol → Dex · 0.8 ETH

parent
计算中…
hash
计算中…
Block 04有效

合约结算 · Batch A17

parent
计算中…
hash
计算中…

原链完整:每一块保存的 parent 都匹配前一块的 hash。

为了让浏览器原生运行,这个教学实验使用 Web Crypto 的 SHA-256,并把字段大幅简化。 真实执行区块使用 Keccak-256(RLP(header));共识层还有 SSZ 根、提议者签名与验证者投票。

图 03 · 哈希链只完成了前半题 “把后续哈希都重算”在数学上并不神秘。困难在于被改交易需要有效用户授权,替代共识区块需要合法提议者签名和足够验证者投票;绑定原消息或原区块根的签名与投票不能搬到新根上。
05 / VALID IS NOT CANONICAL

重算出一条漂亮的链,为什么仍然没人承认?

因为“哈希对得上”只是最低门槛。区块还必须通过执行、签名、状态与共识检查。

其他节点收到区块后,不会相信提议者附带的计算结果。执行客户端会重新执行交易, 检查发送者签名、nonce、余额、Gas、合约规则与执行后的状态根是否一致。[5]

01结构与父块字段编码正确,父引用存在,区块接在允许的分支上。
02授权与顺序交易签名、chain id、nonce 与账户授权有效。
03独立重执行按 EVM 与协议规则逐笔执行,不采用提议者的“口头答案”。
04根承诺比对自己得到的交易根、收据根与状态根必须匹配区块头。
05共识有效性检查提议者签名、slot、证明,并送入分叉选择。

这解释了一个常见误解:控制大量质押并不等于可以把“无签名转走 Alice 的钱”写成有效历史。 所有诚实执行客户端仍会判定这种状态转换无效。攻击者能够操纵的是哪些有效交易被纳入、按什么顺序、 哪条有效分支成为链头,而不是随意改写执行规则。

Validity

这条分支符合规则吗?

交易与区块是否有效、执行结果是否正确。无效分支无论得到多少网络转发,都应被节点拒绝。

Canonicality

有效分支里选哪一条?

网络延迟可能暂时产生多个有效候选。LMD-GHOST 与 Casper FFG 决定链头与不可回退的检查点。

06 / WHEN VALID BRANCHES COMPETE

链头附近并不总是只有一条路

网络延迟、错过 slot 或冲突提议,都可能让节点暂时看到不同分支。以太坊 PoS 不是简单选“最长链”。

Fork choice 回答的是:“在我当前看到的所有有效区块中,下一块应该接在哪个链头上?” 以太坊使用 LMD-GHOST,从已经 justified 的检查点出发,沿着验证者最新消息所支持、 以有效质押余额加权的最重子树前进。[6]

LMD 是 Latest Message Driven:每位验证者只以最新有效投票计权; GHOST 关注的是整棵子树得到的权重,而不是只数末端区块个数。 所以“节点最多的一边”或“块最长的一边”都不是准确表述,关键是活跃质押权重

Ffinalized
Jjustified
A有效候选
B较重子树
HEAD最新投票权重 68
A′同样有效
B′权重 21 · 落选
68 主分支21 竞争分支
图 04 · 有效不等于胜出 两个分支都可能通过执行验证。节点按相同的分叉选择规则收敛到权重更高的链头;与 finalized checkpoint 冲突的分支会被排除。

什么是重组?

Reorg 不是把旧区块悄悄改掉,而是节点原先暂时选择分支 A, 后来收到更多区块或投票后,改选另一条有效分支 B。A 上的某些区块会离开规范历史, 其中的交易可能回到待处理池、在 B 上重新纳入,或因为冲突而失效。

因此刚被提议的 latest 区块仍有短重组风险。 钱包显示“已上链”不一定等于“已经最终化”;交易所、大额结算与跨链桥会根据风险选择等待 safefinalized 状态。

07 / CRYPTO-ECONOMIC FINALITY

分叉选择管“现在接哪”,最终性管“过去不能退到哪”

LMD-GHOST 选择链头;Casper FFG 用检查点投票把较老历史锁进经济安全边界。两者合称 Gasper。

以太坊把时间分成 12 秒的 slot,并把 32 个 slot 组成一个 epoch。 验证者除了支持链头,也对 epoch 边界的检查点投票。当至少三分之二活跃质押权重形成 超多数链接时,较新的检查点可以 justified;当后继检查点满足条件,较早检查点 finalized。

检查点之间的所有祖先区块随之获得最终性。正常网络条件下通常要约两个 epoch,也就是大约 13 到 15 分钟; 如果网络或验证者出现故障,最终化会延迟,所以这不是固定倒计时。

pending

还没进入规范块

交易可以被替换、丢弃或因费用和 nonce 问题长期等待。

latest

当前链头附近

已经进入目前选择的分支,但网络延迟或竞争块仍可能带来短重组。

safe

高度可信

得到强共识支持,正常条件下极难被替换,但语义仍不同于 finalized。

finalized

经济上不可逆

对同一可追责验证者集合制造冲突最终性,至少约三分之一活跃质押权重会留下可罚没的矛盾证据。

图 05 · 安全不是一个开关 JSON-RPC 明确提供 latestsafefinalized 区块标签。应用应根据损失规模选择确信等级。[8]

最终性为什么是“加密经济”的?

因为它不是用数学定理宣告“宇宙中绝不可能出现另一个区块”,而是让互相冲突的最终性投票 会在同一可追责验证者集合中暴露大规模可罚没行为。要制造冲突最终性,至少约三分之一活跃质押权重会留下矛盾证据; 退出并完成提款后的长程攻击,则由近期弱主观性检查点防御。极端情况下还会触发社区、客户端、应用与交易所的链下协调。[7]

≈ 1/3 可阻断最终性

当恶意或离线质押达到约三分之一的临界规模,诚实投票便无法稳定形成三分之二超多数。inactivity leak 会逐渐降低不参与者权重,帮助诚实链恢复最终化。

> 1/2 可主导链头

能够控制 LMD-GHOST 权重,实施审查、排序和短程重组;但仍不能伪造用户签名、制造无效 ETH 或让无效执行通过。

≥ 2/3 可单方最终化

能够为偏好的有效分支形成超多数链接。若同一可追责验证者集合制造冲突最终性,至少约三分之一活跃质押权重会留下可罚没证据,并可能触发社会恢复。

08 / IMMUTABILITY, WITH BOUNDARIES

“难以篡改”不等于绝对、真实、保密或永久可下载

把边界讲清,不会削弱区块链;它会让你知道每一层安全保证究竟覆盖什么。

弱主观性:新节点需要一个近期锚点

PoS 的旧验证者退出后,理论上可以用早已没有经济风险的旧密钥签署一段长程替代历史。 已在线并跟随最终性前进的节点会拒绝回退;但一个第一次同步、或离线过久的节点,需要从多个独立来源核对一个 近期 weak-subjectivity checkpoint,把它当作“近处的创世锚”,再从那里自行验证向前。 检查点需要多新取决于验证者集合变化,不是永久固定的天数。[9]

社会层:机器无法替人回答所有极端问题

如果真的出现两条互相冲突、都声称 finalized 的链,协议内规则会暴露严重故障与可罚没证据, 却不能自动替全世界决定“哪条链继续叫 Ethereum”。节点运营者、客户端团队、应用、交易所与用户必须链下协调。 这不是日常治理,而是加密经济防线失效后的最后手段。

对象链真正保证什么它不保证什么
链上数据被共识接受后,内容与顺序可验证,最终化历史极难被替换。不保证输入对应现实真相,也不保证内容合法、有价值或无偏见。
合约状态每次有效状态转换留下可验证的历史承诺。不等于状态永远不变;未来交易、管理员权限或升级代理可以合法改变它。
区块浏览器可以把链上数据索引成人能阅读的界面。浏览器运营者可以出错、审查或下线;网页不是信任根。
预言机输入可以证明“某个预言机在链上提交了这份数据”。不能凭空证明天气、价格或选举结果在现实中一定正确。
NFT / URL若链上存哈希,可检查拿到的文件是否匹配该承诺。不保证链外服务器永久保存文件,也不保证 URL 永远可访问。
历史存储拿到历史数据后,可用区块头与根承诺验证完整性。不要求每个节点永久保存每个历史字节;完整性与可获取性是两件事。
误解 01

“哈希阻止任何人修改”

任何人都能修改自己的副本。哈希使修改暴露,共识拒绝未经认可的替代历史。

误解 02

“改一块,后面自动消失”

后续原块仍可存在,只是父引用不再匹配。逐块重算会形成另一条分支,而非让原历史消失。

误解 03

“最长的链就是主链”

这是过时且不准确的简化。以太坊 PoS 用 LMD-GHOST 的最新、质押加权投票选择最重子树。

误解 04

“finalized 等于数学绝对”

它是强大的经济最终性。冲突需要大规模可罚没行为,并在极端故障中依赖社会恢复。

误解 05

“上链就证明现实是真的”

链验证规则内的数据与授权。链外事实仍取决于传感器、预言机与制度来源。

误解 06

“每个节点保存全部历史”

节点角色和保留策略不同。数据可用性、历史存储与密码学可验证性必须分别讨论。

09 / THE COMPLETE CAUSAL CHAIN

把整课压缩成一条可验证的推导链

“不可篡改”不是单一技术属性,而是多道防线相乘后的结果。

难篡改 ≈ 内容承诺 × 父引用 × 独立执行 × 质押投票 × 经济最终性 × 近期信任锚

ROOTS
区块头承诺本块交易、执行后状态与收据。内容改变会让相应根改变,节点可以独立复算。
PARENT
子区块引用具体父区块,使历史形成有方向的链。旧块改变会破坏后继父引用;重算后缀只会创建另一条分支。
EXECUTE
节点不信任提议者的答案,而是重放交易。签名、nonce、余额、Gas、EVM 规则和状态根必须全部一致。
HEAD
LMD-GHOST 用最新且质押加权的投票选择当前链头。多条有效分支竞争时,规范性来自共识,不来自“哈希更漂亮”。
FINAL
Casper FFG 用三分之二超多数链接最终化检查点。同一可追责验证者集合中的冲突最终性至少暴露约三分之一可罚没质押;长期离线节点还需要近期弱主观性检查点。
ANCHOR
新节点从近期弱主观性检查点开始自行验证。社会层只在长程同步或灾难性共识故障的边界出现。
10 / CHECK YOUR MODEL

现在检查你的理解

每题都在测试一个最容易被一句宣传语掩盖的边界。点击选项后立即查看解释。

01 为什么只修改旧区块中的一笔交易,会影响后续区块?

答案 B。改变交易会改变交易承诺与区块头哈希,原后继块仍引用旧父哈希,于是链接失配。

02 攻击者把所有后续父哈希都重算后,得到了什么?

答案 C。数学连续不等于规范性;节点还要验证交易、状态、签名、提议与投票。

03 Merkle 交易证明能够单独证明什么?

答案 A。包含证明锚定到一个给定 root;该 root 是否属于规范链,需要区块链接与共识证明。

04 以太坊 PoS 的 LMD-GHOST 主要解决什么问题?

答案 B。执行层先判断候选是否有效;LMD-GHOST 再在有效候选中选择当前最重分支。

05 控制 51% 左右质押权重的攻击者仍然不能做什么?

答案 C。质押权重影响共识选择,不会解除数字签名与 EVM 状态转换规则。

06 “finalized”最准确的含义是什么?

答案 A。最终性极强,却不是抽离协议、经济和社会层之后的数学绝对。

11 / TERMS & PRIMARY SOURCES

术语与一手资料

先掌握本课最小词汇,再沿官方规范继续深入。页面中的阈值均指活跃质押权重,不是机器或实体数量。

承诺根 COMMITMENT ROOT

把一组结构化数据压缩成固定长度的密码学承诺。改变相关数据通常会改变根;拿到数据后可重新计算并核对。

父哈希 / 父根 PARENT HASH / ROOT

子区块中指向具体父区块的密码学引用。执行层使用 parent_hash,共识层使用 parent_root,二者对象与编码不同。

规范链 CANONICAL CHAIN

节点按照协议的有效性、分叉选择与最终性规则共同认可的区块序列。其他有效分支仍可能存在,但不决定规范状态。

分叉选择 FORK CHOICE

当节点看到多条有效候选分支时,决定当前链头的协议规则。以太坊 PoS 使用 LMD-GHOST。

重组 REORG

节点从一个暂时选择的有效分支切换到另一个分支,使一部分区块离开规范历史。通常发生在链头附近。

Justified 已论证检查点

得到至少三分之二活跃质押权重超多数链接支持的检查点,是通往 finalized 的中间状态。

Finalized 已最终化

通过 Casper FFG 锁定的检查点及其祖先。同一可追责验证者集合中的冲突最终性至少涉及约三分之一活跃质押权重的可罚没矛盾行为;退出并完成提款后的长程攻击由弱主观性检查点防御。

弱主观性 WEAK SUBJECTIVITY

PoS 新节点或长期离线节点需要从链外核对近期可信检查点,再从那里独立验证向前的安全要求。

继续阅读

  1. 01
    ethereum.org — BlocksBeacon 区块、execution payload、parent_root、parent_hash 与各类根字段的官方入门说明。
  2. 02
    ethereum.org — Merkle Patricia Trie执行层 stateRoot、transactionsRoot、receiptsRoot 与交易 trie 的准确结构。
  3. 03
    Ethereum Execution Specs — Block Header当前执行规范中的区块头、父哈希与各项密码学承诺字段。
  4. 04
    Ethereum Consensus Specs — Beacon ChainBeaconBlock、SSZ hash_tree_root、提议者签名与共识状态转换的规范定义。
  5. 05
    ethereum.org — Proof-of-stake交易执行、节点复算、slot、epoch、LMD-GHOST、检查点与最终性的官方总览。
  6. 06
    Ethereum Consensus Specs — Fork Choice最新消息、质押加权、justified / finalized checkpoint 与可行分支过滤的精确定义。
  7. 07
    ethereum.org — PoS Attack and Defense重组、最终性延迟、双重最终性、不同质押阈值与社会恢复的安全边界。
  8. 08
    ethereum.org — JSON-RPC APIlatestsafefinalized 区块参数的实际接口语义。
  9. 09
    Ethereum Consensus Specs — Weak Subjectivity Guide近期检查点、弱主观性周期与节点同步保护的规范指南。
  10. 10
    Ethereum Foundation Blog — Partial History Expiry为什么历史完整性不等于要求每个执行客户端永久保存全部旧数据。