比特幣隱私支付完全指南:Silent Payments 原理解析與實作攻略

完整解析比特幣 Silent Payments(BIP-352)的原理與實作。涵蓋問題背景與解決方案、密碼學原理(shared secret、diversifier、一次性地址計算)、當前實現狀態與工具鍊、適用場景分析、與 BIP-47/CoinJoin/PayJoin 的比較、以及開發者集成指南。提供真實代碼範例與風險評估。

比特幣隱私支付完全指南:Silent Payments 原理解析與實作攻略

最近跟朋友聊比特幣隱私,他問我:「有沒有一種方案,別人給我轉比特幣,我只需要告訴對方一個地址,然後對方壓根不知道我其他的錢包地址?」

我說有啊,Silent Payments(靜音支付)。他說這名字很酷,具體怎麼回事?

這篇文章就來跟你好好聊聊 Silent Payments——這個名字確實很酷,而且背後的密碼學原理也挺優雅的。雖然目前還不是比特幣的主流功能,但潛力很大。

先說個醜話:Silent Payments 目前還處於早期階段,相關工具還不夠成熟。如果你只是想保護隱私,現在更靠譜的方案是 Taproot 地址 + 一次性使用 + 避免 KYC 入口。Silent Payments 適合技術能力較強、願意折騰的用戶。


第一章:Silent Payments 是什麼?

1.1 問題的提出

比特幣的隱私有個根本性的問題:地址重用(Address Reuse)

傳統的比特幣地址(尤其是 P2PKH 和 P2SH)一旦用過,區塊鏈上就會留下痕跡。聰明的分析師可以:

聰明如你,可能會想:我用完一個地址就生成新地址不就行了?對,這是標準做法。但問題來了:

當別人給你轉帳時,他需要知道你新的接收地址

你告訴他地址 A,他轉帳到 A。你換了地址 B,你需要告訴他 B。這就有幾個問題:

  1. 你需要跟對方溝通「我的新地址」
  2. 如果你經常換地址,溝通成本很高
  3. 對話記錄可能暴露你們的關係

有沒有辦法,讓別人只需要知道你「的一個固定地址」,就能往你「任意多個一次性地址」轉帳,而且區塊鏈上看不出來這些地址是關聯的?

這就是 Silent Payments 要解決的問題。

1.2 解決方案

Silent Payments 的核心思想很巧妙:

  1. 你公開一個 Silent Payment Address(SPA),這是一個特殊的 Taproot 地址
  2. 別人轉帳時,用 SPA 和他自己的私鑰,計算出一個「一次性」的收款地址
  3. 你只需要保管自己的私鑰,就能從所有發送給你的轉帳中「解出」屬於你的比特幣
傳統模式:
Alice 知道 Bob 的地址 A → Bob 的比特幣在地址 A
問題:Bob 如果換地址,Alice 不知道

Silent Payments 模式:
Alice 知道 Bob 的 SPA → Alice 計算出一次性地址 X → Bob 的比特幣在地址 X
Bob 用私鑰從地址 X 取走比特幣
問題:無(地址 X 只有 Bob 能識別,其他人是看不出來是給 Bob 的)

這個方案的優點

這個方案的缺點


第二章:密碼學原理

2.1 必要的背景知識

在深入 Silent Payments 的密碼學之前,你需要了解以下概念:

橢圓曲線密碼學(ECC)

比特幣使用 secp256k1 曲線。給定一個私鑰 d,可以計算出公鑰 P = d × G。但給定 P,無法反推出 d(離散對數問題)。

Schnorr 簽名

Taproot 使用的新簽名算法。相較於 ECDSA,Schnorr 簽名有兩個優點:

Taproot 地址

Taproot 是比特幣 2021 年的升級。Taproot 地址以 bc1p 開頭(原生隔離見證)或 bc1q 開頭(P2TR)。地址中編碼了:

2.2 Silent Payments 的密碼學構造

