Ethereum learning path · 11.02

一枚根哈希,如何证明一片森林?

Merkle Tree 的价值不在“长得像树”,而在于把任意多、按规则排列的数据 压成一枚固定长度承诺,并允许验证者只拿一条短路径,独立检查某个值是否属于那份数据。

  • 从零到协议边界
  • 约 55 分钟
  • 4 个图解实验
  • 6 题自测
01 · COMMIT

根不是数据的压缩包,而是数据的密码学承诺。

你不能从根恢复整棵树;但数据、顺序或编码只要改变,根通常就会改变。

02 · PROVE

验证一个叶子,不必下载全部叶子。

平衡二叉树中,只需每层一个兄弟哈希;证明与验证成本随树高对数增长。

03 · BOUNDARY

证明“属于某个根”,不等于证明“内容是真的”。

你仍需知道根来自哪个区块、编码规则是什么,以及底层数据是否可获得。

00 / ORIENTATION

先把 Merkle Tree 要解决的问题说清

想象你只信任 32 字节,却要核对数百万条状态。关键不是把数据“缩小”,而是把信任锚点缩小。

上一课把 Ethereum State 看成“所有账户与合约状态的集合”。真正的节点当然可以保存并重算全部状态; 但手机、浏览器、桥、Rollup 或一份离线审计程序,往往只想核对其中一个账户或一个存储槽。

如果远程服务器说“这个地址在区块 B 的余额是 5 ETH”,你有三个选择: 完全相信服务器、下载整个状态自己重建,或要求服务器交出一份可以对照区块承诺验证的短证明。 Merkle Tree 为第三条路提供了基础构件。

Precise definition

Merkle Tree 是一种基于哈希的认证数据结构: 叶子承诺具体数据,内部节点承诺按顺序排列的子节点,最终根哈希承诺整份有序数据及其结构。

DATA

原始数据

账户记录、交易、收据、文件块或白名单地址。哈希函数最终只接收字节,不理解“余额”的语义。

LEAF

叶子承诺

原始数据按规范编码后得到的值或哈希。叶子的格式属于协议规则,不能由验证者临时猜。

INTERNAL NODE

内部节点

通常由有序子节点再次哈希而成。左右位置是输入的一部分,交换顺序通常会改变父哈希。

ROOT

根承诺

固定长度的最终摘要。比较两枚根很便宜,但根本身不会告诉你是哪一条数据发生了变化。

PROOF

证明路径

从目标叶子到根,每一层缺失的兄弟节点,加上左右方向与必要的编码元数据。

TRUSTED ANCHOR

可信根

验证的参照物。它可能来自已最终确认区块、轻客户端或你已信任的签名清单。

“一棵 Merkle Tree”还不够精确

仅说“我们使用 Merkle Tree”无法让两个实现算出同一枚根。协议至少要回答下面五个问题; 其中任何一项不同,得到的根都可能不同。

01

数据怎样编码?

5、字符串 "5"、十六进制 0x05 与 32 字节整数不是同一输入。

02

叶子怎样形成?

叶子可以直接是固定长度块,也可以是 H(prefix ∥ encodedData)

03

父节点怎样形成?

常见形式是 H(prefix ∥ left ∥ right);哈希函数、前缀和输入顺序都必须固定。

04

数据如何排序与定位?

按原始顺序、按键排序、按索引定位或沿 key 的比特路径,表达的是不同结构。

05

叶子不是 2 的幂怎么办?

复制末叶、补零、提升孤儿节点或显式混入长度都可行,但验证双方必须采用同一规则。

06

结构如何区分?

域分离可让“叶子字节”与“内部节点字节”无法被混作同一种对象,减少结构歧义。

本课模型的边界

前半课用四叶、平衡二叉 Merkle Tree 教清根与证明。它不是以太坊执行层状态树的逐节点复制品。 当前执行状态使用 modified Merkle-Patricia Trie;Patricia 的路径压缩、十六进制分支与 RLP 留到下一课。

