SPV:比特币轻客户端如何在不下载完整区块链的情况下验证交易

SPV,全称是 Simplified Payment Verification,即"简化支付验证"。它是比特币白皮书中提出的一种轻量级验证方式,目标是让用户不必下载和验证完整区块链,也能确认一笔交易是否已经被比特币网络接受。

在比特币系统中,全节点会下载完整区块、验证每笔交易和每条共识规则。但普通手机钱包、浏览器钱包或轻量客户端,往往没有足够的存储、带宽和算力运行完整节点。

SPV 就是在这个背景下出现的。

它回答的问题是:

如果我不保存完整区块链,能不能仍然相对可靠地知道一笔交易已经被确认?

答案是:可以,但前提是你理解它的能力边界。


一、为什么需要 SPV?

运行一个比特币全节点,需要完成很多工作:

项目 全节点需要做什么
下载数据 下载完整区块数据
验证交易 检查所有交易签名、UTXO、金额和脚本
验证区块 检查 PoW、区块奖励、难度、时间戳等
保存账本 维护完整或裁剪后的 UTXO 集
独立判断 不依赖第三方判断哪条链有效

这对服务器来说可以接受,但对手机钱包来说就比较重。

SPV 的设计目标是降低客户端负担:

项目 SPV 客户端如何处理
是否下载完整区块? 不下载
是否保存所有交易? 不保存
是否验证所有交易? 不验证
是否下载区块头? 下载
是否验证 PoW 链? 验证区块头工作量
是否验证目标交易被打包? 通过 Merkle 证明验证

SPV 的核心思路是:

只下载区块头,而不是下载完整区块;只验证某笔交易是否被包含在某个区块中,而不是验证整个区块里所有交易是否合法。


二、全节点和 SPV 节点的区别

比特币区块由两部分组成:

  1. 区块头(Block Header)
  2. 区块体(Block Body)

区块头很小,主要包含前一区块哈希、Merkle Root、时间戳、难度目标、nonce 等信息;区块体则包含大量交易。
#mermaid-svg-Bslho25Glb2nVc2c{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Bslho25Glb2nVc2c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Bslho25Glb2nVc2c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Bslho25Glb2nVc2c .error-icon{fill:#552222;}#mermaid-svg-Bslho25Glb2nVc2c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Bslho25Glb2nVc2c .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Bslho25Glb2nVc2c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Bslho25Glb2nVc2c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Bslho25Glb2nVc2c .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Bslho25Glb2nVc2c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Bslho25Glb2nVc2c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Bslho25Glb2nVc2c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Bslho25Glb2nVc2c .marker.cross{stroke:#333333;}#mermaid-svg-Bslho25Glb2nVc2c svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Bslho25Glb2nVc2c p{margin:0;}#mermaid-svg-Bslho25Glb2nVc2c .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Bslho25Glb2nVc2c .cluster-label text{fill:#333;}#mermaid-svg-Bslho25Glb2nVc2c .cluster-label span{color:#333;}#mermaid-svg-Bslho25Glb2nVc2c .cluster-label span p{background-color:transparent;}#mermaid-svg-Bslho25Glb2nVc2c .label text,#mermaid-svg-Bslho25Glb2nVc2c span{fill:#333;color:#333;}#mermaid-svg-Bslho25Glb2nVc2c .node rect,#mermaid-svg-Bslho25Glb2nVc2c .node circle,#mermaid-svg-Bslho25Glb2nVc2c .node ellipse,#mermaid-svg-Bslho25Glb2nVc2c .node polygon,#mermaid-svg-Bslho25Glb2nVc2c .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Bslho25Glb2nVc2c .rough-node .label text,#mermaid-svg-Bslho25Glb2nVc2c .node .label text,#mermaid-svg-Bslho25Glb2nVc2c .image-shape .label,#mermaid-svg-Bslho25Glb2nVc2c .icon-shape .label{text-anchor:middle;}#mermaid-svg-Bslho25Glb2nVc2c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Bslho25Glb2nVc2c .rough-node .label,#mermaid-svg-Bslho25Glb2nVc2c .node .label,#mermaid-svg-Bslho25Glb2nVc2c .image-shape .label,#mermaid-svg-Bslho25Glb2nVc2c .icon-shape .label{text-align:center;}#mermaid-svg-Bslho25Glb2nVc2c .node.clickable{cursor:pointer;}#mermaid-svg-Bslho25Glb2nVc2c .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Bslho25Glb2nVc2c .arrowheadPath{fill:#333333;}#mermaid-svg-Bslho25Glb2nVc2c .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Bslho25Glb2nVc2c .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Bslho25Glb2nVc2c .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Bslho25Glb2nVc2c .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Bslho25Glb2nVc2c .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Bslho25Glb2nVc2c .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Bslho25Glb2nVc2c .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Bslho25Glb2nVc2c .cluster text{fill:#333;}#mermaid-svg-Bslho25Glb2nVc2c .cluster span{color:#333;}#mermaid-svg-Bslho25Glb2nVc2c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Bslho25Glb2nVc2c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Bslho25Glb2nVc2c rect.text{fill:none;stroke-width:0;}#mermaid-svg-Bslho25Glb2nVc2c .icon-shape,#mermaid-svg-Bslho25Glb2nVc2c .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Bslho25Glb2nVc2c .icon-shape p,#mermaid-svg-Bslho25Glb2nVc2c .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Bslho25Glb2nVc2c .icon-shape .label rect,#mermaid-svg-Bslho25Glb2nVc2c .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Bslho25Glb2nVc2c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Bslho25Glb2nVc2c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Bslho25Glb2nVc2c :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 比特币区块
区块头 Block Header
区块体 Block Body
前一区块哈希
Merkle Root
时间戳
难度目标
Nonce
交易 1
交易 2
交易 3
更多交易...

