布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)是一个概率搜索过滤器,采用一种不精确指定的方式来描述期望的匹配模式。布隆过滤器提供了一种在保护隐私的前提下表达搜索模式的有效途径。SPV节点使用这种方式向其对等节点请求匹配特定模式的交易列表,而不用暴露它们搜索的确切地址。

在我们之前类比的例子中,一个没有地图的游客询问到特定地点“教堂街23号(23 Church St.)”的路线。如果他向一个陌生人询问到该街道的路线,无意间就暴露了他的目的地。如果使用布隆过滤器,他可能问的就是“这附近是否有条街道,它的名字以R-C-H结尾?”这种提问方式,暴露的信息就要比直接说“教堂街23号”要少一些。通过这项技术,游客可以使用较详细的信息,如“以U-R-C-H结尾”来描述地址,也可以使用如“以H”结尾这样更简短的信息。通过改变搜索的精确度,游客可得到更多或更少的信息,相应的代价就是获取更精确或更模糊的结果。如果提供模糊的信息,他可以更好地保护隐私,但将得到非常多的地址,而大多数地址都是不相干的。如果提供相对精确的信息,得到的地址则较少,但在保护隐私上也会较弱。

布隆过滤器允许SPV节点通过调节搜索条件的精确度来提供这项服务。更明确的布隆过滤器将产生更精确的结果,但是代价是暴露用户钱包中使用的地址。粗略的布隆过滤器则因匹配更多的交易而带来更大的数据量,这些交易大多与本节点无关,但是可以为节点提供更好的隐私保护。

SPV节点初始化时把布隆过滤器设置为“空”,在此状态下,布隆过滤器不匹配任何模式。接着,SPV节点生成一个钱包中所有地址的列表,并创建一个匹配所有地址的交易输出的搜索条件。通常,每个搜索条件就是“发送到公钥哈希”的脚本,这个脚本实际上就是出现在每个发送到公钥哈希(地址)的交易输出上的锁定脚本。如果SPV节点正在跟踪一个P2SH地址的余额,那么搜索条件就是“支付到脚本哈希”的脚本。接下来,SPV节点将这些条件添加到布隆过滤器中,使过滤器能够在符合搜索条件的情况下识别出交易。最后,把布隆过滤器发送给对等节点,对等节点依据设定条件将匹配的交易传到本地SPV节点。

布隆过滤器在实现过程中由一个包含N比特位(N位域)的可变长度数组和M个哈希函数构成。哈希函数设置成输出总是在1到N之间,与二进制数组长度对应。哈希函数是确定的,因此,任何实现布隆过滤器的节点都使用相同的哈希函数,并且在输入确定的情况下,将得到相同的结果。通过选择不同长度(N)的布隆过滤器,选用不同数量(M)的哈希函数,布隆过滤器可以调整精确程度和隐私保护级别。

在图6.8中,我们使用一个很小的16位数组,以及一个包含3个哈希函数的集合,演示布隆过滤器的工作过程。

布隆过滤器(Bloom Filter)

图6.8 简单布隆过滤器的例子,使用16位域和3个哈希函数

上一篇:C++海量数据处理(二):布隆过滤器(Bloom Filter)详解


下一篇:Bloom Filter