布隆过滤器是一种数据结构,可用于通知用户特定项目是否是集合的一部分。虽然它不能肯定地说某个元素是否在集合中,但它可以肯定地说该元素是否不在集合中。
布隆过滤器由 Burton Howard Bloom 于 1970 年创建,对于一系列应用来说是一个有吸引力的产品。应用程序由于其空间利用效率。在某些加密货币(尤其是比特币)中,它们在简化支付验证(SPV)中发挥着不可或缺的作用。
在使用 SPV 客户端时,用户无需运行完整节点即可与比特币网络进行交互。全节点具有一定的存储和计算要求,这使得它们难以在智能手机等低功耗设备上运行。另一方面,SPV 客户端只需查询全节点以获取与用户钱包相关的信息。
将此数据转发给用户的最直接的解决方案是让全节点了解客户端的密钥,以便仅将相关事务发送给他们。显然,这是一个较差的解决方案,因为会牺牲客户的隐私。另一方面,下载所有交易却丢弃其中的大部分会浪费带宽。输入布隆过滤器。
让我们举例说明。假设客户 Alice 有一笔高价值交易,她不希望运行完整节点的 Bob 知道。她构造了一个布隆过滤器,我们将其表示为 10x1 网格:
她通过两个不同的哈希函数传递她感兴趣的交易数据,这两个函数输出 0 到 9 之间的两个数字。我们称它们为 4 和 7。她将过滤器发送给 Bob。
看着这个网格,你不知道 Alice 传递给过滤器的数据是什么。如果您有一个包含数据的集合,您将能够对其进行散列并将其与过滤器进行比较 -如果存在匹配,则有可能是 Alice 请求的信息。
同时,可能有许多输入将映射到 4 和 7,因此Bob 无法确定 Alice 对数据的哪一部分感兴趣。他只是返回所有匹配项,然后 Alice 在她的一端对它们进行过滤。
当然,这过于简单化了,但它演示了这样一个概念:布隆过滤器混淆了客户端的真正利益。这不是一个完美的方法(仍然存在对其隐私的担忧),但它是对对节点的未屏蔽请求的改进。