MuSig2 多簽聚合詳解
MuSig2 是一個兩輪多簽協議,允許多個參與者共同產生一個與單一簽章無法區分的聚合簽章,提供極佳的隱私性和效率。
為什麼需要 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ₙ
每個公鑰都乘以一個取決於所有公鑰的係數。攻擊者無法在不知道其他人公鑰的情況下 選擇一個「抵消」的惡意公鑰,因為係數會隨之改變。
簽章協議
協議概覽
設置(一次性)
所有參與者交換公鑰,計算聚合公鑰 P
P = KeyAgg(P₁, P₂, ..., Pₙ)
第一輪: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)
第二輪:部分簽章
收到所有 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:正在整合中
相關資源
- • BIP-327:MuSig2 規範
- • BIP-340:Schnorr 簽章
- • Schnorr 簽章詳解
- • Taproot 詳解
延伸閱讀: MuSig2 結合 Taproot 可以實現高效、隱私的多簽錢包。 了解 多簽錢包基礎 可以幫助你更好地理解這些概念。