Silent Payments 的核心是 BIP-352 提案。讓我一步步拆解它的原理。

第一步:接收方生成 SPA

接收方(Bob)要公開一個 Silent Payment Address。需要:

  1. Bob 有主私鑰 d_main
  2. Bob 計算主公鑰 P_main = d_main × G
  3. Bob 生成一個「掃描私鑰」d_scan(可以選擇 d_scan = d_main,也可以是獨立的)
  4. Bob 計算掃描公鑰 P_scan = d_scan × G
  5. Bob 把 P_mainP_scan 組合成 SPA

具體的地址計算比較複雜,涉及:

SPA 生成公式(簡化):

Shared Secret = d_scan × P_main
             = d_main × P_scan(橢圓曲線乘法交換律)
            
Silent Payment Key = SHA256(Shared Secret) × G + P_main

為什麼叫「Silent」?

因為發送方在計算收款地址時,沒有和接收方有任何「交互」。就像發送了一封「靜音」的轉帳指令,對方在接收端「監聽」到這筆轉帳。

第二步:發送方計算一次性地址

發送方(Alice)只知道 Bob 的 SPA,現在要往 Bob 轉帳。需要:

  1. Alice 讀取區塊鏈上所有使用過 Bob SPA 的交易
  2. 對每筆交易,計算「干擾值(Diversifier)」:
   diversifier_i = HMAC-SHA256("diversifier", tx_output_i)
  1. 對每個干擾值,計算 Alice 的「貢獻」:
   alice_contribution_i = d_alice × P_scan_i
  1. 結合干擾值和 Alice 的貢獻,計算一次性收款地址

這個計算比較複雜,我直接給你實例

# Silent Payments 地址計算(概念代碼,非實際可用)

def calculate_silent_payment_address(
    silent_payment_pubkey: bytes,  # Bob 的 SPA 公鑰
    sender_privkey: bytes,          # Alice 的私鑰
    previous_txid: bytes,          # 之前的某筆交易 ID
    output_index: int              # 之前的輸出索引
) -> str:
    # Step 1: 計算干擾值
    h = HMAC.new(
        key=b"diversifier",
        msg=previous_txid + bytes([output_index]),
        digestmod=hashlib.sha256
    )
    diversifier = h.digest()
    
    # Step 2: 用干擾值調整發送方的私鑰
    tweak = int.from_bytes(diversifier, "big") % curve_order
    tweaked_privkey = (int.from_bytes(sender_privkey, "big") + tweak) % curve_order
    
    # Step 3: 用調整後的私鑰計算一次性公鑰
    sender_pubkey = tweaked_privkey * curve_generator
    
    # Step 4: 計算最終的收款地址
    final_pubkey = sender_pubkey + silent_payment_pubkey
    
    # Step 5: 編碼成 Taproot 地址
    return encode_taproot_address(final_pubkey)

關鍵洞察:這段代碼的核心是 final_pubkey = sender_pubkey + silent_payment_pubkey。Alice 往最終地址轉帳時,相當於:

第三步:接收方識別轉帳

Bob 的錢包需要「監聽」區塊鏈。具體做法:

  1. Bob 的錢包軟體持續監控區塊鏈
  2. 對於每筆新交易,錢包嘗試用掃描私鑰解密
  3. 如果解密成功,說明這筆交易是發送給 Bob 的
  4. 錢包計算出一次性私鑰,可以花費這筆比特幣
識別邏輯:

Alice 的一次性地址 = Alice_adjusted_pubkey + Bob_main_pubkey
Bob 的識別:Bob 用 d_scan(掃描私鑰)和 P_alice(Alice 的一次性公鑰)

Shared Secret = d_scan × P_alice
Bob 可以用 Shared Secret 恢復出與 Alice 共享的秘密
然後計算出一次性私鑰

2.3 為什麼 Silent Payments 是安全的?

你可能會問:這個方案有沒有安全漏洞?