01 / DATA → ROOT

从四条数据,一层一层算出根

先把每条记录变成叶子,再把相邻承诺按确定顺序两两合并;改动只沿祖先路径向上传播。

下面的教学树使用 SHA-256 与显式域分离。叶子前加 0x00, 内部节点前加 0x01。这样做是为了把概念讲清,不代表执行层 MPT 采用同一套具体编码。

Leaf Lᵢ = SHA-256(0x00 ∥ UTF8(dataᵢ))
Parent P₀₁ = SHA-256(0x01 ∥ L₀ ∥ L₁)
Parent P₂₃ = SHA-256(0x01 ∥ L₂ ∥ L₃)
Root R = SHA-256(0x01 ∥ P₀₁ ∥ P₂₃)

符号 表示字节拼接,不是文本中的加号,也不是把十六进制字符串直接相连。

  1. 规范化数据 先确定字符编码、整数宽度、字段次序与长度;“语义相同”不代表字节相同。
  2. 生成叶子承诺 每条数据独立哈希。任何一位变化都通常会让叶子摘要出现完全不同的输出。
  3. 按位置合并兄弟 左摘要在前、右摘要在后。父节点不保存原文,只承诺这两个子承诺及其顺序。
  4. 递归直到只剩一枚根 根长度固定为 32 字节,与叶子是一百条还是一百万条无关。

Root propagation lab

真实 SHA-256 · 页面内计算
Root · R c916ccc5a590…323d5ee
Parent · P₀₁ 6dd9899e4de4…d79922f
Parent · P₂₃ 78244ac594f5…3386b93
Alice: 5 ETH 52a347438bdd…5b38fac
Bob: 8 ETH 74c4e979dde2…179fc8eb
Carol: 13 ETH 70a3261adb2c…c83537a5
Dave: 21 ETH fda6fd5428ab…eb709304

初始根为 c916ccc5…323d5ee。改变 Alice 会重算 L₀、P₀₁ 与 Root;右侧子树 P₂₃ 不需要改变。

Current leaf L₀ 52a347438bdd78cc…5b38fac
Current root c916ccc5a590743d…323d5ee

为什么一次更新只重算一条路径?

Alice 的叶子变化后,它的兄弟 Bob 没变,右半棵树也没变。重算只发生在 L₀ → P₀₁ → Root 这条祖先链。对一棵有 n 个叶子的平衡二叉树, 树高约为 log₂(n),所以单点更新只影响约 log₂(n) 个层级。

“持久化 Merkle Tree”还可以复用未改变的旧节点,因此同一数据库可保留多个历史根, 只为变更路径创建新节点。以太坊状态树的工程实现更复杂,但“未变子树可由旧哈希继续代表” 是理解状态根高效更新的重要直觉。

四个经常被省略、却会让根算错的细节

ORDER

左右不能随意交换

H(left ∥ right) 通常不等于 H(right ∥ left)。证明必须携带方向或可推导位置。

BYTES

哈希的是字节,不是视觉文本

大小写、空格、Unicode 规范化、整数大小端与字段长度都会改变输入字节。

SHAPE

树形也是承诺的一部分

同一组叶子采用不同分组、补齐或提升规则,最终根可以不同。

DOMAIN

叶子与内部节点最好分域

不同前缀避免某段字节既被解释成原始叶子、又被解释成两个子摘要的拼接。

02 / MERKLE PROOF

不下载整棵树,也能把叶子算回根

证明不是“从叶子到根的所有节点”,而是验证者在每一层缺少的兄弟承诺。

要证明 Alice 位于四叶树的第 0 号位置,验证者已经拿到了 Alice 的数据, 因此不需要再次发送 L₀;它只缺同层的 L₁ 与另一半子树的 P₂₃

Membership proof lab

