简单的数据结构
trie结构
trie结构特点:
- 1、每个节点的分支数目却决于这个key值里每个元素 取值范围。图例中最多26个英文字母分叉+一个结束标志位。
- 2、trie查找效率取决于key的长度。键值越长,查找需要访问内存的次数就越多。实际应用中(以太坊地址长度为160byte,表示成40个16进制的数)。
- 3、理论上哈希会出现碰撞,而trie上面不会发生碰撞,因为trie结构中,只要地址不一样,最后肯定会映射到两个不同的分支。
- 4、给定输入,无论如何顺序插入,构造的trie结构树都是一样的。而Merkle tree中给定顺序不同,所产生的树结构也不同。
- 5、更新操作局部性很好,要更新给定地址的value,只需要访问那一条分支上的结构就可以,而不用去访问其它分支,也不用遍历整颗树。
那么trie有缺点吗?
-
trie的存储浪费。很多节点只存储一个key,但其“儿子”只有一个,过于浪费。因此,为了解决这一问题,我们引入Patricia tree(Partricia trie)
Patricia tree的好处: -
直观上看树的高度变矮了,这样访问内存的次数大大减少,效率也就提高了。
注意:Patricia tree中,如果你先插入一个单词,原来压缩的路径可能需要扩展开来。
那么什么时候用Patricia tree效果比较好呢?
通过上面两张图比较可以知道,当键值分布比较稀疏的时候,用这个压缩Patricia tree压缩比较好。
以太坊中地址是160位的,所以以太坊的地址空间就有 2 160 2^{160} 2160,这是一个非常非常大的数,以太坊中的数目也远远没有 2 160 2^{160} 2160那么大,全世界的以太坊账户数目加起来对其来说也是微乎其微。为什么地址空间要弄这么大呢?这是为了防止地址碰撞。虽然有碰撞的概率,但地址空间足够大,使得地址碰撞的概率微乎其微,比地球爆炸的概率还要小。这样看上去有点浪费,但这是去中心化系统中防止账户冲突的唯一办法。
MPT(Merkle Patricia tree)
Merkle tree与binary tree的区别:
区块链与链表的区别就是把普通指针换成了哈希指针,Merkle tree也是这样,把普通指针换成了哈希指针。
根哈希值的用处:
- 防止篡改。只要根哈希值不变,整个树的任何部分都没有办法被篡改。
- 提供Merkle proof,可以证明账户余额,轻节点可以进行验证。账户所在的分支做一个Merkle proof发给轻节点,轻节点就可以验证一下账户上有多少钱。
- 证明某个发生了交易的账户是否存在
MPT(Modified Patricia tree)
以太坊中针对MPT(Merkle Patricia tree)进行了修改,我们称其为MPT(Modified Patricia tree)
每次发布新区块,状态树中部分节点状态会改变。但改变并非在原地修改,而是新建一些分支,保留原本状态。如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。
这个账户是一个合约账户,合约账户的存储也是用MPT保存下来的,以太坊中的结构是一个大的MPT包含很多小的MPT,每一个合约账户的的存储都是一棵小的MPT。
所以系统中的全节点维护不是一棵MPT,而是每次出现一个区块,就要新建一个MPT,只不过这些状态树中大部分节点是共享的,只有少数发生变化的节点要新建分支。
为什么以太坊中不在原节点上直接修改,要保留历史状态?
为了支持回滚。
以太坊中出现临时性的分叉是很普遍的,因为出块时间只有十几秒。当出现分叉的时候,一个节点胜出,另一个节点就需要取消掉当前的区块节点的状态,退回到上一个区块的状态, 然后再沿着胜出的链往下推进。也就是说有时候要把当前状态退回到没有处理到这个区块中交易的前一个状态。怎么才能实现回滚操作呢,就通过保留的历史状态。这与比特币不太一样,比特币操作比较简单, 如果要回滚,可以通过反向操作推算出前一个状态。
因为以太坊中有智能合约,它的编程功能是很强的,理论上来说可以实现很复杂的功能。如果不保存以前的状态,在执行完智能合约之后,再想推算出之前的状态,是不可能的。
数据结构
1、block header中的数据结构
2、区块中的结构
3、真正发布时候的结构
状态树中保存的是(Key,value)对,key就是地址,而value状态通过RLP(Recursive Length Prefix,一种进行序列化的方法)编码序列号之后再进行存储。
RLP的理念是越简单越好,支持者一种类型——nested array of bytes 字符数组。
参考资料:https://www.bilibili.com/video/BV1Vt411X7JF?p=16
https://blog.csdn.net/Mu_Xiaoye/article/details/104503645