每次发布交易的时候,区块里面的交易会组织成一棵交易树,也是一棵Merkle Tree
每个交易执行完会生成一个收据,记录交易的相关信息,交易树与收据树上面的节点是一一对应的。
增加收据树主要是因为以太坊的智能合约比较复杂,便于我们快速查找
从数据结构上讲,交易树和收据树都是MPT
交易树和收据树只把当前区块里的交易包含进去,状态数要把所有账户的状态包含进去
交易树和收据树有什么用呢?
-
提供Merkle Proof
-
所有与某个智能合约有关的交易,所有众筹事件。需要高效的查询效率,怎么办呢?
-
引入了bloom filter数据结构
-
bloom filter:A Bloom filter is a data structure designed to tell you, rapidly and memory-efficiently, whether an element is present in a set. The price paid for this efficiency is that a Bloom filter is a probabilistic data structure: it tells us that the element either definitely is not in the set or may be in the set.
-
生成一个简单的digest,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难(或者说不支持删除操作)。可能会出现哈希碰撞
-
每个交易完成之后会生成一个收据,这个收据里面就包含了bloom filter,记录这个交易的类型,地址等其他信息,发布的块头里面也有一个Bloom filter,是交易里所有bloom filter的一个并集。
-
所以先去查找块头里面的信息,之后再去交易收据树里面的bloom filter进行查询,也可能都没有flase positive,好处是可以快速过滤掉大部分信息。
-
以太坊的运行过程可以看作是一个交易驱动的状态机。transcation driven state machine
状态树可不可以只存储与本次交易有关的账户状态的信息,这样会缩减很大的空间?
-
想要查找某个账户的状态就不方便了,比如A->B的交易,可能不包含A的交易,那么就可能需要一直往回找,从后往前扫描很多个区块
-
如果B是新账户,那么就需要一直往回找直到创世区块
代码:
- 创建交易树
- 创建收据树
- 创建叔区块
- DeriveSha函数
- trie的结构:MPT
- recript的结构
bloom filter就是根据logs产生出来的
- CreateBloom、LogsBloom、bloom9的代码实现