选择叶子 · 注入篡改 · 本地验根
  1. INPUT
    Alice: 5 ETHposition = 0 · bits = 00
  2. LEVEL 0
    右兄弟 L₁74c4e979dde2…179fc8eb
  3. LEVEL 1
    右兄弟 P₂₃78244ac594f5…3386b93
  4. RESULT
    计算根与可信根一致c916ccc5a590…323d5ee

验证通过:使用目标值、位置和 2 个兄弟哈希,重算得到可信根 c916ccc5…323d5ee。

验证算法实际上只做三件事

node = hashLeaf(encodedValue)

for each (sibling, direction) in proof:
    if direction == "sibling_on_left":
        node = hashParent(sibling, node)
    else:
        node = hashParent(node, sibling)

accept if node == trustedRoot

左右方向不能省略。假设当前节点在父节点右边,拼接顺序必须是 sibling ∥ current;若当前节点在左边,则是 current ∥ sibling。 有些树可从固定索引逐位推导方向,因此证明格式不一定显式传一串“左/右”。

为什么证明是 O(log n)?

平衡二叉树每上升一层,覆盖的叶子数翻倍:1、2、4、8……覆盖 n 个叶子需要约 log₂(n) 层。单叶证明每层补一个兄弟摘要,所以证明哈希数量与树高相同。

Proof scaling lab

假设平衡二叉树 · 每个摘要 32 字节
2³²

这里比较的是概念二叉树的哈希负载,不包含位置、编码和协议封装;MPT 证明大小不能直接套用这条简单公式。

根承诺
32 B
单叶证明
640 B
全部叶子
32 MiB
O(log n) 不等于“永远很小”

复杂度只描述增长趋势。真实证明大小还取决于分支数、节点编码、键路径、稀疏程度与共享节点。 以太坊当前十六叉 MPT 的单层可能需要更多兄弟信息;未来二叉状态树提案的一项动机正是缩小常规证明。

一次证明多个叶子:不要机械拼接多份单证明

若要同时证明多个相近叶子,它们的路径常共享上层兄弟节点。Merkle multiproof 只提供恢复相关子树所需的最小辅助节点,能去掉重复哈希。以太坊共识规范专门定义了基于 generalized index 的多证明辅助索引算法。[5]

03 / SECURITY BOUNDARIES

根能保证什么,又不能保证什么?

Merkle Proof 是密码学完整性证明,不是事实审查、共识证明或数据可用性证明的万能替代。

验证通过的准确含义是:在约定哈希与编码规则下,这个值与这条路径能够重建你给定的根。 它没有自动回答根是否属于规范链、数据从现实世界采集得是否正确,也没有保证其他叶子随时可下载。

Merkle 根与证明的保证边界
问题 能否单独保证 还缺什么
给定值属于给定根 可以 正确证明、位置、编码与安全哈希假设
数据未被悄悄修改 可以检测 先前可信根或签名根作为比较锚点
根属于以太坊规范链 不可以 共识验证、轻客户端或可信区块头来源
叶子陈述的是现实真相 不可以 数据来源、预言机、签名与业务验证
整份数据仍然可获得 不可以 数据可用性机制、存储与传播保证
根一定对应唯一可行数据集 计算上近似 抗碰撞哈希与无歧义编码;不是数学上的绝对不可能

安全性来自哪些假设?

COLLISION RESISTANCE

难以找到两份不同输入却同摘要

若攻击者能主动制造碰撞,就可能让不同节点或数据共享同一承诺,完整性保证会崩溃。

SECOND PREIMAGE

难以替换已承诺的数据

给定一份已承诺输入,攻击者应难以再找出另一份输入产生同一根。

CANONICAL ENCODING

同一对象必须只有一种字节解释

编码若有歧义,双方甚至不需要攻破哈希,就可能对“同一条记录”计算出不同叶子。

TRUSTED ROOT

根的来源必须被认证

攻击者完全可以为伪造数据自建一棵自洽的树,并交给你一份能通过它自己假根的证明。

01 共识链头或最终区块

先知道哪个区块头应被接受。

02 区块中的根承诺

读取该区块承诺的 stateRoot 等字段。