全节点会下载和验证整个区块;SPV 节点主要下载区块头。
#mermaid-svg-SS18vbIv1zj71Bom{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SS18vbIv1zj71Bom .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SS18vbIv1zj71Bom .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SS18vbIv1zj71Bom .error-icon{fill:#552222;}#mermaid-svg-SS18vbIv1zj71Bom .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SS18vbIv1zj71Bom .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SS18vbIv1zj71Bom .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SS18vbIv1zj71Bom .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SS18vbIv1zj71Bom .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SS18vbIv1zj71Bom .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SS18vbIv1zj71Bom .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SS18vbIv1zj71Bom .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SS18vbIv1zj71Bom .marker.cross{stroke:#333333;}#mermaid-svg-SS18vbIv1zj71Bom svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SS18vbIv1zj71Bom p{margin:0;}#mermaid-svg-SS18vbIv1zj71Bom .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SS18vbIv1zj71Bom .cluster-label text{fill:#333;}#mermaid-svg-SS18vbIv1zj71Bom .cluster-label span{color:#333;}#mermaid-svg-SS18vbIv1zj71Bom .cluster-label span p{background-color:transparent;}#mermaid-svg-SS18vbIv1zj71Bom .label text,#mermaid-svg-SS18vbIv1zj71Bom span{fill:#333;color:#333;}#mermaid-svg-SS18vbIv1zj71Bom .node rect,#mermaid-svg-SS18vbIv1zj71Bom .node circle,#mermaid-svg-SS18vbIv1zj71Bom .node ellipse,#mermaid-svg-SS18vbIv1zj71Bom .node polygon,#mermaid-svg-SS18vbIv1zj71Bom .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SS18vbIv1zj71Bom .rough-node .label text,#mermaid-svg-SS18vbIv1zj71Bom .node .label text,#mermaid-svg-SS18vbIv1zj71Bom .image-shape .label,#mermaid-svg-SS18vbIv1zj71Bom .icon-shape .label{text-anchor:middle;}#mermaid-svg-SS18vbIv1zj71Bom .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SS18vbIv1zj71Bom .rough-node .label,#mermaid-svg-SS18vbIv1zj71Bom .node .label,#mermaid-svg-SS18vbIv1zj71Bom .image-shape .label,#mermaid-svg-SS18vbIv1zj71Bom .icon-shape .label{text-align:center;}#mermaid-svg-SS18vbIv1zj71Bom .node.clickable{cursor:pointer;}#mermaid-svg-SS18vbIv1zj71Bom .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SS18vbIv1zj71Bom .arrowheadPath{fill:#333333;}#mermaid-svg-SS18vbIv1zj71Bom .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SS18vbIv1zj71Bom .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SS18vbIv1zj71Bom .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SS18vbIv1zj71Bom .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SS18vbIv1zj71Bom .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SS18vbIv1zj71Bom .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SS18vbIv1zj71Bom .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SS18vbIv1zj71Bom .cluster text{fill:#333;}#mermaid-svg-SS18vbIv1zj71Bom .cluster span{color:#333;}#mermaid-svg-SS18vbIv1zj71Bom div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SS18vbIv1zj71Bom .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SS18vbIv1zj71Bom rect.text{fill:none;stroke-width:0;}#mermaid-svg-SS18vbIv1zj71Bom .icon-shape,#mermaid-svg-SS18vbIv1zj71Bom .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SS18vbIv1zj71Bom .icon-shape p,#mermaid-svg-SS18vbIv1zj71Bom .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SS18vbIv1zj71Bom .icon-shape .label rect,#mermaid-svg-SS18vbIv1zj71Bom .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SS18vbIv1zj71Bom .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SS18vbIv1zj71Bom .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SS18vbIv1zj71Bom :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SPV 节点
下载区块头
请求相关交易
验证 Merkle 证明
跟踪确认数
全节点
下载区块头
下载全部交易
验证每笔交易
维护 UTXO 集

这带来了显著的资源差异。

对比项 全节点 SPV 节点
数据量
是否验证所有交易
是否维护完整 UTXO 集
是否能独立发现无效区块 不能完全做到
适合场景 长期安全、自主验证 手机钱包、轻量支付

三、SPV 的核心工具:区块头链

每个区块头都包含前一个区块的哈希,因此区块头本身可以连接成一条链。
#mermaid-svg-7M50hIUSnL78mCMq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7M50hIUSnL78mCMq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7M50hIUSnL78mCMq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7M50hIUSnL78mCMq .error-icon{fill:#552222;}#mermaid-svg-7M50hIUSnL78mCMq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7M50hIUSnL78mCMq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7M50hIUSnL78mCMq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7M50hIUSnL78mCMq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7M50hIUSnL78mCMq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7M50hIUSnL78mCMq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7M50hIUSnL78mCMq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7M50hIUSnL78mCMq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7M50hIUSnL78mCMq .marker.cross{stroke:#333333;}#mermaid-svg-7M50hIUSnL78mCMq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7M50hIUSnL78mCMq p{margin:0;}#mermaid-svg-7M50hIUSnL78mCMq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7M50hIUSnL78mCMq .cluster-label text{fill:#333;}#mermaid-svg-7M50hIUSnL78mCMq .cluster-label span{color:#333;}#mermaid-svg-7M50hIUSnL78mCMq .cluster-label span p{background-color:transparent;}#mermaid-svg-7M50hIUSnL78mCMq .label text,#mermaid-svg-7M50hIUSnL78mCMq span{fill:#333;color:#333;}#mermaid-svg-7M50hIUSnL78mCMq .node rect,#mermaid-svg-7M50hIUSnL78mCMq .node circle,#mermaid-svg-7M50hIUSnL78mCMq .node ellipse,#mermaid-svg-7M50hIUSnL78mCMq .node polygon,#mermaid-svg-7M50hIUSnL78mCMq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7M50hIUSnL78mCMq .rough-node .label text,#mermaid-svg-7M50hIUSnL78mCMq .node .label text,#mermaid-svg-7M50hIUSnL78mCMq .image-shape .label,#mermaid-svg-7M50hIUSnL78mCMq .icon-shape .label{text-anchor:middle;}#mermaid-svg-7M50hIUSnL78mCMq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7M50hIUSnL78mCMq .rough-node .label,#mermaid-svg-7M50hIUSnL78mCMq .node .label,#mermaid-svg-7M50hIUSnL78mCMq .image-shape .label,#mermaid-svg-7M50hIUSnL78mCMq .icon-shape .label{text-align:center;}#mermaid-svg-7M50hIUSnL78mCMq .node.clickable{cursor:pointer;}#mermaid-svg-7M50hIUSnL78mCMq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7M50hIUSnL78mCMq .arrowheadPath{fill:#333333;}#mermaid-svg-7M50hIUSnL78mCMq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7M50hIUSnL78mCMq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7M50hIUSnL78mCMq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7M50hIUSnL78mCMq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7M50hIUSnL78mCMq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7M50hIUSnL78mCMq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7M50hIUSnL78mCMq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7M50hIUSnL78mCMq .cluster text{fill:#333;}#mermaid-svg-7M50hIUSnL78mCMq .cluster span{color:#333;}#mermaid-svg-7M50hIUSnL78mCMq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7M50hIUSnL78mCMq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7M50hIUSnL78mCMq rect.text{fill:none;stroke-width:0;}#mermaid-svg-7M50hIUSnL78mCMq .icon-shape,#mermaid-svg-7M50hIUSnL78mCMq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7M50hIUSnL78mCMq .icon-shape p,#mermaid-svg-7M50hIUSnL78mCMq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7M50hIUSnL78mCMq .icon-shape .label rect,#mermaid-svg-7M50hIUSnL78mCMq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7M50hIUSnL78mCMq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7M50hIUSnL78mCMq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7M50hIUSnL78mCMq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 区块头 1
区块头 2
区块头 3
区块头 4
区块头 5

