要解决的真实问题
钱包想在不下载全部区块的情况下确认自己收到钱,传统方案是让全节点替你做过滤。问题在于:你把关心的地址做成布隆过滤器发给节点的那一刻,对方就知道你在追踪哪些地址。轻客户端的隐私困境从一开始就不是算力不够,而是查询本身会暴露意图。

两种过滤路线的分水岭
布隆过滤器方案出自 BIP37(已部署):客户端把过滤器上传给节点,节点逐笔筛查并推送命中的交易,还会主动推送区块头。服务方因此能反推客户端的关注范围,多个客户端的查询交集还能进一步缩小嫌疑对象。BIP157 与 BIP158 把方向翻转:不再由客户端提供过滤器,而是全节点为每个区块确定性地计算一份紧凑过滤器,所有客户端下载的都是同一份数据,谁也无法从流量里看出你在找什么。
过滤器里装了什么
哪些数据进过滤器有明确规定。以 basic 类型为例,收录本区块各交易输出的 scriptPubKey(不含 OP_RETURN 输出),以及各输入所花掉输出的 scriptPubKey。这意味着一次查询可以同时覆盖付给我和花掉我的钱两种情况。数据被压进 Golomb 编码集合(GCS),basic 类型参数固定为 M=784931、P=19:集合内元素一定命中,集合外元素大约有七十八万四千九百三十一分之一的误匹配率。少量误报反而带来一个隐私特性——即使过滤器命中,客户端也要下载区块内容做二次验证,服务器无法仅凭下载行为断定你关心哪个地址。依赖链上数据载荷做发现的应用则要额外注意:basic 过滤器不覆盖 OP_RETURN 内容,BIP351 的相关附录对此有明确提示。
同步过程怎么走
支持这类查询的节点会在服务位上声明能力,客户端可批量按块高区间请求过滤器,用过滤器头部消息逐块验证连续性,并用检查点类消息快速对齐到链尖,避免逐块往返。采用所谓 Neutrino 模式的轻钱包据此工作:拉过滤器、本地比对、命中才索取区块、再用默克尔证明验证交易归属。对使用者来说体验接近自带索引的轻钱包,不需要信任任何一台服务器来告诉你余额,代价是首次同步要下载并扫描全部历史过滤器。
常见误区
第一,把过滤器当余额查询接口。它只能回答这个区块是否可能与我有关,余额仍需客户端自己汇总。第二,把误匹配当攻击信号,误报率是设计参数,不是有人在盯你。第三,把所有轻钱包都归为这一类实现。有的轻钱包仍依赖可索引任意地址的中心化后端,隐私边界完全不同,选型时应核对软件文档写明采用哪种过滤协议。
风险边界
这套机制把隐私成本从信任服务器换成了带宽与首次同步时间,对手机钱包通常划算。协议本身不解决对方拒绝提供区块的可用性风险,那仍要靠多节点下载与默克尔证明兜底。参数取值以 BIP158 当前文本为准。本文只做机制科普,不构成任何投资或服务选择建议。
与普通节点的分工
值得区分的是,这套过滤协议不改变全节点的验证责任:过滤器只是导航工具,帮助客户端少下数据,不承担共识判断。全节点自己从不依赖过滤器做验证,它保留完整的区块校验逻辑;过滤器生成错了对全节点没有安全影响,但对轻客户端意味着要靠默克尔证明与多节点交叉核对来兜住漏网与谎报。实际部署里,桌面全节点可以开启该类服务位对外提供过滤器,手机轻钱包则作为客户端消费这些数据——两端配合才构成完整的隐私链路。如果一台节点不想承担这份额外带宽与索引开销,也可以不声明该服务位,此时客户端应转向其他已声明的节点。理解这个分工,就不会把过滤器与轻量验证混为一谈:前者是检索加速,后者是密码学证明,二者在协议中各司其职。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。