03 服务端提供证明

服务端可以不受信任,但必须给出路径节点。

04 本地重算并比较

只有重算根等于锚点,目标值才被接受。

成员证明与不存在证明不是同一道题

普通的有序叶子 Merkle Tree 很容易证明“某值在第 i 个位置”,却未必能仅凭一条缺失路径证明 “某个键在全集中不存在”。一种做法是先按键排序,再证明查询键落在两个相邻键之间; 另一种做法是采用把整个键空间映射为路径的 sparse Merkle Tree 或 trie。

以太坊 MPT 可以通过路径在空分支终止,或在叶子/扩展节点处出现不匹配,提供不存在证明所需的信息。 这正是下一课要进入的 Patricia Trie 结构细节。EIP-1186 也明确讨论了账户或存储值不存在时的证明。 [8]

新鲜度陷阱

一份对旧区块根有效的证明可以完全正确,却已经不是“当前状态”。验证时必须把 value + proof + root + block identifier 视为同一组对象;latest 还可能发生重组, safefinalized 表达的共识保证也不同。

04 / ETHEREUM MAPPING

以太坊不是只使用“一种 Merkle Tree”

执行层与共识层都依赖根承诺,但数据结构、编码、哈希函数和证明格式并不相同。

说“以太坊把状态放在 Merkle Tree 里”作为入门直觉没有问题;进入协议层后,必须马上补上限定: 当前执行状态是 modified Merkle-Patricia Trie,共识对象则用 SSZ Merkleization。

Execution layer

Modified Merkle-Patricia Trie

  • stateRoot

    承诺执行完区块后所有账户状态;账户值包含 nonce、balance、storageRoot、codeHash。

  • transactionsRoot

    承诺执行区块中的交易集合与索引映射。

  • receiptsRoot

    承诺交易收据,包括执行结果与日志等信息。

  • Keccak-256 + RLP

    节点以 RLP 编码;较长节点通常由 Keccak 哈希引用,短节点可内联。

Consensus layer

SSZ Merkleization

  • hash_tree_root(object)

    把 SSZ 对象分成 32 字节 chunks,并递归计算二叉 Merkle 根。

  • SHA-256

    共识规范的基础哈希函数,与执行层广泛使用的 Keccak-256 不同。

  • generalized index

    根编号 1;节点 k 的左右子节点为 2k 与 2k+1,可稳定定位嵌套字段。

  • zero padding + mix-in

    容器、向量、列表与可变长度数据按 SSZ 类型规则补齐并混入长度。

维度 本课四叶教学树 执行层状态 MPT 共识层 SSZ
主要目的 理解根与证明 认证键值状态并支持更新/查找 序列化共识对象并生成 hash-tree-root
分支结构 平衡二叉 十六进制路径、branch/extension/leaf 类型驱动的二叉 Merkle 树
哈希示例 SHA-256 Keccak-256 SHA-256
编码 UTF-8 + 教学前缀 RLP + hex-prefix 路径编码 SSZ 类型规则
位置来源 数组索引 键哈希后的 nibble 路径 generalized index
能否直接互换证明 不能 不能 不能

执行状态里的“两层证明”

世界状态树的键是账户地址的 Keccak 摘要路径,叶子值是账户对象。合约账户对象中的 storageRoot 又承诺这个合约自己的存储 trie。因此证明某个存储槽通常要走两段: 先证明账户属于 stateRoot,再用账户中认证过的 storageRoot 证明槽值。 [2][6]

01 可信执行区块头

从规范链区块取得 stateRoot

02 账户证明 accountProof

沿 keccak(address) 路径重建 stateRoot

03 账户对象

认证 nonce · balance · storageRoot · codeHash

04 存储证明 storageProof

沿 keccak(slot) 路径重建该账户的 storageRoot

05 目标 storage value

只有两段根都匹配,槽值才被锚定到该区块状态。

stateRoot、transactionsRoot、receiptsRoot 不要混用

