1. 引言
Merkle Patricia Trie的代码实现可参看:
Merkle Patricia Trie (MPT)= Merkle Tree + Patricia Trie。
MPT是一种经过改良的、融合了Merkle Tree和Patricia Trie两种树结构优点的数据结构。
以太坊中使用MPT存储所有账户状态,以及每个区块中的交易和收据数据。是一种典型的以空间换时间的数据结构。
2. Merkle树
Merkle tree背景知识可参看:(为hash树)
3. Patricia Trie树
Trie树(字典树 或 前缀树),又名单词查找树,是哈希树的变种。
Trie树的典型应用有:
- 用于统计、排序和保存大量的字符串(但不局限于字符串)。
- 常被搜索引擎系统用于文本词频统计。
Trie树的优点为:
- 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
Trie树有3个基本性质:
- 1)根节点不包含字符,除根节点外每个节点都只包含一个字符。
- 2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 3)每个节点的所有子节点包含的字符都不相同。
Patricia算法 源于Morrison 1968年论文《PATRICIA—Practical Algorithm To Retrieve Information Coded in Alphanumeric》。
前缀树节点在树中的位置是由其键的内容所决定的,即前缀树的key值被编码在根节点到该节点的路径中。【即前缀树中并不存储每个节点实际的key值,而是用节点在树中的位置来定义key。具体可参看 直观Radix Trie(PATRICIA trie) 展示。】
其中flows为key对应的value值存储在上图前缀树中最下层最右侧叶子节点中。
前缀树的主要优势有:
相比于哈希表,使用前缀树来查询拥有共同前缀key的数据时十分高效。如在字典中查找前缀为pre的单词,对于哈希表来说,需要遍历整个表,时间效率为O(n);然而对于前缀树来说,只需要在树中找到前缀为pre的节点,且遍历以这个节点为根节点的子树即可。
但是对于最差的情况(前缀为空串),时间效率为O(n),仍然需要遍历整棵树,此时效率与哈希表相同。
相比于哈希表,在前缀树不会存在哈希冲突的问题。
前缀树的主要劣势为:
- 直接查找效率低下
前缀树的查找效率是O(m),m为所查找节点的key长度,而哈希表的查找效率为O(1)。且一次查找会有m次IO开销,相比于直接查找,无论是速率、还是对磁盘的压力都比较大。 - 可能会造成空间浪费
当存在一个节点,其key值内容很长(如一串很长的字符串),当树中没有与他相同前缀的分支时,为了存储该节点,需要创建许多非叶子节点来构建根节点到该节点间的路径,造成了存储空间的浪费。如下图所示:
4. MPT树
尽管前缀树可以起到维护key-value数据的目的,但是其具有十分明显的局限性。无论是查询操作,还是对数据的增删改,不仅效率低下,且存储空间浪费严重。故,在以太坊中,为MPT树新增了几种不同类型的树节点,以尽量压缩整体的树高、降低操作的复杂度。
以太坊MPT树中,每个节点最多有16个子节点。【与前缀树相同,MPT同样是把key-value数据项的key编码在树的路径中,但是key的每一个字节值的范围太大([0-127]),因此在以太坊中,在进行树操作之前,首先会进行一个key编码的转换(下节会详述),将一个字节的高低四位内容分拆成两个字节存储。通过编码转换,key’的每一位的值范围都在[0, 15]内。因此,一个分支节点的孩子至多只有16个。以太坊通过这种方式,减小了每个分支节点的容量,但是在一定程度上增加了树高。】
MPT树中节点分为:
- 空节点:用来表示空串。
- 分支节点:分支节点用来表示MPT树中所有拥有超过1个孩子节点以上的非叶子节点。
- 叶子节点:为an endpoint,将包含transaction value。
- 扩展节点:当有多于16个子节点时,需引入扩展节点。
MPT树的root hash为所有交易的hash值。上图MPT树中,一共包含4笔交易,其key值分别为a711355, a77d337, a7f9365, a77397,对应的交易金额分别为45.0ETH,1.00WEI, 1.1ETH, 0.12ETH。
参考资料
[1] Implementing Merkle Tree and Patricia Trie
[2] Ethereum Merkle Patricia Trie Explained
[3] How To Completely Audit Our Financial Infrastructure In An Instance: Meet The Merkle Patricia Tree
[4] 以太坊黄皮书
[5] 字典树
[6] Merkle Patricia Trie详解