Skip to content

区块链存储模型

本文档深入分析区块链的数据存储模型,涵盖 Ethereum 的 MPT、Cosmos 的 IAVL、以及 Verkle Trie 等前沿存储结构。


一、数据分类

类型数据描述
无状态数据(输入数据)Block区块数据
Transaction交易数据
状态数据(输出数据)Account如 ETH 的账户
Contract Storage如 ETH 中合约状态
Tx Receipt如 ETH 中的 event
UTXO如 BTC 中 Unspent TX Output

无状态数据存储

简单的 KV 存储:

  • Block 的 KV:hash → Blockheight → hash
  • Transaction 的 KV:txhash → Transaction

大部分区块链使用 KV 数据库:LevelDB、RocksDB、Berkeley DB 等。


二、状态数据存储模型

区块链本质上是一个状态机,状态数据是最核心的数据。主要分两类:

模型代表
KV 存储Bitcoin 的 UTXO
MerkleTree + KV 存储Ethereum(Account, Contract Storage)、Cosmos(Account)

为什么采用 MerkleTree + KV?

优势说明
共识状态数据Merkle Root 放入 Block Header,保证共识一致性
状态数据可验证支持 Merkle Proof,证明某个状态数据存在
易于回滚分叉后直接切换到对应高度的树
历史数据查询从对应高度的树查询

补充知识点

Merkle Tree

  • 节点值 = hash(所有子节点值之和)
  • Tree Root 相当于树的指纹
  • 可验证某个节点值是否存在

Compact Trie(压缩字典树)

  • 每个节点表示一或多个字符
  • 显著减少存储空间
  • 提高查询和遍历效率

三、Ethereum 状态数据存储(MPT)

3.1 三棵树

存储内容Root 位置
Account Tree账户数据Block Header(state root)
Storage Tree合约存储数据账户中(storage root)
Receipt Tree交易执行结果Block Header(receipt root)

3.2 MPT 树(Merkle Patricia Trie)

本质是 Merkle Tree + Compact Trie

  • Key 是 hex 编码,每个节点最多 16 个分支(16 叉树)
  • Account Tree 的 key = hash(address)
  • Storage Tree 的 key = hash(storage key)

3.3 持久化

  • 将 MPT 每个节点序列化,key 为序列化数据的 hash,value 为序列化数据,存入 KV DB
  • 所有高度的树节点都存到 DB 中,但相同部分不重复存储
  • 查询某一高度的状态:获取该高度 header 中的 stateroot → 从 DB 获取根节点 → 按 key 查询叶子节点

Patricia 树通过减少查找路径的长度来提高数据查找效率。


四、Cosmos 状态数据存储(IAVL)

4.1 IAVL 树

全称 Immutable AVL+ Tree,本质是 Merkle Tree + AVL 平衡二叉树

4.2 IAVL vs MPT 对比

特性IAVLMPT
树结构二叉树16 叉树
深度较高较低
磁盘 IO较多较少
更新耗时需要平衡操作,较高较低
读写一致性多次读/写耗时相同取决于路径
确定性相同数据不同插入顺序,树结构不同相同数据结构相同

4.3 关键问题

由于 IAVL 是平衡二叉树,相同数据不同写入顺序会导致不同的 root hash。这意味着:交易并行执行时打乱顺序,可能导致 stateRoot 不一致

4.4 为什么 Cosmos 选择 IAVL 而非 MPT?

Cosmos 生态侧重轻量级和模块化设计,IAVL 与其 Tendermint 共识更好集成,且多次读写时间消耗一致。


五、Verkle Trie

5.1 背景

当前 MPT 中验证一个账户的 witness(Merkle Proof)约 3KB,最坏可达 10KB。假设每块 6000 个账户更新,无状态客户端需下载约 18MB 数据。

Verkle Trie 可将 witness 降低至约 200B,大幅减少数据量。

5.2 核心特性

  • 使用向量承诺(Pedersen 承诺 + IPA)替代传统哈希
  • 树结构类似 MPT,但证明更紧凑

5.3 节点特性

节点类型说明
InnerNode中间节点,最多 256 个子节点
LeafNode叶子节点,存储 256 个 32 字节值
  • 字典压缩树,每个节点代表一或多个字符
  • Key 为 32 字节:前 31 字节为树的路径,最后 1 字节为 LeafNode 中值的位置
  • 最大深度 31,最大宽度 256

5.4 Verkle 对以太坊的影响

影响说明
✅ 状态数据可在 P2P 网络传递无状态客户端成为可能
✅ 节点同步速度更快witness 数据大幅减小
✅ 运行节点硬件要求降低可能在手机上运行
❌ 不直接提高 TPS主要改善状态验证
❌ 不直接降低 L2 成本L2 batch 不存储在 Verkle Tree 中

总结

graph TB
    subgraph "存储模型演进"
        A["KV 存储<br/>Bitcoin UTXO"] --> B["MPT + KV<br/>Ethereum"]
        B --> C["IAVL + KV<br/>Cosmos"]
        B --> D["Verkle Trie<br/>Ethereum 未来"]
    end

    subgraph "核心权衡"
        E["树宽度 ↑"] --> F["IO 次数 ↓"]
        G["树深度 ↑"] --> H["IO 次数 ↑"]
        I["确定性"] --> J["并行执行兼容性"]
    end

区块链存储模型的核心是在查询效率、存储空间、共识一致性之间寻找平衡。MPT 适合以太坊的账户模型,IAVL 适合 Cosmos 的模块化架构,Verkle Trie 则是面向无状态客户端的未来方向。