# 《区块链技术与应用》10 ETH 状态树

By [Minna Yu](https://paragraph.com/@minna-yu) · 2022-06-18

---

**这个系列的内容是根据肖臻老师《区块链技术与应用》公开课的内容进行的内容整理，以及部分延伸的思考。文末附有公开课链接。**

**本文主要回答以下3个问题：**

1、以太坊状态树包含什么内容？

2、以太坊状态树的数据结构是怎么样的？有什么特征？

3、状态树中为什么要保留历史记录？

### 前述

以太坊的账户地址160位，20个字节（1个字节是8bits），40个16进制的数。

**账户内容包括（余额，交易次数），（代码，存储）**

比特币虽然没排序，但是顺序唯一，是由有记账权，发布节点的人决定的。

如果以太坊不排序，难以查找，难以保持一致性，顺序不一致的情况下，各地算出的哈希值可能不一样。

### MPT结构

Trie，retrieval树形结构

![](https://storage.googleapis.com/papyrus_images/23f15746638c881035c926769b775c3fb05ac79597de4c9838fccbb32c121c1f.png)

特点1：每个节点的分支数目，取决于key值的取值范围，英文字母26个，加一个结束位；

特点2：查找效率取决于key的范围，越广，查找效率越低

特点3：只要地址不一样，就不会出现碰撞

特点4：不论什么顺序插入，结构都一样

特点5：和更新有关，局部变化

缺点1：浪费存储

**Patricia tree/trie 压缩过的trie结构**

![](https://storage.googleapis.com/papyrus_images/a05d00125672fb2bef5ac3536efdda16bdc414a52420f6e5860dcb7796b640ea.png)

好处：树的长度缩短，占的内存变小

**键值分布比较稀疏的时候，压缩trie结构比较好**

### Merkle patricia tree

和普通的结构的区别是，里面的内容是哈希指针

用处1：可以防止篡改

用处2：可以查账户余额

用处3：可以证明non membership 所在的分支进行查询

### 以太坊是modified MPT结构

![](https://storage.googleapis.com/papyrus_images/40b159bd78f5f65e64fb50557474ff883ff30aae9dc58765df1a7140b633a430.png)

每个合约账户的存储都是一个小的MPT

**为什么数据中要保留历史记录？**

第一，为了audit

第二，临时性的分叉是常态，出现之后roll back，undo当前的交易，尤其是复杂的智能合约，必须保持历史状态才能回滚。

![](https://storage.googleapis.com/papyrus_images/d7365d9a923d40d92e0313e2a6d902fedced6d86c974271f2966147b08a84fdb.png)

*   parenthash前一个区块的块头的哈希值
    
*   unclehash
    
*   Root 状态树的根哈希值
    
*   txhash交易数的哈希值
    
*   receipthash收据数的哈希值
    

![](https://storage.googleapis.com/papyrus_images/8fa7a315dedfec86709adb0ae8e6f5353030b35959d29dc476b8d90dd57f2cfe.png)

可以有多个叔父区块，uncles 是个数组，叔父区块会在后面的内容详细说明。

**视频课程原文链接**

[https://www.bilibili.com/video/BV1Vt411X7JF?spm\_id\_from=333.337.search-card.all.click&vd\_source=6807dc8dcddb18fe6db9d949c12b670c](https://www.bilibili.com/video/BV1Vt411X7JF?spm_id_from=333.337.search-card.all.click&vd_source=6807dc8dcddb18fe6db9d949c12b670c)

---

*Originally published on [Minna Yu](https://paragraph.com/@minna-yu/10-eth)*
