附A:以太坊区块链技术解析-bloom filter

bloom filter的作用是检查一个元素是否在一个集合里。比如'abc'这个字符串是否在已知的一个字典里,比较典型的应用场景就是word的单词拼写检查,还有诸如网络爬虫的网址是否访问过、或者对于邮件服务提供商的垃圾邮件发送者记录。

拿垃圾邮件发送者举例来说,发送者的地址是经常不断换新的,如果要把它们全部保存起来,即使使用哈希表占用的空间也非常大。具体来说,每存储一个email地址,都有一个对应的8字节的信息指纹,而哈希表的存储效率一般只有50%,也就是说一个email地址占用了16个字节。一亿个地址就会占用16亿个字节,即1.6GB。而如果有上百亿个垃圾邮件地址,就会需要几百GB的空间去存储。

Bloom Filter解决的问题就是这个。它使用哈希表1/4到1/8的空间,解决同样的问题。

本质上,bloom filter就是一个很长的二进制向量和一系列随机映射函数(需要p个hash产生器F,之后还需要一个能将hash函数均匀映射到二进制向量上的随机数产生器G)。


附A:以太坊区块链技术解析-bloom filter_第1张图片

假定我们存储一亿个电子邮件地址,我们先建立一个十六亿bit,即两亿字节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址X,我们用八个不同的随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。再用一个随机数产生器G 把这八个信息指纹映射到 1 到十六亿中的八个自然数g1, g2, …,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个email 地址都进行这样的处理后。一个针对这些email 地址的布隆过滤器就建成了。

[if !vml]

[endif]

现在我们用相同的八个随机数产生器(F1, F2, …, F8)对这个地址产生八个信息指纹s1,s2,…,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位(通过G),分别是t1,t2,…,t8。如果Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。但是,如果某一个地址,恰巧映射在二进制地址上的值已经被其他地址置为1,它就会被误判为垃圾邮件发送者。当n/m越大(n是元素数目,m是bloom filter的bit数),误判概率越高。


布隆过滤器的好处在于快速,省空间。但是有一定的误识别率。常见的补救办法是在建立一个小的白名单,存储那些可能被误判的邮件地址。(存疑!如何判断可能被误判的邮件地址?)


那bloom filter在区块链中的应用是什么呢?

由于SPV节点需要读取特定交易从而选择性地验证交易,这样就又产生了隐私风险。与全区块链节点收集每一个区块内的全部交易所不同的是,SPV节点对特定数据的请求可能无意中透露了钱包里的地址信息。例如,监控网络的第三方可以跟踪某个SPV节点上的钱包所请求的全部交易信息,并且利用这些交易信息把比特币地址和钱包的用户关联起来,从而损害了用户的隐私。

Bloom过滤器,用以解决SPV节点的隐私风险问题。Bloom过滤器通过一个采用概率而不是固定模式的过滤机制,允许SPV节点只接收交易信息的子集,同时不会精确泄露哪些是它们感兴趣的地址。


在比特币中,bloom filter与spv息息相关。在SPV节点里,这一方法被用来向对等节点发送交易信息查询请求,同时交易地址不会被暴露。


Bloom过滤器被用来过滤SPV节点从对等节点里收到的交易信息。SPV会建立一个只能和SPV节点钱包里的地址匹配的过滤器。随后,SPV节点会向对等节点发送一条包含需在该连接中使用的过滤器的filterload消息。当过滤器建好之后,对等节点将每个交易的输出值代入过滤器中验证。那些匹配的交易会被传送回SPV节点。

为回应来自SPV节点的getdata信息,对等节点会发出一条只含有和过滤器匹配的区块的区块头信息,以及与之相匹配的交易的merkle树。这一对等节点还会发出一条相匹配的交易的tx消息。

这个节点能够通过发送一条filteradd信息来向它的Bloom过滤器增加关键词,也能够发送filterclear信息来清除整个过滤器。因为不能直接从过滤器里删除关键词,所以如果某关键词不再需要,节点必须通过清除和增加来替换原有的过滤器。


http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html

此地址文章有详细数学介绍

你可能感兴趣的:(附A:以太坊区块链技术解析-bloom filter)