三者都出现在执行区块头语境中,却承诺不同对象。节点重执行区块交易后,会检查新状态根、 交易根、收据根等承诺与区块头是否一致;任一不匹配都不能把该执行结果当作有效区块接受。 [3][4]

STATE ROOT

“执行后世界长什么样”

账户余额、nonce、合约代码哈希与各自存储根的整体承诺。

TRANSACTIONS ROOT

“这个区块带了哪些交易”

交易列表/索引映射的承诺,不等于交易执行后的状态。

RECEIPTS ROOT

“每笔交易执行出了什么收据”

状态、累计 Gas、日志等收据数据的承诺,供验证与日志查询使用。

BEACON STATE ROOT

“共识状态是什么”

SSZ 对 BeaconState 等共识对象的 hash-tree-root,不是执行层 world stateRoot。

截至 2026-07-26 的协议状态

以太坊主网执行状态仍使用 MPT。EIP-7864 的 unified binary tree 仍是 Draft,2026 协议重点也把 “迁移到二叉树与无状态化”列为长期工作;不要把提案、原型或路线图写成已经激活的主网事实。 [10][11]

05 / ETH_GETPROOF

让不受信任的节点交出可验证证据

eth_getProof 返回账户与可选存储槽的值及 MPT 路径节点;真正的信任锚仍是你选定区块的 stateRoot。

Ethereum Execution APIs 定义了 eth_getProof(address, storageKeys, block)。 你可以传入地址、要核对的 32 字节存储键列表,以及区块号、区块哈希或 latest / safe / finalized 等标签。[6]

Request · schematic

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_getProof",
  "params": [
    "0xAbC…123",
    ["0x000…007"],
    "finalized"
  ]
}

Response · important fields

accountProof[]
从 stateRoot 沿地址路径到账户的 RLP 节点。
balance / nonce
账户对象中可直接阅读的字段。
codeHash
账户代码的 Keccak 承诺;EOA 通常对应空代码哈希。
storageHash
该账户 storage trie 的根,也常称 storageRoot。
storageProof[]
每个请求存储键的值与证明节点。

离线验证的顺序

先固定区块与可信 stateRoot

不要只记录“finalized”这个会移动的标签;验证存档时应保存实际 block hash / number 与该区块头的 stateRoot。

blockHash → executionHeader.stateRoot
这不是“调用 RPC 就完成验证”

RPC 响应只是原材料。若应用直接相信返回的 balance 而不解析证明、重建 MPT 节点并与可信 stateRoot 比较,它仍然只是在相信 RPC 服务商。EIP-1186 是历史提案;实现时应优先核对当前 Ethereum Execution APIs 与所用客户端行为。[6][8]

Merkle Proof 在应用层还做什么?

ALLOWLIST

白名单与空投

链下保存大量地址/额度,只把根写入合约;领取者提交自己的叶子与证明,合约按 O(log n) 验证。

LIGHT CLIENT

轻量验证

设备不保存全部状态,只追踪经过共识认证的根,再向任意服务端索取目标数据与路径。

ROLLUP / BRIDGE

跨层状态读取

把一个系统的根锚定到另一个系统后,可用证明认证消息、提现或状态;安全性还依赖桥与最终性规则。

OFFCHAIN DATA

低成本完整性

大文件留在链下,仅在链上保存根;之后能证明某个片段属于原承诺,但根不保证文件仍可下载。

06 / ADVANCED

从会验证,走到会设计证明系统

真正棘手的地方往往不在哈希函数,而在结构、编码、长度、缺失值与升级兼容。

