术语表 /节点与软件
紧凑区块过滤器
- 紧凑区块过滤器是什么?
- 紧凑区块过滤器是对区块创建和花费的输出脚本所做的小型 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位标识符,其密钥来自区块头与发送方选定的随机数一并哈希的结果;如果接收方的内存池中本来就没有这些交易,中继对其毫无节省。一个让手机免于下载不需要的区块,另一个让节点免于重复接收交易。两者的相似之处仅止于都带有“紧凑”一词。