SPV 客户端会下载区块头,并检查:

  1. 每个区块头是否正确引用前一个区块;
  2. 每个区块头的哈希是否满足难度目标;
  3. 哪条区块头链拥有最多累计工作量。

这样,SPV 节点虽然不验证完整区块内容,但它仍然可以判断:

哪条链代表了最多的工作量投入。

这非常关键,因为比特币共识并不是简单地看谁说得多,而是看哪条有效链背后有最多工作量。


四、Merkle 树:证明一笔交易在区块里

SPV 要验证一笔交易已经进入某个区块,不能只听别人说"它在里面"。它需要一个可以独立检查的证明。

这个证明就是 Merkle 证明

比特币会把区块中的所有交易哈希组织成一棵 Merkle 树,最终得到一个根哈希,叫做 Merkle Root。Merkle Root 被写入区块头。
#mermaid-svg-AOAJDa9P6ffK9UXD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AOAJDa9P6ffK9UXD .error-icon{fill:#552222;}#mermaid-svg-AOAJDa9P6ffK9UXD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AOAJDa9P6ffK9UXD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AOAJDa9P6ffK9UXD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AOAJDa9P6ffK9UXD .marker.cross{stroke:#333333;}#mermaid-svg-AOAJDa9P6ffK9UXD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AOAJDa9P6ffK9UXD p{margin:0;}#mermaid-svg-AOAJDa9P6ffK9UXD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster-label text{fill:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster-label span{color:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster-label span p{background-color:transparent;}#mermaid-svg-AOAJDa9P6ffK9UXD .label text,#mermaid-svg-AOAJDa9P6ffK9UXD span{fill:#333;color:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD .node rect,#mermaid-svg-AOAJDa9P6ffK9UXD .node circle,#mermaid-svg-AOAJDa9P6ffK9UXD .node ellipse,#mermaid-svg-AOAJDa9P6ffK9UXD .node polygon,#mermaid-svg-AOAJDa9P6ffK9UXD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AOAJDa9P6ffK9UXD .rough-node .label text,#mermaid-svg-AOAJDa9P6ffK9UXD .node .label text,#mermaid-svg-AOAJDa9P6ffK9UXD .image-shape .label,#mermaid-svg-AOAJDa9P6ffK9UXD .icon-shape .label{text-anchor:middle;}#mermaid-svg-AOAJDa9P6ffK9UXD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AOAJDa9P6ffK9UXD .rough-node .label,#mermaid-svg-AOAJDa9P6ffK9UXD .node .label,#mermaid-svg-AOAJDa9P6ffK9UXD .image-shape .label,#mermaid-svg-AOAJDa9P6ffK9UXD .icon-shape .label{text-align:center;}#mermaid-svg-AOAJDa9P6ffK9UXD .node.clickable{cursor:pointer;}#mermaid-svg-AOAJDa9P6ffK9UXD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AOAJDa9P6ffK9UXD .arrowheadPath{fill:#333333;}#mermaid-svg-AOAJDa9P6ffK9UXD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AOAJDa9P6ffK9UXD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AOAJDa9P6ffK9UXD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AOAJDa9P6ffK9UXD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AOAJDa9P6ffK9UXD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AOAJDa9P6ffK9UXD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster text{fill:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD .cluster span{color:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AOAJDa9P6ffK9UXD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AOAJDa9P6ffK9UXD rect.text{fill:none;stroke-width:0;}#mermaid-svg-AOAJDa9P6ffK9UXD .icon-shape,#mermaid-svg-AOAJDa9P6ffK9UXD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AOAJDa9P6ffK9UXD .icon-shape p,#mermaid-svg-AOAJDa9P6ffK9UXD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AOAJDa9P6ffK9UXD .icon-shape .label rect,#mermaid-svg-AOAJDa9P6ffK9UXD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AOAJDa9P6ffK9UXD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AOAJDa9P6ffK9UXD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AOAJDa9P6ffK9UXD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Tx1
Hash12
Tx2
Tx3
Hash34
Tx4
Merkle Root

假设用户想证明 Tx3 在这个区块中,不需要下载 Tx1、Tx2、Tx4 的完整内容,只需要获得一条从 Tx3 到 Merkle Root 的路径。
#mermaid-svg-Il3tZxJQp3KUtPfJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Il3tZxJQp3KUtPfJ .error-icon{fill:#552222;}#mermaid-svg-Il3tZxJQp3KUtPfJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Il3tZxJQp3KUtPfJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .marker.cross{stroke:#333333;}#mermaid-svg-Il3tZxJQp3KUtPfJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Il3tZxJQp3KUtPfJ p{margin:0;}#mermaid-svg-Il3tZxJQp3KUtPfJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster-label text{fill:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster-label span{color:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster-label span p{background-color:transparent;}#mermaid-svg-Il3tZxJQp3KUtPfJ .label text,#mermaid-svg-Il3tZxJQp3KUtPfJ span{fill:#333;color:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .node rect,#mermaid-svg-Il3tZxJQp3KUtPfJ .node circle,#mermaid-svg-Il3tZxJQp3KUtPfJ .node ellipse,#mermaid-svg-Il3tZxJQp3KUtPfJ .node polygon,#mermaid-svg-Il3tZxJQp3KUtPfJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .rough-node .label text,#mermaid-svg-Il3tZxJQp3KUtPfJ .node .label text,#mermaid-svg-Il3tZxJQp3KUtPfJ .image-shape .label,#mermaid-svg-Il3tZxJQp3KUtPfJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-Il3tZxJQp3KUtPfJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .rough-node .label,#mermaid-svg-Il3tZxJQp3KUtPfJ .node .label,#mermaid-svg-Il3tZxJQp3KUtPfJ .image-shape .label,#mermaid-svg-Il3tZxJQp3KUtPfJ .icon-shape .label{text-align:center;}#mermaid-svg-Il3tZxJQp3KUtPfJ .node.clickable{cursor:pointer;}#mermaid-svg-Il3tZxJQp3KUtPfJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .arrowheadPath{fill:#333333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Il3tZxJQp3KUtPfJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Il3tZxJQp3KUtPfJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Il3tZxJQp3KUtPfJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster text{fill:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ .cluster span{color:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Il3tZxJQp3KUtPfJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Il3tZxJQp3KUtPfJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-Il3tZxJQp3KUtPfJ .icon-shape,#mermaid-svg-Il3tZxJQp3KUtPfJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Il3tZxJQp3KUtPfJ .icon-shape p,#mermaid-svg-Il3tZxJQp3KUtPfJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Il3tZxJQp3KUtPfJ .icon-shape .label rect,#mermaid-svg-Il3tZxJQp3KUtPfJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Il3tZxJQp3KUtPfJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Il3tZxJQp3KUtPfJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Il3tZxJQp3KUtPfJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 目标交易 Tx3
Hash34
兄弟哈希: Tx4 的哈希
兄弟哈希: Hash12
Merkle Root
区块头中的 Merkle Root