六个必须继续追问的问题

  • 奇数个叶子如何处理?

    复制末叶、补零或提升孤儿节点都会产生不同根。SSZ 用类型驱动的零值补齐;其他协议可能采用不同约定。

  • 长度是否进入承诺?

    可变长度列表仅补零可能让不同长度映射到同一填充形状,因此 SSZ 会把列表长度 mix in 到根。

  • 如何证明不存在?

    需要有序邻居、完整键空间或 trie 路径语义。一个只承诺无序集合的普通树不能凭空证明某键缺失。

  • 如何批量证明?

    合并重叠路径形成 multiproof;验证器还必须知道目标位置集合与辅助节点的规范顺序。

  • 是否需要数据可用性?

    根让你检测错误数据,却不能逼迫任何人交出数据。Rollup 等系统必须另外解决数据发布与可获得问题。

  • 规则升级如何版本化?

    哈希函数、编码或树形变更都会改变根。证明格式必须绑定版本,不能拿旧规则验证新结构。

普通 Merkle Tree、Sparse Merkle Tree、Trie 有何差别?

普通树常按数组位置组织叶子;Sparse Merkle Tree 把巨大固定键空间的每个可能位置都概念化为叶子, 大量空节点由预计算默认哈希代表;Trie 则按键的字符、nibble 或 bit 逐段寻路。 三者都能使用 Merkle 哈希认证结构,但“如何定位数据”完全不同。

Patricia 优化会压缩只有单一分支的长路径;以太坊 MPT 再加入十六叉分支、RLP 与短节点内联等规则。 因此本课的 log₂(n) 二叉证明图不能当作 MPT 的线级实现图。

为什么未来状态树又在讨论二叉结构?

EIP-7864 提议把账户头、代码与存储放入统一二叉树,并面向常规 Merkle Proof 与未来有效性证明优化。 它指出当前 MPT 的十六叉结构、RLP、tree-of-trees 与代码未入树等特征不利于证明系统; 二叉分支能减少单层需要携带的兄弟摘要。[10]

路线图不是既成事实

EIP-7864 当前是 Draft,提案中的最终哈希函数也尚未确定。2026 协议优先级把二叉树与无状态化放在长期方向。 学习时应掌握“根与证明”的不变量,同时把具体树格式视为可升级的协议层。

07 / REVIEW

把整课压回八句话

01

根是承诺,不是压缩包

固定长度根绑定整份有序数据,却不能恢复原始数据。

02

协议规则决定根

编码、哈希、顺序、树形、补齐与域分离缺一不可。

03

单点变化沿祖先传播

未改变子树可继续由旧摘要代表,更新不必重算全部节点。

04

证明提供缺失兄弟

验证者用值、位置、兄弟哈希与可信根重建路径。

05

二叉单证明约 O(log n)

每上升一层,覆盖叶子数翻倍;证明每层只补一个兄弟。

06

可信根比证明更先

假根也能配假数据生成自洽证明;先认证根的来源。

07

完整性不等于真实性或可用性

证明值属于根,不证明现实陈述正确,也不保证全部数据可下载。

08

以太坊分层使用不同树

执行层当前是 MPT;共识层使用 SSZ 二叉 Merkleization。

六题自测

1. Merkle root 最准确的描述是什么?

请选择一个答案。

2. 四个叶子内容相同但顺序不同,根会怎样?

请选择一个答案。

3. 一棵有 2²⁰ 个叶子的平衡二叉树,单叶证明约需多少个兄弟摘要?

请选择一个答案。

4. 一份 Merkle proof 能重建服务端给出的根,为什么仍不能立刻相信余额?

请选择一个答案。

5. 截至 2026 年 7 月,以太坊两层的数据承诺哪项正确?

请选择一个答案。

6. 验证某合约存储槽,正确的根链是什么?

请选择一个答案。

三步练习

  1. 01

    手画四叶树,任选一个叶子,写出验证者需要的两个兄弟摘要及左右拼接顺序。

  2. 02

    打开区块浏览器的某个执行区块,分别找到 state root、transactions root 与 receipts root,并用一句话说明三者对象。

  3. 03

    在测试环境调用 eth_getProof,保存实际 block hash,不只保存会移动的 latest 标签;尝试用 MPT 库离线验账户证明。

08 / GLOSSARY & SOURCES

术语与一手资料

