跳转到正文
buybitcoinsmart

术语表 /节点与软件

紧凑区块过滤器

紧凑区块过滤器是什么?
紧凑区块过滤器是对区块创建和花费的输出脚本所做的小型 Golomb 编码摘要,由全节点发布,使轻钱包无需透露自己持有什么就能检测区块。

规定于 BIP-158。

一个过滤器对应一个区块,其中列出的是输出脚本,而不是地址、金额或交易 ID。BIP-158将基本类型固定为0x00,P 为19,M 为784,931,因此不在区块中的元素仍会约每784,931次测试匹配一次。由于匹配在您的设备上进行,提供过滤器的节点永远不会知道哪些币属于您。

运作方式

紧凑区块过滤器的构建方式是:将区块创建和花费的输出脚本哈希到同一个数值范围内,对结果排序,只记录相邻数值之间的差值。

条目列表由规范固定,因此两个诚实节点为同一区块生成的过滤器逐字节完全相同。对每笔交易,过滤器取每个输入所花费的上一笔输出的脚本(跳过 coinbase 交易),以及每个输出的 scriptPubKey。有一类输出被有意排除在外:以 OP_RETURN 开头的输出。BIP-158将其排除,以便日后可以把过滤器承诺放进 coinbase 的 OP_RETURN 输出中,就像见证承诺已有的做法那样,而承诺不必涵盖其自身。

哈希使用 SipHash,c 设为2,d 设为4,密钥取区块哈希(标准小端字节序)的前16个字节。该密钥随每个区块而变,因此同一个脚本在每个区块中落在不同的位置,没有人能构建出对整条链通用的查找表。随后,每个64位的输出通过乘法和移位(而不是除法)映射到零至 N 乘以 M 的范围内。

压缩正是名称所指的部分:排序后的数值被替换为相邻差值,每个差值转换为一元编码的商加上19位余数,即 Golomb-Rice 编码。输出不会小于 N 乘以20位,并且前面附有以 CompactSize 表示的条目数 N;没有任何元素的区块过滤器存储为单个全零字节。愿意提供这些过滤器的节点会通告服务位 NODE_COMPACT_FILTERS,其定义为1左移6位。

在哪里会遇到它

紧凑区块过滤器是一些钱包选用的同步方式,这类钱包宁可消耗带宽,也不愿把地址列表交给别人的服务器。

Wasabi Wallet 是本站评测中的例子:仅限桌面端,仅支持比特币,默认所有连接都通过 Tor,并依靠过滤器同步,因此没有服务器知道哪些地址属于您。本站给它的评分为3.6,并标注为需谨慎,原因与同步无关。Electrum 评分为4.4,走的是另一条路:它通过 SPV 向任何人都可以运行的索引服务器验证,该服务器最终会掌握您所拥有的地址列表。

依赖过滤器之前,有两点限制值得了解。过滤器以脚本为键,因此无法在其中查找交易 ID:只有 txid 时,仍然需要节点或区块浏览器。此外,OP_RETURN 输出按设计就不在其中,因此监测数据承载输出的软件完全无法基于这一机制构建。

紧凑区块过滤器 vs 紧凑区块中继

紧凑区块过滤器告诉钱包某个区块是否值得下载;紧凑区块中继(在 BIP152 中规定)则压缩两个全节点之间正在传输的区块。

两者面向的对象不同。过滤器按区块生成,具有确定性,以区块哈希的前16个字节为键,由自身不保存任何区块链的客户端拉取。中继则把区块中的大部分交易替换为48位标识符,其密钥来自区块头与发送方选定的随机数一并哈希的结果;如果接收方的内存池中本来就没有这些交易,中继对其毫无节省。一个让手机免于下载不需要的区块,另一个让节点免于重复接收交易。两者的相似之处仅止于都带有“紧凑”一词。

请勿混淆

常见问题

紧凑区块过滤器会让别人知道我的钱包在监测哪些地址吗?

不会。过滤器由节点根据区块自身内容构建,并向所有人发布,因此关于您钱包的任何信息都不会离开您的设备。为您提供匹配区块的对等节点确实会知道您请求了该特定区块,但这一信号远比地址列表弱得多。

为什么我的钱包有时会下载与我无关的区块?

因为过滤器是概率性的。您测试的元素即使不在区块中,也仍会约每784,931次测试匹配一次,因此监测大量脚本的钱包会遇到少量误报,下载这些区块后却发现里面没有属于自己的内容。

我可以在紧凑区块过滤器中查找交易 ID 吗?

不能。BIP-158基础过滤器仅包含输出脚本:每个输出的 scriptPubKey(OP_RETURN 输出除外),以及每个非 coinbase 输入所花费的前一输出脚本。其中不含交易 ID,因此您仍然需要节点或区块浏览器。

接着阅读

相关术语

节点与软件中的更多术语

阅读本页英文版