状态树
要设计一种什么数据结构呢?要完成账户地址到账户状态的映射。
以太坊的账户地址是160位的,也就是20个字节,一般表示成40个16进制的数。
状态时指外部账户和合约账户的balance、nonce等。
MPT
了解MPT之前,先了解下trie。
trie: 字典树。假设有如下几个单词:General,Genesis,Go,God,Good,使用 trie 这种数据结构产生的树如下:
trie的特点
- 优点
- 由于以太坊的地址是40个16进制的数组成,所以头节点有0~f加上结束标志位总共17个
- 因为地址都是40个16进制的数,所以纵向的长度是40。
- 两个地址映射到哈希表中,可能会出现哈希碰撞,但trie中,两个不同的地址必定映射到两个不同的路径。
- 给定一组输入,不论什么顺序,最后构造出的数都是一样的。
- 更新操作时,局部性很好,只需访问输入地址所映射的节点即可
- 缺点
- 中间节点(如E、N、E)存储浪费
如何解决 trie 中的缺点呢?这里用到了 Patricia tree(压缩前缀树)。上面的例子进行路径压缩后,得到的数据结构如下: