
SPV,全称是 Simplified Payment Verification,即"简化支付验证"。它是比特币白皮书中提出的一种轻量级验证方式,目标是让用户不必下载和验证完整区块链,也能确认一笔交易是否已经被比特币网络接受。
在比特币系统中,全节点会下载完整区块、验证每笔交易和每条共识规则。但普通手机钱包、浏览器钱包或轻量客户端,往往没有足够的存储、带宽和算力运行完整节点。
SPV 就是在这个背景下出现的。
它回答的问题是:
如果我不保存完整区块链,能不能仍然相对可靠地知道一笔交易已经被确认?
答案是:可以,但前提是你理解它的能力边界。
一、为什么需要 SPV?
运行一个比特币全节点,需要完成很多工作:
| 项目 | 全节点需要做什么 |
|---|---|
| 下载数据 | 下载完整区块数据 |
| 验证交易 | 检查所有交易签名、UTXO、金额和脚本 |
| 验证区块 | 检查 PoW、区块奖励、难度、时间戳等 |
| 保存账本 | 维护完整或裁剪后的 UTXO 集 |
| 独立判断 | 不依赖第三方判断哪条链有效 |
这对服务器来说可以接受,但对手机钱包来说就比较重。
SPV 的设计目标是降低客户端负担:
| 项目 | SPV 客户端如何处理 |
|---|---|
| 是否下载完整区块? | 不下载 |
| 是否保存所有交易? | 不保存 |
| 是否验证所有交易? | 不验证 |
| 是否下载区块头? | 下载 |
| 是否验证 PoW 链? | 验证区块头工作量 |
| 是否验证目标交易被打包? | 通过 Merkle 证明验证 |
SPV 的核心思路是:
只下载区块头,而不是下载完整区块;只验证某笔交易是否被包含在某个区块中,而不是验证整个区块里所有交易是否合法。
二、全节点和 SPV 节点的区别
比特币区块由两部分组成:
- 区块头(Block Header)
- 区块体(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 客户端会下载区块头,并检查:
- 每个区块头是否正确引用前一个区块;
- 每个区块头的哈希是否满足难度目标;
- 哪条区块头链拥有最多累计工作量。
这样,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 客户端会做三步检查:
- 对目标交易计算交易哈希;
- 使用对方提供的兄弟哈希,逐层计算到 Merkle Root;
- 比较计算出的 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 的安全性依赖几个前提:
- 大多数算力遵守比特币共识规则;
- SPV 客户端能够连接到诚实节点;
- 攻击者不能长期隔离用户的网络连接;
- 用户等待了足够多的确认数。
如果攻击者能控制用户连接到的所有节点,就可能进行 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 节点,是因为它的设计天然分层:
- 底层由全节点和矿工维护共识;
- 上层由钱包和轻客户端提供可用性;
- 用户可以根据自己的安全需求,在便利和自主验证之间做选择。