Silent Payments 靜默支付
Silent Payments (BIP-352) 是一種隱私增強協議,允許接收者公開一個靜態地址,而每筆收到的付款都會發送到獨特的鏈上地址,無法被外部觀察者關聯。
地址重用問題
比特幣最佳實踐建議每個地址只使用一次。但這在實際操作中很困難:
- • 捐款地址:網站上公開的地址會收到多筆付款
- • 商家收款:需要為每個客戶生成新地址
- • 社交媒體:個人簡介中的比特幣地址
- • 名片/QR碼:印刷後無法更改
地址重用的風險:
- • 所有付款者可以看到該地址的完整交易歷史
- • 任何人可以追蹤該地址的餘額
- • 多筆付款可被關聯到同一個接收者
- • 嚴重損害發送者和接收者的隱私
Silent Payments 如何運作
Silent Payments 使用橢圓曲線 Diffie-Hellman (ECDH) 密鑰交換, 讓發送者為每筆付款計算一個唯一的輸出地址,而無需與接收者互動。
簡化流程
接收者公開靜態地址
Bob 公開他的 Silent Payment 地址(sp1q...)
發送者計算唯一地址
Alice 用她的私鑰和 Bob 的公鑰進行 ECDH
付款發送到派生地址
輸出發送到只有 Bob 能花費的唯一 Taproot 地址
接收者掃描並識別
Bob 掃描區塊鏈,識別屬於他的付款
密碼學原理
接收者設置
# 接收者生成兩對密鑰
掃描密鑰:(b_scan, B_scan = b_scan·G)
花費密鑰:(b_spend, B_spend = b_spend·G)
# Silent Payment 地址包含兩個公鑰
SP 地址 = Bech32m(B_scan || B_spend)
發送流程
# 發送者有輸入私鑰 a(來自 UTXO)
A = a·G (輸入的公鑰)
# ECDH 共享密鑰
shared_secret = SHA256(a·B_scan || A)
# 計算輸出公鑰
P_output = B_spend + SHA256(shared_secret)·G
# 發送到 Taproot 地址
輸出地址 = P2TR(P_output)
接收者掃描
# 對每筆交易,接收者用掃描密鑰計算
shared_secret = SHA256(b_scan·A || A)
# 檢查輸出是否匹配
expected_P = B_spend + SHA256(shared_secret)·G
if output_pubkey == expected_P:
# 這筆付款是給我的!
# 計算花費私鑰
p_output = b_spend + SHA256(shared_secret)
地址格式
Silent Payment 地址使用 Bech32m 編碼,以 sp1q 開頭:
# 主網 Silent Payment 地址
sp1qqgste7k9hx0qftg6qmwlkqtwuy6cycyavzmzj85c6qdfhjdpdjtdgq7c2zfthc7ugp6h3mdfhs6sxnc9vjkxunqmgqsy
| 網路 | 前綴 | HRP |
|---|---|---|
| 主網 | sp1q... | sp |
| 測試網 | tsp1q... | tsp |
| Signet | tsp1q... | tsp |
標籤功能
Silent Payments 支援標籤(Labels),允許接收者區分不同來源的付款:
標籤用途
- • 商家:為每個客戶生成帶標籤的地址
- • 個人:區分薪資、投資、禮物等來源
- • 組織:為不同部門或活動使用不同標籤
# 帶標籤的地址派生
label = SHA256("label" || b_scan || m)
B_m = B_spend + label·G
# m 是標籤編號(0, 1, 2, ...)
與其他方案比較
| 特性 | 普通地址 | BIP-47 PayNym | Silent Payments |
|---|---|---|---|
| 需要互動 | 每次 | 首次 | 從不 |
| 鏈上足跡 | 無額外 | 通知交易 | 無額外 |
| 地址重用風險 | 高 | 無 | 無 |
| 掃描成本 | 無 | 低 | 中等 |
| 輕客戶端支援 | 簡單 | 簡單 | 需要額外數據 |
掃描效率
接收者需要掃描區塊鏈來識別付款。這是 Silent Payments 的主要權衡:
掃描優化
- ✓ 只掃描 Taproot 輸出:減少檢查範圍
- ✓ Tweaked 公鑰索引:全節點可預計算
- ✓ 輕客戶端過濾器:BIP-158 擴展
- ✓ 批量掃描:多個輸入可合併計算
掃描成本: 接收者每筆交易需要執行約 1 次橢圓曲線乘法。 對於每天 300,000 筆交易的區塊鏈,現代硬體可以在幾秒內完成掃描。
發送者要求
Silent Payments 對發送者有特定要求:
- ! 必須使用支援的輸入類型(P2PKH、P2WPKH、P2TR)
- ! 需要存取輸入的私鑰(無法使用 watch-only 錢包發送)
- ! 多簽錢包需要特殊處理
隱私特性
無地址重用
每筆付款使用唯一地址
無鏈上關聯
不同付款的輸出地址無法被關聯
與 Taproot 相同外觀
輸出看起來像普通 Taproot 交易
無需信任第三方
不依賴中心化服務
限制與權衡
- ✗ 掃描開銷:接收者需要掃描所有交易
- ✗ 輕客戶端複雜:需要額外基礎設施支援
- ✗ 發送者限制:需要私鑰參與計算
- ✗ 僅限 Taproot:輸出只能是 P2TR 類型
錢包支援
BIP-352 規範
BIP-352 定義了 Silent Payments 的完整規範,包括:
- • 地址格式和編碼
- • 密鑰派生和共享密鑰計算
- • 輸出生成和掃描演算法
- • 標籤系統
- • 輕客戶端支援
- • 多輸入處理
相關資源
- • Taproot 升級
- • Schnorr 簽章
- • 地址類型
延伸閱讀: 查看 BIP-352 完整規範 和 Silent Payments 資源網站