安全性分析 1:隱私

攻擊者( Mallory)看到區塊鏈上的 Silent Payments 交易:

這是因為:每個一次性地址都摻入了「干擾值」,而干擾值是從之前的交易 ID 和輸出索引計算出來的。這些交易可能屬於完全不相關的轉帳。

安全性分析 2:盜竊

Mallory 能不能偷走那些發送給 Bob 的比特幣?

她需要計算一次性私鑰。要做到這一點,她需要:

Mallory 沒有 Alice 的私鑰,也沒有 Bob 的掃描私鑰。所以她無法盜竊。

安全性分析 3:雙花

Mallory 能不能對 Silent Payments 交易發動雙花?

不能。因為:


第三章:實作現況

3.1 BIP-352 提案狀態

Silent Payments 的正式名稱是 BIP-352(Pay-to-Contract with Scoped Tags)。

截至 2026 年 Q1,BIP-352 仍然是 Draft(草案) 狀態,尚未激活。

連結:https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki

提案作者

3.2 現有實現

開源項目

  1. Rust Bitcoin(比特幣 Rust 開發庫)

連結:https://github.com/rust-bitcoin/rust-bitcoin

狀態:支持 BIP-352 基本功能

用途:開發者集成

  1. btcpay/silent payments

連結:https://github.com/btcpay/silentpayments

狀態:Python 實現,正在測試

用途:商家集成

  1. Blockstream 的 silent payments 實現

連結:https://github.com/Blockstream/electrumx/blob/master/docs/SILENTPAYMENTS.md

狀態:Electrum 錢包服務端支持

用途:錢包用戶

  1. Bitcoin Core PR #27207

連結:https://github.com/bitcoin/bitcoin/pull/27207

狀態:等待合併

用途:Bitcoin Core 原生支持

錢包支持

錢包Silent Payments 狀態備註
Electrum開發中服務端支持,錢包還在開發
Sparrow規劃中官方表示會支持
BlueWallet評估中尚未實現
Samourai評估中考慮支持
Wasabi評估中優先實現 BIP-47

交易所支持

目前還沒有主流交易所支持 Silent Payments 存款。這是因為交易所需要升級錢包軟體,而且需要重新設計地址管理邏輯。

3.3 使用流程(當前階段)

如果你想體驗 Silent Payments,目前的方式是:

作為接收方

  1. 下載支持 BIP-352 的錢包(如 Electrum 的測試版本)
  2. 生成一個 Silent Payment Address
  3. 把這個地址分享給別人

作為發送方

  1. 錢包軟體需要升級支持 BIP-352
  2. 軟體會掃描區塊鏈上所有使用過該 SPA 的歷史交易
  3. 用歷史交易的干擾值計算一次性收款地址
  4. 創建並廣播交易

注意:這個過程需要軟體自動處理,用戶體驗和普通轉帳類似。


第四章:使用場景與案例

4.1 最適合的場景

Silent Payments 最適合以下場景:

場景一:公開捐贈地址

比特幣領域有很多接受捐贈的項目和個人:

這些機構通常會公開一個比特幣地址接受捐贈。但一旦公開,區塊鏈上就能追蹤所有捐贈記錄,分析師可能識別出捐贈者的身份。

使用 Silent Payments:

場景二:接水管式轉帳(Plumbing)

有時候你需要「洗幣」——把從某個來源來的比特幣,轉移到一個乾淨的地址池。

傳統做法是:

  1. 生成一批乾淨地址
  2. 手動把比特幣分批轉到這些地址
  3. 這個過程比較繁瑣,而且如果你只有一個錢包,會很麻煩

Silent Payments 可以簡化這個流程:

場景三:企業級支付

企業使用比特幣時,需要:

Silent Payments 允許企業:

4.2 不適合的場景

場景一:交易所存款

目前交易所不支持 Silent Payments 存款。如果你想把比特幣存到交易所,不要用 Silent Payments。