SPV 客户端会做三步检查:

  1. 对目标交易计算交易哈希;
  2. 使用对方提供的兄弟哈希,逐层计算到 Merkle Root;
  3. 比较计算出的 Merkle Root 是否等于区块头中的 Merkle Root。

如果相等,就说明:

这笔交易确实被包含在这个区块头所对应的区块中。


五、SPV 验证交易的完整流程

假设 Alice 用一个 SPV 钱包收到了 Bob 的付款。
Merkle 证明 区块头链 比特币网络节点 Alice 的 SPV 钱包 Merkle 证明 区块头链 比特币网络节点 Alice 的 SPV 钱包 #mermaid-svg-TfMaQ9ULpWcMXYbK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TfMaQ9ULpWcMXYbK .error-icon{fill:#552222;}#mermaid-svg-TfMaQ9ULpWcMXYbK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TfMaQ9ULpWcMXYbK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TfMaQ9ULpWcMXYbK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TfMaQ9ULpWcMXYbK .marker.cross{stroke:#333333;}#mermaid-svg-TfMaQ9ULpWcMXYbK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TfMaQ9ULpWcMXYbK p{margin:0;}#mermaid-svg-TfMaQ9ULpWcMXYbK .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TfMaQ9ULpWcMXYbK text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-TfMaQ9ULpWcMXYbK .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-TfMaQ9ULpWcMXYbK .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-TfMaQ9ULpWcMXYbK #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-TfMaQ9ULpWcMXYbK .sequenceNumber{fill:white;}#mermaid-svg-TfMaQ9ULpWcMXYbK #sequencenumber{fill:#333;}#mermaid-svg-TfMaQ9ULpWcMXYbK #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-TfMaQ9ULpWcMXYbK .messageText{fill:#333;stroke:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TfMaQ9ULpWcMXYbK .labelText,#mermaid-svg-TfMaQ9ULpWcMXYbK .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .loopText,#mermaid-svg-TfMaQ9ULpWcMXYbK .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-TfMaQ9ULpWcMXYbK .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-TfMaQ9ULpWcMXYbK .noteText,#mermaid-svg-TfMaQ9ULpWcMXYbK .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-TfMaQ9ULpWcMXYbK .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TfMaQ9ULpWcMXYbK .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TfMaQ9ULpWcMXYbK .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TfMaQ9ULpWcMXYbK .actorPopupMenu{position:absolute;}#mermaid-svg-TfMaQ9ULpWcMXYbK .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-TfMaQ9ULpWcMXYbK .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TfMaQ9ULpWcMXYbK .actor-man circle,#mermaid-svg-TfMaQ9ULpWcMXYbK line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-TfMaQ9ULpWcMXYbK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 请求最新区块头返回区块头链验证区块头 PoW 和累计工作量查询与自己相关的交易返回交易 + Merkle 证明验证交易哈希是否能连接到 Merkle Root检查该区块后续确认数

更直观地说,SPV 验证包括两个层面:
#mermaid-svg-aT1swSsmHs466yXi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aT1swSsmHs466yXi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aT1swSsmHs466yXi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aT1swSsmHs466yXi .error-icon{fill:#552222;}#mermaid-svg-aT1swSsmHs466yXi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aT1swSsmHs466yXi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aT1swSsmHs466yXi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aT1swSsmHs466yXi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aT1swSsmHs466yXi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aT1swSsmHs466yXi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aT1swSsmHs466yXi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aT1swSsmHs466yXi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aT1swSsmHs466yXi .marker.cross{stroke:#333333;}#mermaid-svg-aT1swSsmHs466yXi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aT1swSsmHs466yXi p{margin:0;}#mermaid-svg-aT1swSsmHs466yXi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aT1swSsmHs466yXi .cluster-label text{fill:#333;}#mermaid-svg-aT1swSsmHs466yXi .cluster-label span{color:#333;}#mermaid-svg-aT1swSsmHs466yXi .cluster-label span p{background-color:transparent;}#mermaid-svg-aT1swSsmHs466yXi .label text,#mermaid-svg-aT1swSsmHs466yXi span{fill:#333;color:#333;}#mermaid-svg-aT1swSsmHs466yXi .node rect,#mermaid-svg-aT1swSsmHs466yXi .node circle,#mermaid-svg-aT1swSsmHs466yXi .node ellipse,#mermaid-svg-aT1swSsmHs466yXi .node polygon,#mermaid-svg-aT1swSsmHs466yXi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aT1swSsmHs466yXi .rough-node .label text,#mermaid-svg-aT1swSsmHs466yXi .node .label text,#mermaid-svg-aT1swSsmHs466yXi .image-shape .label,#mermaid-svg-aT1swSsmHs466yXi .icon-shape .label{text-anchor:middle;}#mermaid-svg-aT1swSsmHs466yXi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aT1swSsmHs466yXi .rough-node .label,#mermaid-svg-aT1swSsmHs466yXi .node .label,#mermaid-svg-aT1swSsmHs466yXi .image-shape .label,#mermaid-svg-aT1swSsmHs466yXi .icon-shape .label{text-align:center;}#mermaid-svg-aT1swSsmHs466yXi .node.clickable{cursor:pointer;}#mermaid-svg-aT1swSsmHs466yXi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aT1swSsmHs466yXi .arrowheadPath{fill:#333333;}#mermaid-svg-aT1swSsmHs466yXi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aT1swSsmHs466yXi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aT1swSsmHs466yXi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aT1swSsmHs466yXi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aT1swSsmHs466yXi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aT1swSsmHs466yXi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aT1swSsmHs466yXi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aT1swSsmHs466yXi .cluster text{fill:#333;}#mermaid-svg-aT1swSsmHs466yXi .cluster span{color:#333;}#mermaid-svg-aT1swSsmHs466yXi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aT1swSsmHs466yXi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aT1swSsmHs466yXi rect.text{fill:none;stroke-width:0;}#mermaid-svg-aT1swSsmHs466yXi .icon-shape,#mermaid-svg-aT1swSsmHs466yXi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aT1swSsmHs466yXi .icon-shape p,#mermaid-svg-aT1swSsmHs466yXi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aT1swSsmHs466yXi .icon-shape .label rect,#mermaid-svg-aT1swSsmHs466yXi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aT1swSsmHs466yXi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aT1swSsmHs466yXi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aT1swSsmHs466yXi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否





