news 2026/5/15 7:57:51

16.ETH-状态树-北大肖臻老师客堂笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
16.ETH-状态树-北大肖臻老师客堂笔记

北京大学肖臻老师《区块链技术与应用》公开课第 15 讲的主题是**“以太坊的状态树” (The State Tree)**。

这一讲深入到了以太坊的底层数据结构,解释了以太坊是如何在区块头中存储“全网状态”的。这节课是理解以太坊“世界计算机”本质的关键,因为它解决了**“如何高效存储和验证海量账户状态”**的难题。

以下是本课内容的结构化详细总结

一、 核心问题:如何存储状态?

在上一讲中我们知道,以太坊采用账户模型 (Account-based),系统需要维护一个巨大的映射(Mapping):

Addr State (Balance, Nonce, CodeHash, StorageRoot)

我们需要一种数据结构来存储这个映射,并满足以下苛刻要求:

  1. 高效查找与更新:状态随着每个区块都在变化,必须能快速修改。
  2. Merkle Proof 支持:轻节点需要能验证某个账户的余额,而不需要下载全网状态。
  3. 持久化与历史溯源:需要能回滚到任意一个历史区块的状态。

二、 方案演进推导 (Evolution of Data Structures)

肖老师按照“提出方案 -> 发现问题 -> 改进方案”的逻辑进行了推导:

1. 哈希表 (Hash Table)
  • 思路:直接用哈希表存状态。
  • 缺陷:虽然查找快,但在构建 Merkle Proof 时非常困难。如果把所有账户哈希成一个根,每次修改一个账户都要重新计算整个哈希树,效率极低。
2. 直观的 Merkle Tree
  • 思路:将所有账户数据排序后,构建一个标准的 Merkle Tree。
  • 缺陷
  • 插入代价大:如果有新账户创建,插入到数组中间会导致后面的数据全部移动,整棵树大部分都要重构。
  • 非确定性:如果没有严格排序,包含相同数据的树可能有不同的 Root Hash。
3. Trie (前缀树/字典树)
  • 思路:使用账户地址(Address)作为路径,一位一位地向下查找。

  • 优点

  • 局部更新:修改一个账户,只影响该分支的哈希值,不影响其他分支。

  • 有序性:无论插入顺序如何,只要数据集合相同,构建出的 Trie 结构是唯一的(Determinism)。

  • 缺陷

  • 效率低:以太坊地址是 160 位(40 个 16 进制字符),会导致树的高度非常高(40 层)。

  • 稀疏:绝大多数路径是空的,浪费存储空间。

4. Patricia Trie (压缩前缀树)
  • 改进:如果某个节点只有一条路径(比如 “app” 下面只有 “apple”),就将路径压缩合并。
  • 效果:降低了树的高度,提高了效率。

三、 终极方案:Merkle Patricia Trie (MPT)

以太坊最终采用的是MPT,结合了 Merkle Tree 的加密验证功能和 Patricia Trie 的路径压缩功能。

1. 三种节点类型

为了实现压缩和分支,MPT 设计了三种特殊的节点结构:

  • Leaf Node (叶子节点)

  • 表示路径的终点。

  • 包含:[剩余路径, 账户值]

  • Extension Node (扩展节点)

  • 用于路径压缩(就像高速公路)。

  • 包含:[共享路径, 下一个节点的哈希]

  • Branch Node (分支节点)

  • 用于分岔(就像十字路口)。

  • 包含:[0-F (16个分支), Value]。因为以太坊使用 16 进制,所以每个节点最多有 16 个孩子。

2. 状态存储逻辑
  • Key:账户地址的哈希值(Sha3(Address))。为什么不直接用 Address?为了防止黑客构造特定地址让树变得极度不平衡(DoS 攻击)。
  • Value:账户状态的 RLP 编码(Balance, Nonce…)。
  • 数据库:虽然逻辑上是一棵树,但物理上这些节点都是以Key-Value对的形式存储在 LevelDB 中的。

四、 状态树的特性 (Properties)

1. 根哈希 (Root Hash)

