比特幣隱私技術

比特幣隱私保護技術介紹

比特幣隱私技術深度解析

比特幣常被誤解為完全匿名,實際上比特幣區塊鏈是公開的,所有交易都可追蹤。本文深入解析比特幣隱私技術的原理,包括 CoinJoin、PayJoin、Taproot 等機制,幫助理解如何在比特幣網路中保護交易隱私。

比特幣隱私基本概念

區塊鏈可追蹤性

比特幣的設計本質上是偽匿名的,而非完全匿名:

比特幣交易追蹤鏈:

                    ┌─────────────┐
                    │ 交易所 KYC  │
                    │ (實名認證)  │
                    └──────┬──────┘
                           │ 存入
                           ▼
                    ┌─────────────┐
                    │  地址 A    │◄── 可追蹤到個人
                    │ (輸入 UTXO) │
                    └──────┬──────┘
                           │ 轉帳
                           ▼
                    ┌─────────────┐
                    │  地址 B    │
                    │ (混合後)   │
                    └──────┬──────┘
                           │ 轉帳
                           ▼
                    ┌─────────────┐
                    │  地址 C    │───► 區塊鏈分析公司
                    │ (輸出 UTXO) │      可識別關聯性
                    └─────────────┘

區塊鏈分析技術

區塊鏈分析公司使用多種技術追蹤比特幣:

技術描述對隱私的威脅
UTXO 追蹤追蹤每筆資金的來源
金額分析識別特殊金額模式
時間分析關聯交易時間模式
集群分析將地址歸類到同一實體
網路分析監控節點 IP 地址低-中

CoinJoin 機制

基本原理

CoinJoin 是一種將多個用戶的交易合併的技術,使得外部觀察者無法確定資金的流向:

傳統交易 vs CoinJoin:

傳統交易:
┌─────────────────────────────────────────┐
│  輸入:地址A (1.0 BTC)                  │
│  輸出:地址B (0.9 BTC) + 礦工費         │
│                                         │
│  清晰可追蹤:A → B                     │
└─────────────────────────────────────────┘

CoinJoin 交易:
┌─────────────────────────────────────────┐
│  輸入:                                  │
│    • 地址A (1.0 BTC)                    │
│    • 地址C (2.0 BTC)                    │
│    • 地址E (0.5 BTC)                    │
│                                         │
│  輸出:                                  │
│    • 地址B (0.9 BTC)                    │
│    • 地址D (1.9 BTC)                    │
│    • 地址F (0.4 BTC)                    │
│    • 礦工費                            │
│                                         │
│  不可追蹤:誰是誰的輸入?               │
└─────────────────────────────────────────┘

實現方式

Wasabi Wallet CoinJoin

Wasabi Wallet 實現了 Chaumian CoinJoin:

class ChaumianCoinJoin:
    """
    Chaumian CoinJoin 實現
    協調者無法得知輸入輸出的對應關係
    """

    def __init__(self, coordinator):
        self.coordinator = coordinator
        self.participants = []
        self.round = 0

    def register_inputs(self, participant, input_utxo,_blinded_output):
        """
        參與者註冊輸入

        參數:
        - participant: 參與者公鑰
        - input_utxo: 要混合的 UTXO
        - blinded_output: 盲化的輸出地址
        """
        # 協調者只知道盲化後的輸出
        # 無法關聯輸入和輸出
        registration = {
            "participant": participant,
            "utxo": input_utxo,
            "blinded_output": blinded_output,
            "round": self.round
        }

        self.participants.append(registration)
        return registration

    def sign_inputs(self, participant, signatures):
        """
        簽名階段
        所有參與者共同簽署交易
        """
        for sig in signatures:
            if not self.verify_signature(sig):
                raise InvalidSignatureError()

        # 交易被簽名,可以廣播
        return True

    def reveal_outputs(self, participant):
        """
        揭示盲化的輸出
        只有在簽名完成後才揭示
        """
        # 這裡返回真正的輸出地址
        return self.get_unblinded_output(participant)

Samourai Wallet Whirlpool

Samourai 實現的 Whirlpool 方案:

Whirlpool 混合流程:

┌─────────────────────────────────────────────────────────────┐
│  準備階段                                               │
├─────────────────────────────────────────────────────────────┤
│                                                         │
│  1. 選擇 UTXO                                           │
│     • 必須是未確認交易輸出                              │
│     • 金額必須符合 pool 規格                            │
│                                                         │
│  2. 註冊到協調者                                        │
│     • 連接 Tor 網路                                    │
│     • 獲取混合會話                                      │
│                                                         │
└─────────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│  混合階段                                               │
├─────────────────────────────────────────────────────────────┤
│                                                         │
│  3. 預備輸入                                            │
│     • 提供 UTXO 引用                                    │
│     • 提供盲化輸出                                      │
│                                                         │
│  4. 協調者收集足夠參與者                                │
│     • 通常 5 個參與者                                   │
│     • 構造混合交易                                     │
│                                                         │
│  5. 簽名與廣播                                          │
│     • 所有參與者簽名                                    │
│     • 協調者廣播交易                                   │
│                                                         │
└─────────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│  確認階段                                               │
├─────────────────────────────────────────────────────────────┤
│                                                         │
│  6. 等待確認                                            │
│     • 混合交易需要區塊確認                             │
│                                                         │
│  7. 後處理                                              │
│     • 輸出現在可以用於未來交易                          │
│     • 重複過程以提高隱私性                             │
│                                                         │
└─────────────────────────────────────────────────────────────┘