收到一笔交易证明
交易能否通过 Merkle 路径连接到区块头?
拒绝
该区块是否在最多工作量链上?
后面是否有足够确认?
等待更多确认
认为付款已确认

SPV 钱包最终关心的是:

  • 这笔交易是否被某个区块包含;
  • 这个区块是否属于最多工作量链;
  • 这个区块后面是否已经累积了足够多的确认。

六、确认数:为什么不是"进区块就万事大吉"

一笔交易被打包进区块后,通常被称为获得了 1 次确认 。如果这个区块后面又接上了 5 个新区块,那么这笔交易就有 6 次确认
#mermaid-svg-guDzU23H5W0JvuWJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-guDzU23H5W0JvuWJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-guDzU23H5W0JvuWJ .error-icon{fill:#552222;}#mermaid-svg-guDzU23H5W0JvuWJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-guDzU23H5W0JvuWJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-guDzU23H5W0JvuWJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-guDzU23H5W0JvuWJ .marker.cross{stroke:#333333;}#mermaid-svg-guDzU23H5W0JvuWJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-guDzU23H5W0JvuWJ p{margin:0;}#mermaid-svg-guDzU23H5W0JvuWJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-guDzU23H5W0JvuWJ .cluster-label text{fill:#333;}#mermaid-svg-guDzU23H5W0JvuWJ .cluster-label span{color:#333;}#mermaid-svg-guDzU23H5W0JvuWJ .cluster-label span p{background-color:transparent;}#mermaid-svg-guDzU23H5W0JvuWJ .label text,#mermaid-svg-guDzU23H5W0JvuWJ span{fill:#333;color:#333;}#mermaid-svg-guDzU23H5W0JvuWJ .node rect,#mermaid-svg-guDzU23H5W0JvuWJ .node circle,#mermaid-svg-guDzU23H5W0JvuWJ .node ellipse,#mermaid-svg-guDzU23H5W0JvuWJ .node polygon,#mermaid-svg-guDzU23H5W0JvuWJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-guDzU23H5W0JvuWJ .rough-node .label text,#mermaid-svg-guDzU23H5W0JvuWJ .node .label text,#mermaid-svg-guDzU23H5W0JvuWJ .image-shape .label,#mermaid-svg-guDzU23H5W0JvuWJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-guDzU23H5W0JvuWJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-guDzU23H5W0JvuWJ .rough-node .label,#mermaid-svg-guDzU23H5W0JvuWJ .node .label,#mermaid-svg-guDzU23H5W0JvuWJ .image-shape .label,#mermaid-svg-guDzU23H5W0JvuWJ .icon-shape .label{text-align:center;}#mermaid-svg-guDzU23H5W0JvuWJ .node.clickable{cursor:pointer;}#mermaid-svg-guDzU23H5W0JvuWJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-guDzU23H5W0JvuWJ .arrowheadPath{fill:#333333;}#mermaid-svg-guDzU23H5W0JvuWJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-guDzU23H5W0JvuWJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-guDzU23H5W0JvuWJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-guDzU23H5W0JvuWJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-guDzU23H5W0JvuWJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-guDzU23H5W0JvuWJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-guDzU23H5W0JvuWJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-guDzU23H5W0JvuWJ .cluster text{fill:#333;}#mermaid-svg-guDzU23H5W0JvuWJ .cluster span{color:#333;}#mermaid-svg-guDzU23H5W0JvuWJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-guDzU23H5W0JvuWJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-guDzU23H5W0JvuWJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-guDzU23H5W0JvuWJ .icon-shape,#mermaid-svg-guDzU23H5W0JvuWJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-guDzU23H5W0JvuWJ .icon-shape p,#mermaid-svg-guDzU23H5W0JvuWJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-guDzU23H5W0JvuWJ .icon-shape .label rect,#mermaid-svg-guDzU23H5W0JvuWJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-guDzU23H5W0JvuWJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-guDzU23H5W0JvuWJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-guDzU23H5W0JvuWJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 目标交易已有6次确认
区块100

包含目标交易
区块101
区块102
区块103
区块104
区块105
确认更深,回滚更难

确认数越多,攻击者想重组链、撤销这笔交易的成本越高。

SPV 客户端不能完全验证区块里的所有规则,所以它更依赖确认数来提高安全性。对于小额支付,用户可能接受较少确认;对于大额支付,通常需要等待更多确认。


七、SPV 能验证什么?

SPV 能验证的核心内容是:

SPV 能验证 说明
区块头 PoW 是否满足难度 可以检查区块头哈希
区块头是否连接成链 可以检查前一区块哈希
哪条区块头链累计工作量最多 可以比较工作量
某笔交易是否被包含在某个区块 通过 Merkle 证明
交易是否有足够确认数 通过后续区块头数量和工作量

所以,SPV 的安全性不是来自"相信某个服务器",而是来自:

区块头工作量 + Merkle 包含证明 + 多个确认。


八、SPV 不能验证什么?

SPV 的限制同样重要。

SPV 客户端通常不能独立验证:

SPV 不能完整验证 原因
区块内每笔交易是否合法 它没有下载完整区块
Coinbase 奖励是否超额 需要验证区块交易内容
是否存在复杂脚本违规 需要完整交易验证
某个输入此前是否已经被花费 需要 UTXO 集
节点是否隐瞒了相关交易 SPV 依赖网络对等节点返回信息

这意味着 SPV 的信任模型比全节点弱。

全节点的逻辑是:

text 复制代码
我自己验证所有规则,所以我知道这条链有效。

SPV 的逻辑更接近:

text 复制代码
我看到这笔交易被包含在最多工作量链中,所以在大多数算力诚实的假设下,它大概率有效。

这不是完全一样的安全级别。


九、SPV 的安全假设

SPV 的安全性依赖几个前提:

  1. 大多数算力遵守比特币共识规则;
  2. SPV 客户端能够连接到诚实节点;
  3. 攻击者不能长期隔离用户的网络连接;
  4. 用户等待了足够多的确认数。

如果攻击者能控制用户连接到的所有节点,就可能进行 Eclipse Attack(日食攻击),让用户看到一条被操纵的信息流。
#mermaid-svg-eToXRqy5Hd0DFfYn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eToXRqy5Hd0DFfYn .error-icon{fill:#552222;}#mermaid-svg-eToXRqy5Hd0DFfYn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eToXRqy5Hd0DFfYn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eToXRqy5Hd0DFfYn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eToXRqy5Hd0DFfYn .marker.cross{stroke:#333333;}#mermaid-svg-eToXRqy5Hd0DFfYn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eToXRqy5Hd0DFfYn p{margin:0;}#mermaid-svg-eToXRqy5Hd0DFfYn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster-label text{fill:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster-label span{color:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster-label span p{background-color:transparent;}#mermaid-svg-eToXRqy5Hd0DFfYn .label text,#mermaid-svg-eToXRqy5Hd0DFfYn span{fill:#333;color:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn .node rect,#mermaid-svg-eToXRqy5Hd0DFfYn .node circle,#mermaid-svg-eToXRqy5Hd0DFfYn .node ellipse,#mermaid-svg-eToXRqy5Hd0DFfYn .node polygon,#mermaid-svg-eToXRqy5Hd0DFfYn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eToXRqy5Hd0DFfYn .rough-node .label text,#mermaid-svg-eToXRqy5Hd0DFfYn .node .label text,#mermaid-svg-eToXRqy5Hd0DFfYn .image-shape .label,#mermaid-svg-eToXRqy5Hd0DFfYn .icon-shape .label{text-anchor:middle;}#mermaid-svg-eToXRqy5Hd0DFfYn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eToXRqy5Hd0DFfYn .rough-node .label,#mermaid-svg-eToXRqy5Hd0DFfYn .node .label,#mermaid-svg-eToXRqy5Hd0DFfYn .image-shape .label,#mermaid-svg-eToXRqy5Hd0DFfYn .icon-shape .label{text-align:center;}#mermaid-svg-eToXRqy5Hd0DFfYn .node.clickable{cursor:pointer;}#mermaid-svg-eToXRqy5Hd0DFfYn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eToXRqy5Hd0DFfYn .arrowheadPath{fill:#333333;}#mermaid-svg-eToXRqy5Hd0DFfYn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eToXRqy5Hd0DFfYn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eToXRqy5Hd0DFfYn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eToXRqy5Hd0DFfYn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eToXRqy5Hd0DFfYn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eToXRqy5Hd0DFfYn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster text{fill:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn .cluster span{color:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eToXRqy5Hd0DFfYn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eToXRqy5Hd0DFfYn rect.text{fill:none;stroke-width:0;}#mermaid-svg-eToXRqy5Hd0DFfYn .icon-shape,#mermaid-svg-eToXRqy5Hd0DFfYn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eToXRqy5Hd0DFfYn .icon-shape p,#mermaid-svg-eToXRqy5Hd0DFfYn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eToXRqy5Hd0DFfYn .icon-shape .label rect,#mermaid-svg-eToXRqy5Hd0DFfYn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eToXRqy5Hd0DFfYn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eToXRqy5Hd0DFfYn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eToXRqy5Hd0DFfYn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 被隔离
SPV 钱包
恶意节点 1
恶意节点 2
恶意节点 3
被操纵的网络视图
诚实比特币网络

因此,一个更安全的 SPV 钱包通常会:

  • 连接多个节点;
  • 验证区块头工作量;
  • 等待足够确认;
  • 避免只依赖单一服务器;
  • 尽量使用更强的隐私和过滤机制。

十、Bloom Filter 与 BIP37:早期 SPV 钱包如何查找交易

早期 SPV 钱包常使用一种叫 Bloom Filter 的机制向全节点查询相关交易。