每个区块头里包含一个Root字段。这个 Root 是当前时刻全网所有账户状态构建出的 MPT 的根哈希。

  • 防篡改:只要状态有一丝变化,Root 就会彻底改变。
  • 轻节点验证:轻节点只存 Block Header,可以通过向全节点请求 Merkle path 来验证某个账户的余额。
2. 状态共享 (Data Sharing)
  • 问题:每个区块都生成一个新的 MPT,数据量会不会爆炸?
  • 机制不会。因为大部分账户在两个相邻区块之间是不发生变化的。
  • 新区块的 MPT 只是新建了那些“发生变化”的节点分支,未变化的部分直接指向前一个区块的旧节点。这使得以太坊的状态历史像一个“增量文件系统”。

五、 代码树与存储树 (Code & Storage Trie)

除了全局的状态树 (State Trie),每个账户内部还有两个重要的属性:

  • CodeHash:如果账户是合约,代码本身是只读的。代码被存储在数据库中,账户里只存代码的哈希。
  • StorageRoot:如果合约里有变量(比如mapping (address => uint) balance),这些变量会构成另一棵 MPT,称为存储树 (Storage Trie)。这个树的根哈希保存在账户状态里。

🧠 核心逻辑图解 (MPT 结构)

为了让你直观理解 MPT 如何运作,请看下图:

MPT优势

路径前缀: A

路径前缀: 3

路径: 1

路径: 5

Block Header: State Root

Branch Node: 分岔口

Extension Node: 共享路径 BC

Leaf Node: 终点

Branch Node: 分岔口

Leaf Node: 账户 A

Leaf Node: 账户 B

逻辑上有序

密码学安全

路径压缩高效

💡 总结

第 15 讲的核心在于理解MPT (Merkle Patricia Trie)
它是以太坊的“脊梁”,完美平衡了效率(查找快)、安全(可验证)和存储成本(数据共享)。所有的交易执行、状态变更,最终都体现为这就这棵巨大的 MPT 树上的节点更新。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 23:46:07

开箱即用的人脸分析工具:InsightFace WebUI 使用测评

开箱即用的人脸分析工具:InsightFace WebUI 使用测评 1. 为什么你需要一个真正“开箱即用”的人脸分析工具? 你是否遇到过这样的场景: 想快速验证一张照片里有多少人、各自大概多大年纪、是男是女,却要先配环境、装CUDA、下载模…

作者头像 李华
网站建设 2026/5/7 23:46:06

图片旋转判断模型企业部署指南:Docker Compose编排+API服务化

图片旋转判断模型企业部署指南:Docker Compose编排API服务化 1. 这个模型到底能帮你解决什么问题? 你有没有遇到过这样的场景:用户上传了一堆商品图、证件照或扫描件,结果有的横着、有的倒着、有的歪了15度——人工一张张手动旋…

作者头像 李华
网站建设 2026/5/7 6:48:56

音乐分类新体验:ccmusic-database/music_genre Web应用快速上手

音乐分类新体验:ccmusic-database/music_genre Web应用快速上手 你有没有过这样的困惑:听到一首歌,旋律很熟悉,节奏很带感,但就是说不准它属于什么流派?是爵士还是放克?是电子还是拉丁&#xff…

作者头像 李华
网站建设 2026/5/4 9:24:34

粤嵌GEC6818开发板实现触摸交互式电子相册

1. 初识GEC6818开发板与电子相册项目 第一次拿到粤嵌GEC6818开发板时,我就被它丰富的接口和强大的功能吸引了。这块开发板搭载了ARM Cortex-A53四核处理器,运行频率高达1.5GHz,配备800480分辨率的电容触摸屏,特别适合用来开发图形…

作者头像 李华
网站建设 2026/5/4 9:23:49

Clawdbot参数详解:Qwen3:32B模型配置项、contextWindow与maxTokens实战说明

Clawdbot参数详解:Qwen3:32B模型配置项、contextWindow与maxTokens实战说明 1. Clawdbot是什么:一个面向开发者的AI代理网关平台 Clawdbot不是传统意义上的聊天机器人,而是一个专为开发者设计的AI代理网关与管理平台。它不直接生成内容&…

作者头像 李华