8.10 SPV节点如何使用Bloom过滤器

Bloom过滤器用于过滤SPV节点从其对等体接收的交易(和包含它们的块),仅选择SPV节点感兴趣的交易,而不会泄露其感兴趣的地址或密钥。

SPV节点将初始化“过滤器”为“空”;在该状态下,bloom过滤器将不匹配任何模式。然后,SPV节点将列出所有感兴趣的地址,密钥和散列,它将通过从其钱包控制的任何UTXO中提取公钥哈希和脚本哈希和交易ID来实现。 SPV节点然后将其中的每一个添加到Bloom过滤器,以便如果这些模式存在于交易中,则Bloom过滤器将“匹配”,而不会自动显示模式。

然后,SPV节点将向对等体发送一个过滤器加载消息,其中包含在连接上使用的bloom过滤器。在对等体上,针对每个传入交易检查Bloom过滤器。完整节点根据bloom过滤器检查交易的几个部分,寻找匹配,包括:

交易ID

每个交易输出的锁定脚本的数据组件(脚本中的每个键和哈希)

每个交易输入

每个输入签名数据组件(或见证脚本)

通过检查所有这些组件,可以使用Bloom过滤器来匹配公钥哈希,脚本,OP_RETURN值,签名中的公钥或智能合同或复杂脚本的任何未来组件。

在建立过滤器之后,对等体然后将针对bloom过滤器测试每个交易的输出。只有与过滤器匹配的交易才会发送到节点。

响应于来自节点的getdata消息,对等体将发送一个merkleblock消息,该消息仅包含与过滤器匹配的块和每个匹配交易的merkle路径(参见[merkle_trees])的块头。然后,对等体还将发送包含由过滤器匹配的交易的tx消息。

由于完整节点向SPV节点发送交易,SPV节点丢弃任何误报,并使用正确匹配的交易来更新其UTXO集和钱包余额。随着它更新自己的UTXO集视图,它还会修改bloom过滤器,以匹配任何引用其刚刚发现的UTXO的交易。然后,完整节点使用新的bloom过滤器来匹配新交易,并重复整个过程。

设置bloom过滤器的节点可以通过发送filteradd消息将模式交互式添加到过滤器。要清除bloom过滤器,节点可以发送一个过滤清除消息。因为不可能从布局过滤器中删除模式,所以如果不再需要模式,则节点必须清除并重新发送新的布隆过滤器。

BIP-37 (Peer Services)中定义了SPV节点的网络协议和布隆过滤机制。