場景二:需要鏈上記錄的場景

有些場合需要保存「這筆錢是從哪裡來的」的記錄。比如:

Silent Payments 天然沒有這種記錄功能(這是隱私的代價)。

場景三:小額高頻支付

Silent Payments 的地址計算涉及掃描歷史交易,這個過程:

所以 micropayment 場景可能不太適合。


第五章:實作教程

5.1 開發者指南

如果你是一個開發者,想在自己的應用中集成 Silent Payments,以下是基本步驟:

使用 Rust Bitcoin 庫

use bitcoin::{Address, Network, PrivateKey};
use bitcoin::silent_payments::{SilentPaymentAddress, Sender};

fn main() {
    // 接收方:生成 Silent Payment Address
    let receiver_privkey = PrivateKey::from_slice(
        &hex::decode("YOUR_PRIVATE_KEY").unwrap(),
        Network::Bitcoin
    ).unwrap();
    
    let spa = SilentPaymentAddress::new(
        receiver_privkey.public_key()
    );
    
    println!("Silent Payment Address: {}", spa.to_string());
    
    // 發送方:創建 Silent Payment 轉帳
    let sender_privkey = PrivateKey::from_slice(
        &hex::decode("SENDER_PRIVATE_KEY").unwrap(),
        Network::Bitcoin
    ).unwrap();
    
    // 讀取 SPA 的使用歷史
    let previous_outputs: Vec<(bip352::OutPoint, bip352::PublicKey)> = 
        fetch_silent_payment_history(&spa);
    
    let sender = Sender::new(
        sender_privkey,
        &spa,
        &previous_outputs
    ).unwrap();
    
    // 計算收款地址
    let output_script = sender.output_script();
    
    println!("一次性收款地址: {}", output_script);
}

Python 實現(btcpay/silentpayments):

from silentpayments import SilentPaymentWallet, generate_address

# 接收方
wallet = SilentPaymentWallet.from_mnemonic(
    "your twelve or twenty-four word mnemonic phrase"
)
silent_payment_address = wallet.generate_address()
print(f"SPA: {silent_payment_address}")

# 發送方
sender_address = generate_address(
    silent_payment_address=wallet.silent_payment_pubkey,
    sender_private_key="sender_private_key_hex",
    previous_outputs=[
        {"txid": "abc123...", "vout": 0},
        {"txid": "def456...", "vout": 1},
    ]
)
print(f"一次性地址: {sender_address}")

5.2 風險與限制

風險一:錢包安全性

Silent Payments 錢包需要處理更複雜的密鑰管理。如果軟體有 bug:

建議:只使用經過審計的開源錢包,不要使用來路不明的錢包。

風險二:私鑰管理

SPA 的私鑰丟失 = 所有歷史 Silent Payment 轉帳都無法恢復。

建議:嚴格遵守錢包備份流程,保存助記詞。

限制一:鏈上數據依賴

Silent Payments 的地址計算依賴於:

如果這些數據不完整,可能導致計算錯誤。

限制二:兼容性

Silent Payments 只能在 Taproot 地址之間使用。舊地址格式(P2PKH、P2SH、P2WPKH)不支持。


第六章:Silent Payments vs 其他隱私方案

6.1 vs BIP-47(重新隨機支付地址)

BIP-47 是另一個「一次性收款地址」提案。比較一下:

特性Silent PaymentsBIP-47
開發狀態BIP-352 DraftBIP-47 草案
兼容性Taproot only所有地址格式
鏈上足迹理論更少需要通知交易
錢包支持早期階段Samurai Wallet 支持
隱私強度
複雜度接收方計算量大發送方需要先通知

我的評價

BIP-47 已經存在多年,Samurai Wallet 是目前最成熟的實現。但 BIP-47 有個根本缺點:發送方需要先發一筆「通知交易」,這筆交易是公開的,讓區塊鏈分析師知道「這兩個地址可能有關聯」。

