etherum & trie

以太坊源码分析(一)Merkle Patricia Tries

Posted by minicool on February 1, 2018

包trie 实现了MPT(Merkle Patricia Tries)数据结构,这种数据结构实际上是一种Trie树变种。MPT是以太坊中一种非常重要的数据结构,用来存储用户账户的状态及其变更、交易信息、交易的收据信息。MPT实际上是三种数据结构的组合,分别是Trie树, Patricia Trie, 和Merkle树。下面分别介绍这三种数据结构。

Trie Tree

Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。

Trie树可以利用字符串的公共前缀来节约存储空间。如下图所示,该trie树用10个节点保存了6个字符串:tea,ten,to,in,inn,int:

image01

在该trie树中,字符串in,inn和int的公共前缀是“in”,因此可以只存储一份“in”以节省空间。当然,如果系统中存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存,这也是trie树的一个缺点。

Trie树的基本性质可以归纳为:

根节点不包含字符,除根节点以外每个节点只包含一个字符。 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符串不相同。

Patricia Trie

前缀树跟Trie树的不同之处在于Trie树给每一个字符串分配一个节点,这样将使那些很长但又没有公共节点的字符串的Trie树退化成数组。在以太坊里面会由黑客构造很多这种节点造成拒绝服务攻击。前缀树的不同之处在于如果节点公共前缀,那么就使用公共前缀,否则就把剩下的所有节点插入同一个节点。Patricia相对Tire的优化正如下图:

image02

image02-1

上图存储的8个Key Value对,可以看到前缀树的特点。

Key value 6c0a5c71ec20bq3w 5 6c0a5c71ec20CX7j 27 6c0a5c71781a1FXq 18 6c0a5c71781a9Dog 64 6c0a8f743b95zUfe 30 6c0a8f743b95jx5R 2 6c0a8f740d16y03G 43 6c0a8f740d16vcc1 48

Merkle Tree

Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。

image03

Merkle Tree的主要作用是当我拿到Top Hash的时候,这个hash值代表了整颗树的信息摘要,当树里面任何一个数据发生了变动,都会导致Top Hash的值发生变化。 而Top Hash的值是会存储到区块链的区块头里面去的, 区块头是必须经过工作量证明。 这也就是只要拿到一个区块头,就可以对整个区块链信息进行验证。

etherum MPT

每个区块链头都包含三个MPT树。包含交易树,收据树,状态树。