CoinJoin 金額選擇

預設金額池(Wasabi):

Pool 1:  0.001 BTC  (~$50)
Pool 2:  0.01 BTC   (~$500)
Pool 3:  0.1 BTC    (~$5,000)
Pool 4:  1.0 BTC    (~$50,000)

選擇較小的 pool 可以增加匿名集
但需要更多混合次數

PayJoin 機制

基本原理

PayJoin(又稱 Pay-to-End-Point,P2EP)是一種特殊的比特幣交易類型,交易的輸入和輸出都來自交易雙方,使得區塊鏈分析無法識別這是 CoinJoin:

傳統交易 vs PayJoin:

傳統交易:
┌─────────────────────────────────────────┐
│  輸入:只有付款方地址                   │
│  輸出:收款方地址 + 找零地址            │
│                                         │
│  可識別:這是普通轉帳                   │
└─────────────────────────────────────────┘

PayJoin 交易:
┌─────────────────────────────────────────┐
│  輸入:                                  │
│    • 付款方地址                         │
│    • 收款方地址(也提供輸入)           │
│                                         │
│  輸出:                                  │
│    • 收款方實際收到的金額              │
│    • 付款方獲得的找零                  │
│                                         │
│  外觀:無法區分是 CoinJoin 還是         │
│        普通交易                         │
└─────────────────────────────────────────┘

實現流程

class PayJoin:
    """
    PayJoin 實現
    允許收款方也貢獻輸入,改變交易外觀
    """

    def __init__(self, sender_wallet, receiver_wallet):
        self.sender = sender_wallet
        self.receiver = receiver_wallet

    def create_payjoin_proposal(self, send_amount, receiver_address):
        """
        創建 PayJoin 提案
        """
        # 1. 收款方提供其 UTXO
        receiver_inputs = self.receiver.get_spendable_utxos()

        # 2. 計算交易參數
        sender_input = self.sender.select_input(send_amount)
        change_address = self.sender.get_change_address()

        # 3. 構造交易
        # 輸入:sender_utxo + receiver_utxo
        # 輸出:send_amount to receiver + change to sender
        psbt = self.create_unsigned_psbt(
            inputs=[sender_input, *receiver_inputs],
            outputs={
                receiver_address: send_amount,
                change_address: self.calculate_change()
            }
        )

        # 4. 發送給收款方簽名
        return psbt

    def complete_payjoin(self, psbt):
        """
        完成 PayJoin
        """
        # 5. 收款方添加自己的輸入並簽名
        psbt = self.receiver.sign_psbt(psbt)

        # 6. 付款方簽名並廣播
        psbt = self.sender.sign_psbt(psbt)

        # 7. 廣播交易
        txid = self.broadcast(psbt)

        return txid

PayJoin 優勢

特性說明
隱私強化區塊鏈分析無法識別為特殊交易
金額模糊輸入金額不等於輸出金額
雙向混合同時完成付款和混合
合法外觀看起來像普通 P2P 交易

使用工具

支援 PayJoin 的錢包和工具:

腳本升級帶來的隱私改進

Taproot 隱私特性

Taproot 升級帶來了顯著的隱私改進:

Taproot 之前:
┌─────────────────────────────────────────┐
│  不同類型的腳本產生不同的地址            │
│                                         │
│  P2PKH:  1A1zP1eP5QGefi2DMPTfTL5SL... │
│  P2SH:   3J98t1WpEZ73CNmQviecrnyiW... │
│  P2WSH:  bc1qrp33g0q5c5txsp9arysrx4... │
│  P2WPKH: bc1qxy2kgdygjrsqtzq2n0yr...  │
│                                         │
│  區塊鏈分析可識別腳本類型               │
└─────────────────────────────────────────┘

Taproot 之後:
┌─────────────────────────────────────────┐
│  所有交易都使用相同的 bech32m 地址      │
│                                         │
│  P2TR:   bc1p0...                      │
│                                         │
│  複雜腳本與簡單腳本外觀相同             │
│  MAST 結構隱藏實際執行的腳本           │
└─────────────────────────────────────────┘

MAST 結構

Merkelized Abstract Syntax Tree (MAST) 允許隱藏未執行的腳本分支:

