跳至主要內容
高級

MuSig2 多簽聚合詳解

MuSig2 是一個兩輪多簽協議,允許多個參與者共同產生一個與單一簽章無法區分的聚合簽章,提供極佳的隱私性和效率。

25 分鐘

為什麼需要 MuSig2?

傳統多簽的問題

傳統的 OP_CHECKMULTISIG 雖然功能強大,但有幾個明顯的缺點:

  • 隱私問題:鏈上暴露所有參與者的公鑰
  • 空間浪費:需要存儲 n 個公鑰和 m 個簽章
  • 費用高昂:更大的交易體積意味著更高的費用
  • 可追蹤性:多簽交易一眼可辨

2-of-3 多簽比較

傳統 P2SH 多簽

  • • 3 個公鑰(99 bytes)
  • • 2 個簽章(~144 bytes)
  • • OP_CHECKMULTISIG
  • 總計 ~250+ bytes

MuSig2 + Taproot

  • • 1 個聚合公鑰(32 bytes)
  • • 1 個聚合簽章(64 bytes)
  • • 看起來像單簽
  • 總計 96 bytes

MuSig 的演進

版本 輪數 特點 狀態
MuSig1 3 輪 需要 commitment 輪 已過時
MuSig2 2 輪 Nonce 可預生成 BIP-327
MuSig-DN 2 輪 確定性 nonce 研究中

密鑰聚合

MuSig2 的第一步是將所有參與者的公鑰聚合成單一公鑰。 但簡單的加法聚合是不安全的。

惡意密鑰攻擊

假設 Alice 和 Bob 想建立 2-of-2 多簽。如果簡單聚合 P = P_A + P_B, Bob 可以選擇 P_B = P_B' - P_A,則聚合公鑰變成 P_B',Bob 可以單獨花費。

攻擊示例:

Alice 公鑰:P_A

Bob 惡意公鑰:P_B = P_B' - P_A

聚合公鑰:P = P_A + P_B = P_A + P_B' - P_A = P_B'

Bob 現在可以用 x_B' 單獨簽署!

KeyAgg 演算法

MuSig2 使用係數來防止惡意密鑰攻擊:

# 密鑰聚合 KeyAgg

L = H("KeyAgg/list", P₁ || P₂ || ... || Pₙ)

a_i = H("KeyAgg/coef", L || Pᵢ)

P = a₁·P₁ + a₂·P₂ + ... + aₙ·Pₙ

每個公鑰都乘以一個取決於所有公鑰的係數。攻擊者無法在不知道其他人公鑰的情況下 選擇一個「抵消」的惡意公鑰,因為係數會隨之改變。

簽章協議

協議概覽

0

設置(一次性)

所有參與者交換公鑰,計算聚合公鑰 P

P = KeyAgg(P₁, P₂, ..., Pₙ)

1

第一輪:Nonce 交換

每個參與者生成兩對 nonce 並分享公開部分

r_i,1, r_i,2 ← 隨機

R_i,1 = r_i,1·G, R_i,2 = r_i,2·G

廣播 (R_i,1, R_i,2)

2

第二輪:部分簽章

收到所有 nonce 後,每個參與者計算部分簽章

b = H(R₁,₁||...||Rₙ,₂||P||m)

R = ∑(R_i,1 + b·R_i,2)

c = H(R||P||m)

s_i = r_i,1 + b·r_i,2 + c·a_i·x_i

聚合

聚合所有部分簽章得到最終簽章

s = s₁ + s₂ + ... + sₙ

最終簽章 σ = (R, s) 是標準 BIP-340 簽章

為什麼需要兩個 Nonce?

MuSig2 使用兩個 nonce 來防止 Wagner 攻擊。這種攻擊允許惡意參與者 在並發簽名會話中操控聚合 nonce,進而偽造簽章。

Nonce 組合

兩個 nonce 通過取決於消息的係數 b 組合:

r_eff = r₁ + b·r₂

R_eff = R₁ + b·R₂

由於 b 取決於消息,攻擊者無法預先計算有利的 nonce

Nonce 預生成

MuSig2 的一大優勢是允許在不知道消息的情況下預生成 nonce。 這對需要離線參與的場景非常有用。

應用場景:

  • • 硬體錢包可以預生成 nonce,減少互動次數
  • • 冷儲存可以批量準備 nonce
  • • 閃電網路可以預先準備承諾交易的 nonce

安全考量

Nonce 絕對不能重用

警告: 在 Schnorr/MuSig 中重用 nonce 會直接洩露私鑰!

# 如果用相同 nonce 簽署 m₁ 和 m₂:

s₁ = r + c₁·x

s₂ = r + c₂·x

# 攻擊者可以計算:

x = (s₁ - s₂) / (c₁ - c₂)

並發會話風險

同時運行多個簽名會話時需要特別小心。攻擊者可能試圖利用 不同會話之間的關聯來提取私鑰。BIP-327 建議限制並發會話數量。

部分簽章驗證

在聚合之前驗證每個部分簽章是重要的。惡意參與者可能提交無效的部分簽章, 導致最終簽章無效。

# 驗證部分簽章

s_i·G == R_i,1 + b·R_i,2 + c·a_i·P_i ?

與 FROST 比較

FROST 是另一個多簽方案,支持門限簽章(t-of-n)。

特性 MuSig2 FROST
門限類型 n-of-n t-of-n
通訊輪數 2 2
設置複雜度 簡單 需要 DKG
容錯 所有人必須在線 可容忍缺席
BIP 狀態 BIP-327 尚無 BIP

實際應用

  • Taproot 密鑰路徑:多方共同控制的 Taproot 地址
  • 閃電網路通道:2-of-2 通道資金控制
  • 企業金庫:多重簽章保護公司資金
  • 原子交換:跨鏈交易的簽章協調
  • 聯合託管:用戶和服務商共同控制

實作資源

  • libsecp256k1-zkp:C 語言參考實作
  • secp256k1-py:Python 綁定
  • bitcoin-core/secp256k1:正在整合中

相關資源

延伸閱讀: MuSig2 結合 Taproot 可以實現高效、隱私的多簽錢包。 了解 多簽錢包基礎 可以幫助你更好地理解這些概念。

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