比特币之Bloom过滤器

背景

比特币SPV节点因为不具有全链数据,所以无法对交易进行验证。必须要从核心客户端(具备全链数据的节点)下载特定的交易进行选择性验证。这样就产生了隐私风险。比如监控网络的第三方可以跟踪某个SPV节点上的钱包所请求的全部交易信息,并且利用这些交易信息可以把钱包用户和比特币地址关联起来,从而会导致失去匿名信。
鉴于此,比特币开发人员添加了新功能--Bloom过滤器,用以解决SPV隐私暴露风险问题。Bloom过滤器通过一个采样概率,运行SPV节点只接收交易信息的子集,同时不会精确泄露哪些是他们感兴趣的

Bloom过滤器

Bloom过滤器是一个允许用户描述特定关键词组合而不需要精确描述的基于概率的过滤方法。假如有个游客需要询问去某个特定地址的路线,如果他向陌生人问“联运街88号在哪里?”,这样他就会暴露自己的目的地。Bloom过滤器则会这样问:“附近有带联字的街道吗?”这样就暴露了很少的关键词。会得到更多的结果(包含自己需要的),保护了自己的隐私。

1. SPV节点会初始化一个不匹配任何关键词的空白Bloom过滤器。
2. SPV节点会创建一个包含钱包中所有地址信息的列表,并创建一个与每个地址相对应的交易输出相匹配的搜索模式。
3. SPV节点会将所有的搜索模式放入Bloom过滤器。这样只要关键词出现在交易中就可以被过滤器识别出来。
4. 对等节点用收到的Bloom过滤器来匹配传送至SPV节点的交易。

Bloom过滤器采用一个可变的二进制数组(N)和M个哈希函数组成。这些哈希函数的输出区间是[1, N],该值与二进制数组对应。且这些哈希函数必须为确定性函数(任何一个节点使用相同Bloom过滤器实现的哈希函数针对同样的输入最后输出的结果是一致的)。通过调节N和M来改变Bloom过滤器的准确性和私密性。
下面我们用一个16位的二进制数组和3个哈希函数来演示Bloom过滤器应用原理。

比特币之Bloom过滤器_第1张图片
初始化Bloom过滤器.png

Bloom过滤器数组中每个初始值都是0。
将关键词依次通过每个哈希函数(此例中是3个)运算,输出M个在1到N之间的数。二进制数组相应的位就置为1,这就意味着Bloom过滤器记录下了某个关键词

比特币之Bloom过滤器_第2张图片
输入关键词A.png

比特币之Bloom过滤器_第3张图片
输入关键词B.png

注意: 当Bloom过滤器增加关键词时,其中某个哈希函数的输出值对应的二进制数组值可能已经是1了,此时不改变二进制数组值。也就是说,随着更多的关键词指向某个二进制数组值,Bloom过滤器随着位1的增加而饱和,准确性就降低了。准确性依赖于关键字数量、二进制数组大小和哈希函数数量。更大的数组和更多的哈希函数会记录更多的关键词,会提高准确性;小的数组及有限的哈希函数只能记录有限的关键词从而降低准确性。
为了测试某个关键词能否通过Bloom过滤器验证,首先将关键词依次使用哈希函数运算,将运算完成的结果与二进制数组做比较。如果所有结果对应的位在二进制数组中都是1,那么这个关键词可能在Bloom过滤器中被记录了。如果所有结果对应的位有一位在二进制数组中为0,那么这个关键词肯定不在Bloom过滤器中被记录。
比特币之Bloom过滤器_第4张图片
可能是.png

比特币之Bloom过滤器_第5张图片
一定不是.png

参考

《精通比特币》6.8节

你可能感兴趣的:(比特币之Bloom过滤器)