class MAST:
    """
    MAST 結構示例
    允許只揭示執行的腳本路徑
    """

    def __init__(self):
        self.merkle_root = None
        self.branches = {}

    def add_condition(self, path, script):
        """
        添加腳本條件

        參數:
        - path: 條件路徑
        - script: 腳本內容
        """
        script_hash = hash(script)
        self.branches[path] = {
            "script": script,
            "hash": script_hash
        }

        # 計算 Merkle 根
        self.merkle_root = self.calculate_merkle_root()

    def create_spend_path(self, condition, witness):
        """
        創建花費見證

        只需要提供:
        1. 滿足的條件腳本
        2. 該腳本到根的路徑證明
        """
        return {
            "script": condition["script"],
            "proof": self.create_merkle_proof(
                condition["hash"],
                self.merkle_root
            ),
            "witness": witness
        }

    def verify_spend(self, spend_path):
        """
        驗證花費
        """
        # 1. 驗證 Merkle 證明
        if not self.verify_merkle_proof(
            spend_path["script"],
            spend_path["proof"],
            self.merkle_root
        ):
            return False

        # 2. 驗證腳本邏輯
        return self.execute_script(
            spend_path["script"],
            spend_path["witness"]
        )

閃電網路隱私

閃電網路提供了額外的隱私層:

閃電網路隱私特性:

1. 路由混淆
   ┌─────────────────────────────────────────┐
   │  節點 A → 節點 X → 節點 Y → 節點 B    │
   │        ↘︎ 節點 Z ↗︎                      │
   │                                         │
   │  節點只知道相鄰節點                      │
   │  不知道完整路徑                         │
   └─────────────────────────────────────────┘

2. HTLC 技術
   ┌─────────────────────────────────────────┐
   │  雜湊鎖定時間合約                       │
   │  • 接收方知道最終目的地                  │
   │  • 中間節點只知道下一跳                  │
   │  • 區塊鏈上只看到普通 HTLC 輸出         │
   └─────────────────────────────────────────┘

3. 陰影通道
   ┌─────────────────────────────────────────┐
   │  可選:隱藏通道金額                      │
   │  • 使用「陰影」金額發送                   │
   │  • 實際金額在通道內結算                  │
   └─────────────────────────────────────────┘

隱私實踐建議

風險分層

比特幣隱私風險分層:

高風險(需要強化隱私):
┌─────────────────────────────────────────┐
│  • 從交易所提取資金                      │
│  • 大額比特幣 持有                       │
│  • 商業交易                             │
│  • 已識別的地址                         │
│                                         │
│  建議:使用 CoinJoin + Tor              │
└─────────────────────────────────────────┘

中風險(適度隱私):
┌─────────────────────────────────────────┐
│  • 個人之間的小額交易                    │
│  • 已混合的資金                          │
│  • 不敏感的金額                         │
│                                         │
│  建議:使用新地址 + 避免地址 reuse       │
└─────────────────────────────────────────┘

低風險(基本隱私):
┌─────────────────────────────────────────┐
│  • 小額測試交易                          │
│  • 已經完全 混淆的資金                  │
│  • 捐贈等公開轉帳                       │
│                                         │
│  建議:使用 Taproot 地址                │
└─────────────────────────────────────────┘

工具選擇

工具隱私類型適合場景難度
Wasabi WalletCoinJoin日常隱私
Samourai WhirlpoolCoinJoin深度隱私
JoinMarket市場化混合專業用戶
PayJoin雙向混合P2P 交易
Lightning第二層隱私小額支付

錯誤避免

常見隱私錯誤:

1. 地址重複使用
   ❌ 每次交易使用相同地址
   ✓ 每筆交易使用新地址

2. 金額關聯
   ❌ 精確金額(如 1.23456789 BTC)
   ✓ 使用標準金額或增加隨機小數

3. 時間模式
   ❌ 固定時間交易
   ✓ 隨機化交易時間

4. IP 洩露
   ❌ 直接連接網路
   ✓ 使用 Tor 節點

5. 錢包指紋
   ❌ 使用默認設置
   ✓ 自定義錢包設置

法律合規性

隱私與合規的平衡

隱私 vs 合規框架:

┌─────────────────────────────────────────────────────────────┐
│                      隱私光譜                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  完全匿名 ◄─────────────────────────────► 完全透明        │
│                                                             │
│  隱私最大化          平衡點              合規優先           │
│       │                  │                   │              │
│       ▼                  ▼                   ▼              │
│  • CoinJoin         • 新地址            • 完整 KYC         │
│  • Tor             • Taproot           • 交易記錄         │
│  • 混淆路由         • 基礎隱私           • 申報義務         │
│                                                             │
│  注意:隱私不等於非法                                    │
│        隱私是基本金融權利                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

各地區規範

地區隱私工具態度說明
美國灰色地帶視具體工具和使用場景
歐盟有限允許MiCA 框架下有限合規
日本嚴格限制禁止混合服務
香港適度允許允許合規錢包
新加坡開放鼓勵合規創新

總結

比特幣隱私是一個多層次的技術和實踐問題:

  1. 理解基礎:比特幣區塊鏈是公開的,需要主動隱私保護
  1. 選擇工具:根據風險承受度選擇合適的隱私工具
  1. 實踐最佳化:避免常見錯誤,如地址重用、金額關聯
  1. 合規意識:隱私是權利,但在使用隱私工具時需了解當地法規

比特幣隱私技術持續演進,Taproot、PayJoin 等新技術正在降低隱私使用的門檻。


更新日期:2026-02-23

版本:1.0

本文包含

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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