MSTR Cat

区块链/等级 III · 网络/3.1 节点/课程 4

修剪节点与轻客户端(SPV)

信任架构:从完全验证到默克尔证明

材料配置了 prune=550 的 Bitcoin Core 节点(可选)一个轻钱包区块浏览器

好奇

  1. 节点如何在不永久存储每个区块的情况下验证比特币的完整历史记录?
  2. 究竟是哪种密码学机制,让手机钱包无需下载数百GB的数据就能验证自己的余额?
  3. 最初为轻钱包设计的隐私保护过滤器为什么反而会泄露用户身份?这一缺陷又是如何修复的?

探索

  1. 完整验证与完整存储是可以分开的。每个执行验证的节点都必须将每个区块处理一遍,以构建当前的未花费输出集,但之后无需保留旧区块。有些客户端走得更远,完全跳过验证,只检查交易是否被包含在具有足够工作量证明的区块中。这些选择是在磁盘空间、带宽、隐私与独立性之间进行取舍。
  2. 修剪节点会同样从创世区块开始对每个区块进行初始验证,但随后会删除旧的区块数据以节省磁盘空间。Bitcoin Core 的 `prune` 设置会保留至少550 MB的最近区块,并在较旧的区块验证完成后将其丢弃。修剪节点仍是完整的验证者,能够执行共识规则,并以独立核实的事实保护其所有者的钱包。不过,它无法再向其他对等节点提供历史区块数据,也无法支持 `txindex` 这类需要深度查询链上数据的功能。
  3. 轻客户端(即 SPV 节点)采取了不同的方式:它们不验证完整的规则集。它们只下载区块头,区块头中包含该区块所有交易的默克尔根。要验证某笔交易是否被包含在区块中,客户端会向对等节点请求默克尔证明,并用区块头中的根进行核对。这种方式依赖一个假设:累计工作量最多的链就是有效的。它以放弃独立执行规则为代价,换来存储和带宽需求的大幅降低。
  4. 早期的 SPV 实现使用 BIP37 布隆过滤器,让钱包只向对等节点请求相关的交易。钱包会发送一个描述其地址的过滤器;对等节点则扫描自己的内存池,并发送匹配的交易。这种设计会泄露隐私:恶意节点通过观察这些过滤器,就能推断出哪些地址属于该用户并追踪其活动。2019年(0.19版本),Bitcoin Core 默认不再提供布隆过滤器服务。
  5. 紧凑区块过滤器(BIP157/158)反转了这一流程,从而恢复了隐私。钱包不再暴露自己的地址,而是由全节点为每个区块发布一个紧凑过滤器;客户端下载这些过滤器,并在本地用自己的密钥进行匹配测试。过滤器匹配时,客户端会下载整个区块,因为只请求单笔交易就会把它暴露给对等节点。这样,对等节点就无法得知钱包在监控哪些地址,在保持高效同步的同时显著提升了用户隐私。
  6. 许多手机钱包依赖第三方服务器(例如 Electrum 服务器)获取数据,同时自行根据区块头核验默克尔证明。其中的权衡显而易见:一边是便利与低资源占用,另一边是独立验证与隐私。运行修剪节点的用户保留了完整的验证能力,但提供历史数据的能力有限;SPV 钱包占用的资源极少,却要依赖对等节点向它展示每一笔相关交易,并且不经检查就假定工作量最多的链是有效的。

关键事实

  • 修剪节点会验证自创世区块以来的所有区块,但会删除旧数据,只保留至少550 MB的最近区块。
  • SPV客户端只下载区块头,并利用默克尔证明,对照区块头中的根哈希来验证交易。
  • BIP37 的布隆过滤器会泄露用户隐私,因为它会向其他节点暴露该钱包所监控的地址。
  • 紧凑区块过滤器(BIP157/158)允许客户端在本地测试服务器提供的过滤器,从而保护地址隐私。
  • SPV钱包信任累计工作量证明最多的链是有效的,而不是独立执行全部共识规则。
  • 修剪节点仍是完整的验证者,能够保护其所有者的资金,但无法向其他对等节点提供历史区块数据。

练习 九、六、三、一

9收集列出9种比特币节点或客户端实现。逐一注明:存储需求、验证能力(完整验证或 SPV)以及主要用途。
6归类根据独立验证程度和数据保留情况,将这9种归为6类。
3提炼将这6组提炼为隐私、安全与资源消耗之间的3种不同权衡。
1凝结用一句话解释:为什么轻客户端的信任模型与全节点有着根本区别。

事实核查

日期、数字及数据均依据下方列出的已发表资料进行核实。

在互动学院中打开 →

EN PT ES JA KO RU DE FR MS