赞
踩
在以太坊中,交易树(Transaction Trie)和收据树(Receipts Trie)是两个重要的数据结构,用于存储交易和相应的执行结果。它们都是基于 Merkle Trie 实现的,提供了高效的存储和验证机制。
交易树是以太坊中存储交易信息的数据结构,每个区块包含了一组交易,这些交易会被存储在交易树中。交易树的根节点的哈希值被包含在区块头中,从而保证了交易的完整性和不可篡改性。
交易树的结构类似于 Merkle 树,它由多个节点组成,每个节点包含了对应的交易信息的哈希值。通过对所有交易信息进行哈希计算,并按照一定规则构建树结构,最终形成了一个树状的数据结构。这样,只需存储根节点的哈希值,就可以验证整个交易列表的完整性。
收据树是以太坊中存储交易执行结果的数据结构,每个交易在执行后会产生一个收据(Receipt),其中包含了执行状态、日志和消耗的 Gas 等信息。这些收据会被存储在收据树中,而收据树的根节点的哈希值也被包含在区块头中。
收据树的结构与交易树类似,也是一个基于 Merkle 树的数据结构,每个节点包含了对应的收据信息的哈希值。通过对所有收据信息进行哈希计算,并按照一定规则构建树结构,最终形成了一个树状的数据结构。这样,只需存储收据树的根节点的哈希值,就可以验证整个收据列表的完整性。
交易树和收据树是以太坊区块链中重要的数据结构,它们通过 Merkle 树的形式,提供了对交易和执行结果的高效存储和验证机制。这些数据结构的设计使得以太坊区块链可以实现高效的交易处理和状态验证,同时确保了交易和执行结果的完整性和安全性。
提供 Merkle Proof(默克尔证明):交易树和收据树作为 Merkle 树的一种应用,在以太坊中提供了 Merkle Proof 的功能。Merkle Proof 是一种证明某个特定数据块(如交易或收据)在 Merkle 树中的有效性的方法。通过在树中上升过程中提供的哈希路径,可以证明某个数据块确实存在于树中,并且没有被篡改。这种功能对于验证交易和执行结果的完整性至关重要。
支持更复杂的查询操作:在以太坊中,有时需要执行一些复杂的查询操作,比如查询过去某段时间内与某个智能合约相关的交易。为了支持这种查询操作,引入了布隆过滤器(Bloom Filter)数据结构。布隆过滤器是一种空间效率高且可以快速判断一个元素是否存在于集合中的数据结构。它通过利用多个哈希函数和位数组来表示集合,可以在不存储实际元素的情况下快速进行查询。在以太坊中,布隆过滤器被用来存储一段时间内与某个智能合约相关的交易信息的摘要。当执行查询操作时,可以使用布隆过滤器快速判断某个交易是否可能与该智能合约相关,然后再进一步验证这些交易的详细信息,从而实现了更复杂的查询功能。
综合来说,交易树和收据树提供了基本的数据存储和验证功能,而布隆过滤器则通过在查询操作中提供高效的数据过滤和预处理,支持了更复杂的查询需求,从而提升了以太坊的查询性能和灵活性。
布隆过滤器在以太坊中的具体应用:
每一个交易执行完之后,会形成一个收据,收据中包括一个bloom fiter,记录交易的类型,地址等其他信息。
发布的区块在块头中,如果有一个总的bloom filter,这个总的bloom filter是该区块中所有交易的bloom filter的并集
当我们需要查找过去10天发生的某智能合约相关的所有交易,方法如下:
step1:找哪个区块的块头中的bloom filter有我们需要交易的类型,如果块头中没有,说明这个区块不是我们想要的(并集)
step2:如果哪一个块头有就去查找这个区块的各个收据的bloom filter。
1.某人在ETH中发布了一个交易,某节点收到这个tx.tx:A->B,有没有可能B的地址在以太坊区块链中从来没有过?
有可能,因为创建账户不需要广播,只有收到转账的才被广播。
2.现行状态树的机制包含全部的账户状态,可不可以改成仅仅包含区块链中tx账户的状态?
不可以,原因1:查找账户的状态不方便,得往前面的区块找,如A->B的交易,要验证A的全部如果A很长一段时间没有交易,那么就需要往前找很长
(在比特币(BTC)中,每个交易都会消耗之前交易的输出,并且每个输出只能被消耗一次。这种设计称为Unspent Transaction Output (UTXO) 模型,即未花费交易输出模型。
在UTXO模型下,每个未花费的交易输出都对应着一个特定的地址和金额,而不是像以太坊那样记录每个账户的余额。这样的设计使得在查找某个账户的余额时更为方便,因为只需要扫描和计算未花费交易输出的总额即可,而不需要追溯整个交易历史。
当然,在比特币中也存在一些类似的问题,例如如果某个地址很长一段时间没有进行交易,那么查询其余额可能需要扫描很长时间的交易历史。但相比于以太坊的账户状态树,比特币的UTXO模型在这方面更为简洁和高效,因为它不需要维护和更新每个账户的余额,而只需要追踪未花费交易输出即可。)
原因2:
更严重的问题是:A-->B(10ETH),还要找B的账户状态(因为要往上加10ETH)如果B是新建的账户,就会一直找到创世块(genisis block),发现创世块都没有B,才能确认 B是新建立的账户。十分不合理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。