Merkle Patricia Tree简称MPT树,提供了一个基于加密学的,自校验防篡改的数据结构,采用[key,value]键值对来储存数据,在以太坊范围内,限定键值的类型只能是字符串。MPT树插入、删除、查找操作的时间复杂度均为O(log(n)),但相对于红黑树来说,MPT更好理解和编码。
MPT树结合了基数树(Radix Tree)、Merkle Tree、Patricia Tree的优点。Radix Tree的结构如下:
[i0, i1, ..., iN, value],i0到iN要么指向一个节点,要么是NULL,value存储一个值,这是MPT树用来索引值的最基本结构。Patricia Tree解决了Radix Tree的低效和空间浪费问题。Merkle Tree解决了数据校验及防篡改问题。
加密性
为了保证树的加密安全,每个节点通过hash被引用key == sha3(rlp(value)),而非32bit或64bit的内存地址,即树的Merkle部分是一个节点的确定性加密的hash。一个非叶节点存储在leveldb关系型数据库中,数据库中的key是节点的RLP编码的sha3哈希,value是节点的RLP编码。
如果一个树根的hash值是公开的,那么所有人都可以通过计算每一步的值来证明这棵树在特定的路径上具有给定的值。攻击者不可能提供一个不存在的键值对,任何修改都会改变根节点的值。
高效
传统的Merkle树的效率低且空间占用大,MPT树对这些缺点进行了优化。MPT树插入、删除、查找操作的时间复杂度均为O(log(n))。
4种节点类型
标准叶子节点 Leaf Node