Merkle:
- 快速比较大量数据:对每组数据排序后构建Merkle树结构。当两个Merkle树根相同时,两组数据也必然相同。否则,必然存在不同。由于Hash计算的过程可以十分迅速,预处理可以在短时间内完成。利用Merkle树结构能带来巨大的比较性能优势。
- 快速定位修改:如果一个节点的数据被修改,那么它的父节点,父节点的父节点直到根节点,会一路收到影响。因此,一旦发现根节点的数值发生变化,可以快速定位到实际发生改变的数据块。
- 零知识证明:如何向他人证明拥有的某组数据中包括给定的某个内容D0而不暴露其他任何内容?可以使用Merkle树,D0的拥有者通过验证生成的根节点的数值是否与提供的值一致,即可很容易检测提供者是否包含D0。而整个过程验证者无法获知其他内容。
Merkle证明:指一个轻节点向一个全节点发起一次证明请求,询问全节点完整的默克尔树中,是否存在一个指定的节点;全节点向轻节点返回一个默克尔证明路径,由轻节点进行计算,验证存在性。
Merkle证明过程:如有棵如下图所示的merkle树,如果某个轻节点想要验证9Dog:64这个树节点是否存在与默克尔树中,只需要向全节点发送该请求,全节点会返回一个1FXq:18, ec20,8f74的一个路径(默克尔路径,如图2黄色框所表示的)。得到路径之后,轻节点利用9Dog:64与1FXq:18求哈希,在与ec20求哈希,最后与8f74求哈希,得到的结果与本地维护的根哈希相比,是否相等。
布隆过滤器:
https://www.jianshu.com/p/a5289b828854
布隆过滤器的生成算法Bloom9: 首先将传入的任何数据,进行Keccak256的运算,得到一个32字节的hash 。其次,循环取此hash值的前6字节,注意循环步进是i+=2,意思是每两个字节合为一个uint, 并和2047进行位与运算。所以前6个字节生成了三个下标,共同表示此值是否在Bloom过滤器中。最后,将生成的三个下标值进行左位移和位或运算,将相应的下标值值为1,得到的这个bigInt就是传入参数的bloom过滤器的索引(index)值。
判断流程:1.先将传入的数据转成bloom9值cmp;2.将Bloom过滤器转为Big.Int然后和cmp进行位与运算;3.将位与后的值和cmp比较是否相等,如果相等表示存在。
https://www.cnblogs.com/zhizaixingzou/p/10122288.html
使用布隆过滤器可以大大加速事件的查询。
创建过程:以太坊会先创建各个主题(账户地址哈希)的布隆过滤器,然后合并得到事件的布隆过滤器,再合并得到交易的布隆过滤器,最后合并得到区块的布隆过滤器。
查询:满足指定特征的事件的过程则正好相反,即先根据查询条件得到布隆过滤器,如果其位向量是区块布隆过滤器的子向量,则认为可能在此区块有,如果不是则就能判断不是了,如果是有可能,则继续对比区块下各个交易的布隆过滤器,以此类推。最后如果匹配事件的布隆过滤器,则再进行严格的数据验证,验证相同则通过了。
日志:
https://www.cnblogs.com/zhizaixingzou/p/10122288.html
以太坊允许日志跟踪各种交易和信息,日志是用一种特殊的可索引的数据结构来存储的。solidity用日志特性来实现事件。创建合约之后就无法访问日志数据了,但是可以从区块链外高校地访问这些日志数据。
由于部分日志数据被存储在布隆过滤器中,因此可以高效并安全的搜索日志。所以那些没有下载整个区块链的网络节点(轻客户端)也可以找到这些日志。