跳至主要內容
高級

MuSig2 多方簽名

了解 MuSig2 多方 Schnorr 簽名協議,以及在 Taproot 閃電通道中的應用。

12 分鐘

什麼是 MuSig2?

MuSig2 是一個多方 Schnorr 簽名協議,允許多個參與者共同創建一個看起來 像普通單簽的簽名。這對閃電網路的隱私和效率都有重大意義。

兩輪協議: MuSig2 只需要兩輪通訊即可完成簽名,相比 MuSig(三輪)更高效, 同時保持相同的安全性。

Schnorr vs ECDSA

簽名方案比較:

ECDSA(傳統閃電通道):

2-of-2 多簽:OP_CHECKMULTISIG

輸入腳本需要:
• 兩個完整簽名
• 兩個公鑰
• 可見是 2-of-2 多簽

問題:
• 較大的交易大小
• 隱私較差(明顯是多簽)
• 無法進行公鑰聚合

Schnorr + MuSig2(Taproot 通道):

聚合公鑰:看起來像單個公鑰
聚合簽名:看起來像單個簽名

優點:
• 較小的交易大小
• 更好的隱私(與單簽無法區分)
• 更低的費用
• 支援批量驗證

MuSig2 協議流程

MuSig2 Signing Flow (Two Rounds):

Setup Phase (One-time):

Participant A: Public Key P_A
Participant B: Public Key P_B

Key Aggregation:
P_agg = KeyAgg(P_A, P_B)
      = a_A * P_A + a_B * P_B

Where a_i = H(L || P_i)
L = H(P_1 || P_2 || ...)

Result: Single aggregated public key for Taproot address

Round 1: Nonce Exchange

  Participant A                    Participant B
      |                                 |
      | Generate nonce:                 | Generate nonce:
      | (r_A1, r_A2, R_A1, R_A2)        | (r_B1, r_B2, R_B1, R_B2)
      |                                 |
      |---- R_A1, R_A2 ---------------->|
      |<--- R_B1, R_B2 -----------------|
      |                                 |
      | Compute aggregate nonce:        | Compute aggregate nonce:
      | R = R_1 + b * R_2               | R = R_1 + b * R_2
      | where R_i = R_Ai + R_Bi         |
      | b = H(R_1 || R_2 || P || m)     |

Round 2: Partial Signatures

  Participant A                    Participant B
      |                                 |
      | Compute challenge:              |
      | e = H(R || P_agg || m)          |
      |                                 |
      | Generate partial sig:           | Generate partial sig:
      | s_A = r_A + b*r_A2              | s_B = r_B + b*r_B2
      |     + e * a_A * x_A             |     + e * a_B * x_B
      |                                 |
      |---- s_A ----------------------->|
      |<--- s_B ------------------------|
      |                                 |
      | Aggregate signature:            |
      | s = s_A + s_B                   |
      | Final signature: (R, s)         |

在閃電通道中的應用

Taproot 通道使用 MuSig2:

注資輸出:

傳統:P2WSH 2-of-2 多簽
OP_2 <pubkey_A> <pubkey_B> OP_2 OP_CHECKMULTISIG

Taproot:P2TR 聚合公鑰
• 內部公鑰:MuSig2(P_A, P_B)
• Taptweak:H(P_agg || script_root)

結果:看起來完全像普通 P2TR 地址

協商關閉:

使用 key path 花費:
• 雙方交換 nonce
• 雙方生成部分簽名
• 聚合成最終簽名
• 廣播交易

鏈上看起來:普通的單簽 P2TR 花費
無法區分是通道關閉還是普通轉帳

強制關閉:

使用 script path 花費:
• 揭露 Tapscript
• 提供滿足條件的見證
• 這時才暴露是閃電通道

但仍比傳統 2-of-2 更隱私

Nonce 安全性

Nonce 處理的關鍵安全考量:

為什麼使用兩個 nonce(MuSig2 改進):

MuSig(原版)問題:
• 需要三輪通訊
• 第一輪提交 nonce 哈希
• 第二輪揭露 nonce
• 第三輪簽名

MuSig2 解決方案:
• 使用兩個隨機 nonce(R_1, R_2)
• 綁定係數 b 由所有 nonce 計算
• 有效 nonce:R = R_1 + b * R_2
• 防止 rogue-key 攻擊

Nonce 重用危險:

[!] 永遠不要重用 nonce!

如果 nonce 重用:
s_1 = r + e_1 * x
s_2 = r + e_2 * x

攻擊者可以計算:
x = (s_1 - s_2) / (e_1 - e_2)

-> 私鑰完全暴露!

安全實現:
• 使用密碼學安全隨機數生成器
• 每次簽名生成新的 nonce 對
• 考慮使用確定性 nonce 生成(RFC 6979 變體)
• 永不持久化未使用的 nonce

實現挑戰

狀態管理

需要在兩輪之間保存 nonce 狀態。 必須確保狀態正確清理,避免 nonce 重用。

通訊協調

雙方必須同步交換 nonce 和部分簽名。 需要處理通訊失敗和重試。

備份複雜性

MuSig2 簽名需要雙方合作。 單方無法獨立重建簽名。

適配器簽名

PTLCs 需要 MuSig2 與適配器簽名結合, 增加了實現複雜度。

實現狀態

各實現的 MuSig2 支援:

LND:
[Y] Simple Taproot Channels 已實現
[Y] 使用 btcd/btcec 的 MuSig2 實現
[Y] 主網已啟用

LDK:
[Y] MuSig2 庫支援
[~] Taproot 通道開發中

Core Lightning:
[~] 開發中
[ ] 尚未發布

庫支援:
• libsecp256k1-zkp:參考實現
• btcd/btcec:Go 實現
• rust-secp256k1:Rust 綁定
• secp256k1-py:Python 綁定

升級路徑: 現有通道無法直接升級到 MuSig2。需要關閉舊通道並開設新的 Taproot 通道。 Splicing 可能在未來提供更平滑的升級路徑。

相關資源

下一步: 了解 PTLCs 如何結合 MuSig2 和適配器簽名。

已複製連結
已複製到剪貼簿