钱包不会直接告诉节点"我要查我的地址",而是发送一个过滤器。节点用这个过滤器筛选可能相关的交易,再返回给钱包。
#mermaid-svg-icx9FwpR4xXXZF2m{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-icx9FwpR4xXXZF2m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-icx9FwpR4xXXZF2m .error-icon{fill:#552222;}#mermaid-svg-icx9FwpR4xXXZF2m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-icx9FwpR4xXXZF2m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-icx9FwpR4xXXZF2m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-icx9FwpR4xXXZF2m .marker.cross{stroke:#333333;}#mermaid-svg-icx9FwpR4xXXZF2m svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-icx9FwpR4xXXZF2m p{margin:0;}#mermaid-svg-icx9FwpR4xXXZF2m .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-icx9FwpR4xXXZF2m .cluster-label text{fill:#333;}#mermaid-svg-icx9FwpR4xXXZF2m .cluster-label span{color:#333;}#mermaid-svg-icx9FwpR4xXXZF2m .cluster-label span p{background-color:transparent;}#mermaid-svg-icx9FwpR4xXXZF2m .label text,#mermaid-svg-icx9FwpR4xXXZF2m span{fill:#333;color:#333;}#mermaid-svg-icx9FwpR4xXXZF2m .node rect,#mermaid-svg-icx9FwpR4xXXZF2m .node circle,#mermaid-svg-icx9FwpR4xXXZF2m .node ellipse,#mermaid-svg-icx9FwpR4xXXZF2m .node polygon,#mermaid-svg-icx9FwpR4xXXZF2m .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-icx9FwpR4xXXZF2m .rough-node .label text,#mermaid-svg-icx9FwpR4xXXZF2m .node .label text,#mermaid-svg-icx9FwpR4xXXZF2m .image-shape .label,#mermaid-svg-icx9FwpR4xXXZF2m .icon-shape .label{text-anchor:middle;}#mermaid-svg-icx9FwpR4xXXZF2m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-icx9FwpR4xXXZF2m .rough-node .label,#mermaid-svg-icx9FwpR4xXXZF2m .node .label,#mermaid-svg-icx9FwpR4xXXZF2m .image-shape .label,#mermaid-svg-icx9FwpR4xXXZF2m .icon-shape .label{text-align:center;}#mermaid-svg-icx9FwpR4xXXZF2m .node.clickable{cursor:pointer;}#mermaid-svg-icx9FwpR4xXXZF2m .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-icx9FwpR4xXXZF2m .arrowheadPath{fill:#333333;}#mermaid-svg-icx9FwpR4xXXZF2m .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-icx9FwpR4xXXZF2m .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-icx9FwpR4xXXZF2m .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-icx9FwpR4xXXZF2m .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-icx9FwpR4xXXZF2m .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-icx9FwpR4xXXZF2m .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-icx9FwpR4xXXZF2m .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-icx9FwpR4xXXZF2m .cluster text{fill:#333;}#mermaid-svg-icx9FwpR4xXXZF2m .cluster span{color:#333;}#mermaid-svg-icx9FwpR4xXXZF2m div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-icx9FwpR4xXXZF2m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-icx9FwpR4xXXZF2m rect.text{fill:none;stroke-width:0;}#mermaid-svg-icx9FwpR4xXXZF2m .icon-shape,#mermaid-svg-icx9FwpR4xXXZF2m .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-icx9FwpR4xXXZF2m .icon-shape p,#mermaid-svg-icx9FwpR4xXXZF2m .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-icx9FwpR4xXXZF2m .icon-shape .label rect,#mermaid-svg-icx9FwpR4xXXZF2m .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-icx9FwpR4xXXZF2m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-icx9FwpR4xXXZF2m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-icx9FwpR4xXXZF2m :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SPV 钱包
发送 Bloom Filter
全节点
筛选可能相关交易

这种方式的目标是减少隐私泄露,但实际效果并不完美。因为过滤器仍可能暴露用户地址之间的关联。

所以后来的钱包和协议逐渐探索更好的轻客户端方案,例如:

方案 思路
BIP37 Bloom Filter 钱包发送过滤器,让节点返回匹配交易
BIP157/158 Compact Block Filters 节点提供紧凑过滤器,钱包本地判断相关性
Electrum 类钱包 依赖专门服务器查询交易历史
Neutrino 使用紧凑区块过滤器改进轻客户端隐私和验证体验

这些方案本质上都在权衡三件事:

text 复制代码
安全性、隐私性、轻量化

十一、SPV 与全节点:不是替代关系,而是分层关系

SPV 不是要取代全节点。恰恰相反,SPV 的存在依赖全节点网络。
#mermaid-svg-6Jgr3aKDG1UMkJVS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6Jgr3aKDG1UMkJVS .error-icon{fill:#552222;}#mermaid-svg-6Jgr3aKDG1UMkJVS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6Jgr3aKDG1UMkJVS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .marker.cross{stroke:#333333;}#mermaid-svg-6Jgr3aKDG1UMkJVS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6Jgr3aKDG1UMkJVS p{margin:0;}#mermaid-svg-6Jgr3aKDG1UMkJVS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster-label text{fill:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster-label span{color:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster-label span p{background-color:transparent;}#mermaid-svg-6Jgr3aKDG1UMkJVS .label text,#mermaid-svg-6Jgr3aKDG1UMkJVS span{fill:#333;color:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .node rect,#mermaid-svg-6Jgr3aKDG1UMkJVS .node circle,#mermaid-svg-6Jgr3aKDG1UMkJVS .node ellipse,#mermaid-svg-6Jgr3aKDG1UMkJVS .node polygon,#mermaid-svg-6Jgr3aKDG1UMkJVS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .rough-node .label text,#mermaid-svg-6Jgr3aKDG1UMkJVS .node .label text,#mermaid-svg-6Jgr3aKDG1UMkJVS .image-shape .label,#mermaid-svg-6Jgr3aKDG1UMkJVS .icon-shape .label{text-anchor:middle;}#mermaid-svg-6Jgr3aKDG1UMkJVS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .rough-node .label,#mermaid-svg-6Jgr3aKDG1UMkJVS .node .label,#mermaid-svg-6Jgr3aKDG1UMkJVS .image-shape .label,#mermaid-svg-6Jgr3aKDG1UMkJVS .icon-shape .label{text-align:center;}#mermaid-svg-6Jgr3aKDG1UMkJVS .node.clickable{cursor:pointer;}#mermaid-svg-6Jgr3aKDG1UMkJVS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .arrowheadPath{fill:#333333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6Jgr3aKDG1UMkJVS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6Jgr3aKDG1UMkJVS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6Jgr3aKDG1UMkJVS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster text{fill:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS .cluster span{color:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6Jgr3aKDG1UMkJVS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6Jgr3aKDG1UMkJVS rect.text{fill:none;stroke-width:0;}#mermaid-svg-6Jgr3aKDG1UMkJVS .icon-shape,#mermaid-svg-6Jgr3aKDG1UMkJVS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6Jgr3aKDG1UMkJVS .icon-shape p,#mermaid-svg-6Jgr3aKDG1UMkJVS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6Jgr3aKDG1UMkJVS .icon-shape .label rect,#mermaid-svg-6Jgr3aKDG1UMkJVS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6Jgr3aKDG1UMkJVS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6Jgr3aKDG1UMkJVS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6Jgr3aKDG1UMkJVS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全节点网络
提供区块头
提供 Merkle 证明
广播交易
SPV 钱包
矿工
维护共识规则

如果网络中只有 SPV 节点,没有全节点,那么没人完整验证区块,整个系统的安全基础会被削弱。

因此,更准确的理解是:

  • 全节点维护系统规则;
  • 矿工竞争出块;
  • SPV 节点为普通用户提供轻量访问能力;
  • 钱包通过 SPV 获得便利,但安全性低于自己运行全节点。

十二、一个生活化类比:SPV 像查快递,不像审计仓库

可以用一个快递类比理解 SPV。

全节点像仓库审计员:

  • 检查每个包裹来源;
  • 检查每张单据;
  • 检查库存是否匹配;
  • 发现错误就拒绝入库。

SPV 钱包像收件人查快递:

  • 查看快递单号是否出现在物流系统;
  • 查看包裹是否已经经过多个中转站;
  • 但不会审计整个仓库的全部库存。