Silent Payments 避免了這個問題,但代價是接收方需要自己計算,一次性地址沒有被「提前建立」。

6.2 vs CoinJoin

CoinJoin 是把多筆交易「混合」,讓外部觀察者無法確定資金流向。

特性Silent PaymentsCoinJoin
目的隱藏收款方混淆資金流向
實現方式密碼學一次性地址多方共同簽名
費用普通交易費用額外混合費用
複雜度接收方計算需要協調者或參與者
隱私強度只隱藏收款方隱藏所有參與者

我的評價

Silent Payments 和 CoinJoin 是互補的,不是替代關係。你可以用 Silent Payments 來保護收款方隱私,同時用 CoinJoin 來混淆資金流向。

6.3 vs PayJoin

PayJoin 讓付款方和收款方共同創建交易,讓外部觀察者無法確定誰是付款方。

特性Silent PaymentsPayJoin
目的隱藏收款方隱藏付款方
實現方式密碼學一次性地址雙方共同輸入
場景收錢付款
商家支持極少很少

我的評價

Silent Payments 和 PayJoin 可以配合使用:


第七章:未來展望

7.1 發展路線圖

2026 年路線圖(樂觀估計)

長期展望

如果 BIP-352 成功激活,Silent Payments 可能成為比特幣隱私的標準配置。這將:

7.2 潛在的改進方向

方向一:聚合多個 SPA

用戶可能有多個設備,每個設備有自己的 SPA。未來的方案可能允許「聚合」這些 SPA,讓發送方只需要知道一個統一的識別符。

方向二:與 Lightning Network 結合

Silent Payments 的思想可能延伸到閃電網路。比如:

方向三:Layer 2 隱私增強

在 RGB(比特幣上的智能合約協議)或 Taro 資產協議中,可能會採用類似 Silent Payments 的思想,實現 Layer 2 的隱私保護。


結語

寫了這麼多,最後說幾句總結的話。

Silent Payments 是比特幣隱私領域的一個重要創新。它用巧妙的密碼學,解決了「如何在不暴露其他地址的情況下接收比特幣」這個根本問題。

但我必須提醒你:這項技術目前還不成熟。錢包支持很少,工具鏈不完善,風險也不夠明確。如果你只是想保護隱私,現在更靠譜的做法是:

  1. 使用 Taproot 地址
  2. 避免地址重用
  3. 使用 CoinJoin 或 PayJoin
  4. 從非 KYC 渠道獲得比特幣

Silent Payments 的未來是光明的,但道路是曲折的。如果你是一個技術愛好者,可以開始關注這個領域;如果你只是想安全地使用比特幣,等錢包支持更成熟再說也不遲。

隱私是一場馬拉松,不是短跑。慢慢來,別著急。


參考資源

官方 BIP

BIP-352:Silent Payments

連結:https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki

狀態:Draft

開源實現

Rust Bitcoin BIP-352 實現

連結:https://github.com/rust-bitcoin/rust-bitcoin

btcpay/silentpayments

連結:https://github.com/btcpay/silentpayments

Bitcoin Core PR #27207

連結:https://github.com/bitcoin/bitcoin/pull/27207

討論資源

Bitcoin Optech Silent Payments 主題

連結:https://bitcoinops.org/en/topics/silent-payments/

Bitcoin Wiki:Silent Payments

連結:https://en.bitcoin.it/wiki/Silent_Payment

相關 BIP

BIP-340:Schnorr 簽名

連結:https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki

BIP-341:Taproot

連結:https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki

BIP-47:重新隨機支付地址

連結:https://github.com/bitcoin/bips/blob/master/bip-0047.mediawiki


標籤:比特幣、隱私、Silent Payments、BIP-352、Taproot、一次性地址、隱私保護、比特幣密碼學

難度等級:高級

預估閱讀時間:50 分鐘

相關文章

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!