跳转到正文
buybitcoinsmart

术语表 /节点与软件

Neutrino

又称 BIP157、紧凑区块过滤器、轻客户端。

Neutrino 是什么?
Neutrino 是一种轻客户端设计:钱包为每个区块下载一个极小的过滤器,在本地检查,只获取可能与您有关的完整区块。

规定于 BIP-157。

整个思路就是把旧的做法倒过来。钱包不再告诉服务器要监视哪些地址,而是获取每个区块的紧凑摘要,在自己的硬件上完成匹配。自2019年11月发布的0.19.0版本起,Bitcoin Core 就能构建这类过滤器,自0.21.0版本起能向其他节点提供这些过滤器,因此该机制不再依赖对单一提供方的信任。

运作方式

Neutrino 建立在两项规范之上,一项工作由两者分担。

BIP158 定义过滤器本身:对每个区块,生成一个集合,包含该区块创建的每个输出脚本和花费的每个输出脚本,并压缩为 Golomb-Rice 编码结构。其两个参数由规范固定,P 为19,M 为784,931,对应每个被检测元素的假阳性率约为784,931分之一。实际使用中,监视几十个脚本的钱包每年会多下载少量不必要的区块。

BIP157 定义在节点之间传递这些过滤器的消息:getcfilters 和 cfilter 用于过滤器,getcfheaders 和 cfheaders 用于过滤器头链,getcfcheckpt 用于定期检查点。过滤器头比听上去重要得多。每个过滤器头都承诺前一个,因此客户端可以向多个相互独立的节点请求检查点,一旦其中某个节点提供的过滤器集合与其他节点不同,就能立即发现,无需下载区块来核对。

钱包的流程随之变得简单:同步区块头,下载每个过滤器,用自己持有的脚本逐一检测,仅当过滤器显示可能匹配时才请求完整区块。提供该区块的节点只知道您想要区块912,345,别无其他,这比一份地址清单所传递的信号弱得多。在 Bitcoin Core 节点上,该索引通过 blockfilterindex 启用,该功能发布时约占用4 GiB 磁盘空间,并通过 peerblockfilters 向其他节点提供。

在哪里会遇到它

Neutrino 是不愿运行服务器的移动闪电网络钱包所采用的链后端。

这个名称首先属于 Lightning Labs 的 Go 语言实现,lnd 可以用它代替完整节点,大多数人也是在这里接触到它:手机钱包可以开通通道、支付发票,自身却不携带任何区块链数据。Breez 和其他几款移动钱包采用同样的路线。

代价是带宽和耐心。Neutrino 客户端无论是否有匹配都要下载每个过滤器,因此比仅向服务器查询余额的钱包耗费多得多的数据;恢复旧备份则需要从钱包创建时的区块高度起逐步向前遍历过滤器,而不是一次查询就得到结果。在按流量计费的移动网络上,这是一项需要认真权衡的决定,而非形式问题。

Neutrino vs BIP37 布隆过滤器

Neutrino 由客户端过滤区块;BIP37 则由客户端把自己的过滤器交给服务器,方向正好相反。BIP37 布隆过滤器由您自己的地址生成并发送给某个节点,研究人员多次证明,其中的假阳性几乎无助于隐藏过滤器内的内容。它还是一种低成本的拒绝服务手段,因为任何节点都可以要求另一个节点用任意过滤器重新扫描整条链。Bitcoin Core 自0.19.0版本起默认不再提供 BIP37 服务,该版本同时引入了紧凑过滤器索引,仍依赖它的钱包会把自己的地址集合泄露给所连接的任何节点。

Neutrino vs Electrum 服务器

Neutrino 把工作和信息都转移到您的设备上;Electrum 服务器则两者都留在服务器端。查询服务器只需千字节,立即得到答复,这正是桌面钱包偏好它的原因,但运营方最终会掌握您的地址历史。Neutrino 则在钱包的整个使用期内消耗数 GB 流量,以便把这些历史留在您的手机上。

请勿混淆

常见问题

Neutrino 钱包的隐私性与运行完整节点一样吗?

接近,但并不相同。由于匹配在您的设备上完成,没有人会知道您的地址,但为您提供区块的节点确实会知道您请求了该特定区块。由您自己掌控的完整节点则完全不会泄露任何信息。

为什么我的移动钱包消耗这么多流量?

因为紧凑过滤器客户端会为每个区块下载一个过滤器,无论该区块是否与您有关,过滤器一旦匹配还要下载完整区块。这是不向服务器透露您拥有哪些地址的代价,在按流量计费的网络上同步之前,值得先查看一下。

相关术语

节点与软件中的更多术语

阅读本页英文版