交易树和收据树
交易树和收据树
发布区块的时候,区块包含的交易会形成一个交易树。
每个交易执行完成后,会形成一个收据,记录交易的信息。
数据结构:MPT
交易树和收据树的MPT中,key就是交易在区块中的序号。交易的排列顺序是交易的节点决定的。
与状态树的区别:
- 交易树和收据树只需要将当前区块的交易组织起来。它们不在节点之间共享。
- 状态树要把系统中所有的状态包含进来。
交易树和收据树的作用:
- 提供merkle proof;
- 复杂的查找操作:找到以太坊中最近10天跟某个智能合约的交易。或者所有的众筹事件。
bloom filter
为了支持复杂的查询,以太坊中引入了bloom filter这样的数据结构。
bloom filter的特点:
- 元素不在集合中时的判断一定是准确的;
- 元素在集合中的判断可能产生误报;
- 无法支持删除元素;
- 内存开销小
以太坊中的bloom filter的作用:
每个交易完成后会形成一个收据,收据包含一个Bloom filter,记录这个交易的类型、地址等信息。
发布的区块block header中也包含一个总的Bloom filter,其为该区块中所有交易的Bloom filter的一个并集。
比如要查找过去十天跟这个智能合约相关的所有交易。
先查block header中的bloom filter是否有这个交易的类型,如果存在就再查看这个区块包含的交易中所对应的收据树的bloom filter,如果存在,再查看交易进行确认;不存在则说明不在这个block。
Bloom filter这样一个结构,能够快速过滤掉大量的无关区块,提高查找效率。
transaction-driven state machine
以太坊的运行过程可以看作一个transaction-driven state machine. 交易的执行会驱动账户的状态转移。
比特币也可以看作一个transaction-driven state machine,比特币中的状态就是UTXO
。
他们的状态转移都是确定性的。
Q & A
收款账户是否有可能不在状态树中
有可能。
只有在产生交易的时候才会被记录到状态树中。
状态树能否只记录当前区块的交易账户状态
不能。原因在于A 转账 B 时,
- 查找A、B的账户状态不方便,需要往前找到匹配的区块。
- 如果B是新建的账户,需要一直找到创世区块才知道该账户为新账户。