本课核对日期为 2026-07-26。路线图与 Draft EIP 会变化;当前主网事实应以已激活规范为准。

核心术语

Merkle Tree
叶子与内部节点通过哈希递归认证、最终归约为根承诺的数据结构家族。
Merkle root
整份数据及其规范结构的固定长度根承诺。
Merkle proof
目标值重建到根所需的兄弟节点、方向/位置与相关元数据。
Leaf
树的底层数据承诺;可为固定长度块或对编码数据的哈希。
Internal node
由一个或多个子节点按规则计算而成的中间承诺。
Domain separation
用不同前缀或域标识区分叶子、内部节点等结构角色。
Membership proof
证明某个值位于被根承诺的数据结构中的证明。
Non-membership proof
证明某个键或值不在承诺结构中的证明,需要结构支持缺失语义。
Multiproof
共享多条路径的公共节点,以更少辅助哈希同时认证多个目标。
MPT
Modified Merkle-Patricia Trie;当前以太坊执行状态使用的认证键值结构。
stateRoot
执行完区块后世界状态的根承诺,位于执行区块头/执行载荷头语境中。
storageRoot
单个账户存储 trie 的根,作为账户对象字段被世界状态树继续承诺。
SSZ
共识层 Simple Serialize;类型驱动序列化并支持二叉 Merkleization。
Generalized index
SSZ 二叉 Merkle 树的稳定节点编号;根为 1,节点 k 的子节点为 2k、2k+1。
Data availability
参与者能否获得重建、验证或执行所需数据;承诺完整性不能单独保证它。
UBT
Unified Binary Tree;EIP-7864 提议的未来执行状态树,当前仍为 Draft。

官方与标准原文

  1. ethereum.org · Merkle Patricia Trie 当前执行状态 MPT 的总体定位、节点类型、路径压缩、RLP 与哈希引用。
  2. ethereum.org · Ethereum Virtual Machine 世界状态作为 modified Merkle Patricia trie,以及合约 storage trie 与账户的关系。
  3. ethereum.org · Blocks 执行载荷头中的 state_root、receipts_root、transactions_root 与节点重执行验证。
  4. Ethereum Execution Specs · Blocks 当前执行规范中的区块字段与 stateRoot、transactionsRoot、receiptsRoot 承诺。
  5. Ethereum Consensus Specs · Merkle proof formats generalized index、单证明与 multiproof 辅助索引的规范算法。
  6. Ethereum Execution APIs · eth_getProof 账户地址、storage keys、block 参数与 Merkle proof RPC 的当前接口定义。
  7. ethereum.org · Simple Serialize (SSZ) 32 字节 chunks、零值补齐、hash-tree-root、generalized indices 与证明直觉。
  8. EIP-1186 · RPC-Method to get Merkle Proofs eth_getProof 的历史动机、账户/存储证明字段与不存在证明讨论;状态为 Stagnant,应结合当前 API 规范阅读。
  9. ethereum.org · Merkle proofs for offline data integrity 链下数据完整性、链上保存根与合约验证证明的应用层教程。
  10. EIP-7864 · Ethereum state using a unified binary tree Draft 提案:统一二叉状态树、证明大小与 ZK 友好性的动机;哈希函数尚未最终确定。
  11. Ethereum Foundation · Protocol Priorities Update for 2026 把二叉树与无状态化列为长期状态扩展方向,短期重点仍含重定价与历史过期。
  12. Ethereum Yellow Paper · Appendix D 执行层 modified Merkle Patricia tree 的形式化基础;阅读时需结合后续 EIP 与当前执行规范。

11.02 · Complete

验证的本质,不是相信对方给出的值,而是让值自己走回你已信任的根。

现在你已经能从数据算根、从证明验根,也能分清完整性、共识、真实性与数据可用性的边界。 下一课将打开以太坊执行层的真实状态结构:看 Patricia Trie 如何把键路径、十六叉分支、 路径压缩与 Merkle 认证组合成 State Trie、Storage Trie、Transaction Trie。