跳转到正文
buybitcoinsmart

术语表 /节点与软件

布隆过滤器

又称 BIP37。

布隆过滤器是什么?
布隆过滤器是一种紧凑的概率型集合,BIP37 轻钱包会将其发送给全节点,使该节点只转发可能属于这些钱包的交易。

规定于 BIP-37。

该设计以带宽换取其作者所期望的隐私,而隐私从未实现。多年研究表明这些过滤器泄露的信息有多少,于是 Bitcoin Core 在2019年11月发布的0.19.0版本中不再默认提供这些过滤器。仍依赖布隆过滤器的钱包,等于把一份可用的、记录您所持有币的清单交给了陌生人的机器。

运作方式

状态:BIP37 布隆过滤在2019年11月发布的 Bitcoin Core 0.19.0中被默认关闭,BIP157 和 BIP158 紧凑区块过滤器接替了轻钱包的这一工作。

布隆过滤器是一个位数组加上若干哈希函数。插入一个元素时,用多种方式对其哈希,将每个结果对数组长度取模,并把这些位置为1。检验一个元素时,用同样的方式哈希并查看这些位。只要其中有一位为0,该元素就一定从未被插入;如果全部为1,则该元素可能被插入过,也可能是其他插入恰好置位了相同的位。不会出现假阴性,但会出现假阳性,其比率是可调的参数。

BIP37 确定了具体算法。过滤器上限为36,000字节和50个哈希函数,哈希采用32位 Murmur 函数的第3版,种子为哈希序号乘以0xFBA4C795 再加上客户端自选的调整值(tweak)。有三条消息驱动它:filterload 在连接上安装过滤器,filteradd 扩充过滤器,filterclear 清除过滤器。过滤器设定后,对等节点用 merkleblock 响应区块请求,其中包含80字节的区块头、匹配的交易,以及证明这些交易属于该区块的默克尔分支。BIP111 后来增加了 NODE_BLOOM 服务位,使节点可以声明自己是否愿意配合。

隐私方面的说法完全建立在这一假阳性率上。放宽过滤器,让他人的交易与您自己的交易一并命中,观察者据称就无法分辨哪些是哪些。这并不成立。2014年发表的学术研究表明,包含现实数量地址的过滤器会泄露其中大部分地址,而且同一钱包加载的两个过滤器可以取交集,从而剥去这层伪装。换一个新的对等节点并使用新过滤器重新连接,会让问题更严重,而不是缓解。

另一个缺陷更容易说明。提供过滤器意味着按陌生人的指令从磁盘扫描区块,因此任何对等节点都能让使用机械硬盘的节点做巨量无报酬的工作。0.19.0的发布说明首先提到的是这一拒绝服务的理由,而不是隐私研究。

在哪里会遇到它

布隆过滤器主要还存在于2019年之前编写的软件中,以及为弥补其缺失而设置的配置文件中。

基于 bitcoinj 库构建的 Android 钱包以 BIP37 作为唯一的链后端,其中一些仍安装在设备上。Bisq 也需要它,因此其文档过去会指示用户在自己节点的配置中添加 peerbloomfilters=1。这一行就是明显的标志:当某个软件要求您在自己运行的节点上重新启用布隆过滤时,它所要求的是参考客户端出于充分理由已经关闭的技术。

现代的替代方案方向相反。在 BIP157 和 BIP158 下,节点为每个区块构建一个过滤器并向所有人发布,钱包在自己的硬件上进行匹配,因此关于您地址的任何信息都不会离开设备。

布隆过滤器 vs SPV

布隆过滤器是一种传递机制,而简化支付验证是一种信任模型,把两者混为一谈会让人以为该模型随这一机制一同消亡。SPV 是指检查某笔交易位于工作量最大的链上某个区块头的默克尔根之下,而不验证该链的其余内容。这一推理没有改变。改变的是轻钱包如何找到值得检查的交易:过去它广播一份有损的自身地址概要,并寄希望于其能奏效,现在则下载每个区块的过滤器并在本地检验。

请勿混淆

常见问题

比特币钱包还在使用布隆过滤器吗?

很少,您应避免使用。Bitcoin Core 在2019年11月发布的0.19.0版本中不再默认提供 BIP37 过滤器,轻钱包现在使用 BIP157 和 BIP158 紧凑区块过滤器,这些过滤器将您的地址列表保留在您自己的设备上。

布隆过滤器能隐藏我的钱包正在监视哪些地址吗?

不能。2014年发表的研究表明,包含现实数量地址的过滤器会泄露其中大部分地址,而且同一钱包的两个过滤器可以取交集,从而完全消除假阳性带来的伪装。

接着阅读

相关术语

节点与软件中的更多术语

阅读本页英文版