#mermaid-svg-JfsxTMUiJfCh1hiz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JfsxTMUiJfCh1hiz .error-icon{fill:#552222;}#mermaid-svg-JfsxTMUiJfCh1hiz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JfsxTMUiJfCh1hiz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JfsxTMUiJfCh1hiz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JfsxTMUiJfCh1hiz .marker.cross{stroke:#333333;}#mermaid-svg-JfsxTMUiJfCh1hiz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JfsxTMUiJfCh1hiz p{margin:0;}#mermaid-svg-JfsxTMUiJfCh1hiz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster-label text{fill:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster-label span{color:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster-label span p{background-color:transparent;}#mermaid-svg-JfsxTMUiJfCh1hiz .label text,#mermaid-svg-JfsxTMUiJfCh1hiz span{fill:#333;color:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz .node rect,#mermaid-svg-JfsxTMUiJfCh1hiz .node circle,#mermaid-svg-JfsxTMUiJfCh1hiz .node ellipse,#mermaid-svg-JfsxTMUiJfCh1hiz .node polygon,#mermaid-svg-JfsxTMUiJfCh1hiz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JfsxTMUiJfCh1hiz .rough-node .label text,#mermaid-svg-JfsxTMUiJfCh1hiz .node .label text,#mermaid-svg-JfsxTMUiJfCh1hiz .image-shape .label,#mermaid-svg-JfsxTMUiJfCh1hiz .icon-shape .label{text-anchor:middle;}#mermaid-svg-JfsxTMUiJfCh1hiz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JfsxTMUiJfCh1hiz .rough-node .label,#mermaid-svg-JfsxTMUiJfCh1hiz .node .label,#mermaid-svg-JfsxTMUiJfCh1hiz .image-shape .label,#mermaid-svg-JfsxTMUiJfCh1hiz .icon-shape .label{text-align:center;}#mermaid-svg-JfsxTMUiJfCh1hiz .node.clickable{cursor:pointer;}#mermaid-svg-JfsxTMUiJfCh1hiz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JfsxTMUiJfCh1hiz .arrowheadPath{fill:#333333;}#mermaid-svg-JfsxTMUiJfCh1hiz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JfsxTMUiJfCh1hiz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JfsxTMUiJfCh1hiz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JfsxTMUiJfCh1hiz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JfsxTMUiJfCh1hiz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JfsxTMUiJfCh1hiz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster text{fill:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz .cluster span{color:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JfsxTMUiJfCh1hiz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JfsxTMUiJfCh1hiz rect.text{fill:none;stroke-width:0;}#mermaid-svg-JfsxTMUiJfCh1hiz .icon-shape,#mermaid-svg-JfsxTMUiJfCh1hiz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JfsxTMUiJfCh1hiz .icon-shape p,#mermaid-svg-JfsxTMUiJfCh1hiz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JfsxTMUiJfCh1hiz .icon-shape .label rect,#mermaid-svg-JfsxTMUiJfCh1hiz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JfsxTMUiJfCh1hiz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JfsxTMUiJfCh1hiz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JfsxTMUiJfCh1hiz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全节点
审计完整账本
SPV 钱包
验证自己的交易是否被包含

这个类比说明了 SPV 的优势和限制:

它足够轻便,适合普通支付;但它不是完整审计,不等同于全节点安全性。


十三、SPV 的优点与缺点

维度 优点 缺点
存储 不需要保存完整区块链 依赖其他节点提供数据
带宽 只下载区块头和相关证明 查询过程可能泄露隐私
验证 可验证交易包含关系和确认数 不能完整验证区块合法性
使用体验 适合手机钱包和轻客户端 安全性弱于全节点
去中心化 降低普通用户接入门槛 不能替代全节点网络

十四、什么时候适合使用 SPV?

SPV 适合:

  • 手机钱包;
  • 小额日常支付;
  • 低存储设备;
  • 快速同步钱包;
  • 不方便运行全节点的普通用户。

不太适合:

  • 大额收款;
  • 交易所冷/热钱包核心验证;
  • 高安全要求的商户系统;
  • 希望完全自主验证的用户;
  • 需要最大隐私保护的使用场景。

如果你持有较大金额,或者需要最高级别的独立验证,最好使用自己的全节点,并让钱包连接到自己的节点。


十五、总结:SPV 的本质是什么?

SPV 的本质不是"跳过验证",而是"只验证与自己付款相关的最小必要证据"。

它验证的是:

text 复制代码
这笔交易是否被包含在某个区块中;
这个区块是否属于最多累计工作量链;
这笔交易之后是否已有足够确认。

它不验证的是:

text 复制代码
整个区块里的每一笔交易是否都合法;
整个 UTXO 集是否完全一致;
矿工是否在区块中做了所有共识层面的正确事情。

所以,SPV 的一句话总结是:

SPV 用区块头链证明"工作量",用 Merkle 证明证明"交易包含",用确认数降低"链重组风险";它牺牲一部分验证能力,换来了轻量化和易用性。

比特币系统之所以能同时支持全节点和 SPV 节点,是因为它的设计天然分层:

  • 底层由全节点和矿工维护共识;
  • 上层由钱包和轻客户端提供可用性;
  • 用户可以根据自己的安全需求,在便利和自主验证之间做选择。
相关推荐
酿情师2 小时前
比特币系统中是如何解决货币的发行与验证两大问题
区块链·比特币
liudanzhengxi2 小时前
ImToken智能合约交互避坑全攻略
区块链
拼尽全力前进3 小时前
比特币和以太坊的底层正是使用了 ECC(椭圆曲线加密)算法来生成钱包地址(公钥衍生)和签署交易(私钥签名) 解释说明
区块链
Cvmax5 小时前
接入 Hyperliquid API:从入门到下单
区块链
拼尽全力前进6 小时前
区块链知识
区块链
2501_927283588 小时前
堆垛机立体库:告别人工翻找与货物堆压
大数据·人工智能·低代码·自动化·区块链
MicroTech20258 小时前
微算法科技(NASDAQ :MLGO)推出量子零知识证明共识机制,筑牢区块链安全防线
科技·区块链·零知识证明
搞科研的小刘选手1 天前
【经管方向EI会议】第七届经济管理与大数据应用国际学术会议(ICEMBDA2026)
大数据·区块链·可视化·管理·供应链·经济·消费者行为
方向研究1 天前
IM吃贴水策略
区块链