180 / 691BIP157/158

Compact Block Filters

钱包运行中的紧凑区块过滤器

Compact Block Filters 通过本地脚本匹配帮助轻钱包选择要下载的区块。匹配只表示需要检查,不确认付款,也不保证匿名。

Compact Block Filters 是为各区块确定性构建的小型概率索引。BIP 158 定义内容与编码,BIP 157 负责传输和连续性检查;客户端在本地比较关注的脚本。

钱包同步区块头和过滤器头、下载过滤器,并在本地测试脚本。匹配后获取整个区块并查找实际交易。不能仅因匹配而增加余额:过滤器不返回金额、所有权证明或完整交易历史。 [BIP 157 — Client Side Block Filtering]

BIP 158 basic 包含新输出的 scriptPubKey,但排除以 OP_RETURN 开头者,还包含非 coinbase 输入所花费的先前输出脚本。空项会省略。地址字符串必须转换为正确脚本;过滤器并非 txid、witness 数据或任意备注的通用索引。 [BIP 158 — Compact Block Filters for Light Clients] [Bitcoin Core — BasicFilterElements]

Golomb-Rice 编码存储排序后的哈希值之间的差;basic 使用 P=19 和 M=784931。一次非成员查询可能以约 1/M 的概率匹配。关注更多脚本会增加碰撞机会,并不意味着整个钱包具有固定错误率。正确构建的过滤器不会遗漏已包含元素。 [BIP 158 — Compact Block Filters for Light Clients]

过滤器头连接当前过滤器哈希与前一个头。检查连续性可发现与已接受链的差异,但该承诺不在 Bitcoin 区块头内。攻击者能提供内部一致的虚假过滤器;单凭计算正确的哈希不能保证内容真实。 [BIP 157 — Client Side Block Filtering]

BIP 157 通过比较对等节点发现虚假过滤器,前提是至少有一个诚实参与者。重建 basic 还可能需要已花费先前输出的脚本。重组时必须跟随新分支的过滤器并重新计算钱包状态;原来的同一高度不代表同一区块。 [BIP 157 — Client Side Block Filtering] [Bitcoin Core — BasicFilterElements]

与 BIP 37 不同,客户端不向服务器发送个人地址过滤器。但对等节点仍可能观察 IP、时序和请求的区块。从不同节点下载可减少信息集中,却不能阻止所有关联;意外匹配本身不会让通信匿名。 [BIP 157 — Client Side Block Filtering]

启用相应索引后,Bitcoin Core RPC getblockfilter 按区块哈希返回过滤器及其头。这既不能证明有公开 P2P 服务,也不能证明该节点能提供所有历史区块。客户端需要可用区块来源;已完成区块的过滤器不通报 Mempool 中未确认交易。 [BIP 157 — Client Side Block Filtering] [Bitcoin Core 30.0 — getblockfilter]

BIP 152 的 Compact Blocks 用短交易标识符和本地 Mempool 加快新区块传输。Compact Block Filters 则为客户端筛选相关区块。本地匹配或检查交易是否包含在区块中,都不能替代对所有区块进行独立完整的共识验证。 [BIP 157 — Client Side Block Filtering] [BIP 152 — Compact Block Relay]

要获得更完整的理解,请将本词条与以下词条结合阅读: Compact Block Filters, Neutrino, Full Node, Bitcoin 隐私, 紧凑区块中继. 反向关联还来自: Neutrino.

DOC · 001BIP 157 — Client Side Block Filtering规范DOC · 002BIP 158 — Compact Block Filters for Light Clients规范DOC · 003Bitcoin Core — BasicFilterElements一手来源DOC · 004Bitcoin Core 30.0 — getblockfilter文档DOC · 005BIP 152 — Compact Block Relay规范
来源优先 · 非投资建议