比特币--Bloom过滤器

使用场景

背景

如果一个SPV向对等节点精确请求查询某个地址的交易,则会无意的暴露自己的地址,如果以某个关键词查询,虽然会得到较多无关结果,但有着更高的私密性。

作用

Bloom过滤器被用来过滤SPV节点从对等节点里收到的交易信息。

过程

  1. SPV节点会构建一个只会与本地钱包地址列表匹配的Bloom过滤器。
  2. SPV节点会向对等节点发送一条包含需在该连接中使用的过滤器的filterload消息。
  3. 当过滤器建好之后,SPV节点会以getData消息向对等节点请求需要的数据。
  4. 对等节点会对交易信息代入过滤器验证,对等节点会发送一条只含有和过滤器匹配的区块的区块头信息,以及与之相匹配的交易的merkle树,另外还有一条相匹配的交易的tx消息。
  5. SPV节点可以通过发送filteradd消息来向它的Bloom过滤器添加关键词,通过发送filterclear消息来清除整个过滤器,因为不能删除关键词,所以要删除某个关键词,只能通过清除后再添加。

应用原理

Bloom过滤器的实现由一个二进制数组和若干哈希函数组成,设数组长度为N,哈希函数个数为M 对关键词经哈希函数后输出值始终在1和N之间。

1.初始化

如下采用了3个哈希函数和16位二进制数组来演示Bloom过滤器原理:
image

2.添加关键词A

Bloom过滤器数组里每一个数的初始化值为零。关键词被加到Bloom过滤器中之前,会依次被每个哈希函数运算一次,得到一个1-N之间的数,然后它在数组中1-N所对应的位置的值置为1,以此类推。当全部哈希函数都运算过后,相应个数组位从0变为1,同时这个关键词也被记录在Bloom过滤器里了。如下:

image

3.添加关键词B

增加第二个关键是就是简单地重复之前的步骤。关键词依次通过各哈希函数运算之后,相应的位变为1,Bloom过滤器则记录下该关键词。需要注意的是,当Bloom过滤器里的关键词增加时,它对应的某个哈希函数的输出值的位可能已经是1了,这种情况下,该位不会再次改变。也就是说,随着更多的关键词指向了重复的位,Bloom过滤器随着位1的增加而饱和,准确性也因此降低了。如下:

image

该过滤器之所以是基于概率的数据结构,就是因为关键词的增加会导致准确性的降低。准确性取决于关键字的数量以及数组大小(N)和哈希函数的多少(M)。更大的数组和更多的哈希函数会记录更多的关键词以提高准确性。而小的数组及有限的哈希函数只能记录有限的关键词从而降低准确性。

4.测试关键词存在

为测试某一关键词是否被记录在某个Bloom过滤器中,我们将该关键词逐一代入各哈希函数中运算,并将所得的结果与原数组进行对比。如果所有的结果对应的位都变为了1,则表示这个关键词有可能已被该过滤器记录。之所以这一结论并不确定,是因为这些字节1也有可能是其他关键词运算的重叠结果。简单来说,Bloom过滤器正匹配代表着“可能是”。

image

5.测试关键词不存在

如果我们代入关键词计算后的结果某位为0,说明该关键词并没有被记录在过滤器里。负匹配的结果不是可能,而是一定。也就是说,负匹配代表着“一定不是”。

image

总结

Bloom过滤器是一个允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜素关键词的同时保护它们的隐私。在SPV节点里,这一方法被用来向对等节点发送交易信息查询请求,同时交易地址不会被暴露。

Bloom过滤器可以让SPV节点指定交易的搜索模式,该搜索模式可以基于准确性或私密性的考虑被调节。一个非常具体的Bloom过滤器会生成更准确的结果,但也会显示该用户钱包里的使用的地址;反之,如果过滤器只包含简单的关键词,更多相应的交易会被搜索出来,在包含若干无关交易的同时有着更高的私密性。

首先,SPV节点会初始化一个不会匹配任何关键词的“空白”Bloom过滤器。接下来,SPV节点会创建一个包含钱包中所有地址信息的列表,并创建一个与每个地址相对应的交易输出相匹配的搜索模式。通常,这种搜索模式是一个向公钥付款的哈希脚本、,该脚本是一个会出现在每一个向公钥哈希地址付款的交易中的锁定脚本。如果SPV节点需要追踪P2SH地址余额,搜索模式就会变成P2SH脚本。然后,SPV节点会把每一个搜索模式添加至Bloom过滤器里,这样只要关键词出现在交易中就能够被过滤器识别出来。最后,对等节点会用收到的Bloom过滤器来匹配传送至SPV节点的交易。

Bloom过滤器的实现是由一个可变长度(N)的二进制数组(N位二进制数构成一个位域)和数量可变(M)的一组哈希函数组成。。这些哈希函数的输出值始终在1和N之间,该数值与二进制数组相对应。并且该函数为确定性函数,也就是说任何一个使用相同Bloom过滤器的节点通过该函数都能对特定输入得到同一个的结果。Bloom过滤器的准确性和私密性能通过改变长度(N)和哈希函数的数量(M)来调节。

BIP0037里已经对Bloom过滤器的实现有所描述。具体访问GitHub