作者:Annchain
(本文一切著作权归annchain技术团队所有,未经许可,不得转载。若需转载请联系页尾二维码。)
在以太坊中,所有和账户相关的状态信息都是通过 StateDB 来存储和获取的。StateDB 作为表层和其他逻辑模块交互,在 StateDB 之后使用 Merkle Patricia Trie (MPT) 结构来构建编码后的 state 关系,用于快速索引以及回滚等操作。MPT 中的所有节点最后都会以 key - value 的形式存入磁盘数据库。
这篇文章将重点介绍 StateDB 和 Trie 在以太坊中的实现以及两者在账户状态存储流程中所扮演的角色。
Merkle Patricia Trie
MPT 是结合了 Merkle Tree 和 Patricia Tree 的特点后创建的树形数据结构。其包含了如下的一些特点:
-
能存储任意长度的键值对数据。
-
支持 Merkle Proof,用于节点的快速校验。
-
能快速的查询 key 所对应的 value 数据。
在以太坊中,MPT被定义为四种不同类型的节点:fullNode, shortNode, valueNode, hashNode
:
type ( fullNode struct { Children [17]node // Actual trie node data to encode/decode (needs custom encoder) flags nodeFlag } shortNode struct { Key []byte Val node flags nodeFlag } hashNode []byte valueNode []byte)
valueNode 存储具体的 value 数据,它的 key 是从 root 到此节点的路径上所有 key 的总和。
hashNode 存储一个数据库中其他节点的哈希用作索引。
shortNode 是 MPT 的枝干节点之一。"Key" 字段存储当前 shortNode 之后所有 node 共同的一段前缀 key。"Val" 字段存储一个后续的节点。如果从根节点到当前节点所组成的 key 前缀已经键值对结构中的"键"完全吻合,且没有其它符合此前缀的键值对存在,则后续节点为一个 valueNode。如果满足此前缀 key 的键值对组合多于一个,则后续存储一个 fullNode。
fullNode 是 MPT 的枝干节点之一。和 shortNode 不同的是,full