Schnorr 簽章詳解
Schnorr 簽章是 Taproot 升級的核心技術,提供更簡潔、更高效、更靈活的簽章方案。
什麼是 Schnorr 簽章?
Schnorr 簽章是由 Claus Schnorr 在 1989 年發明的數位簽章演算法。 它基於離散對數問題,提供了數學上可證明的安全性。由於專利限制, 比特幣最初使用了 ECDSA。2021 年 Taproot 啟用後,Schnorr 成為比特幣的一部分。
Schnorr vs ECDSA
| 特性 | ECDSA | Schnorr |
|---|---|---|
| 簽章大小 | 70-72 bytes (DER) | 64 bytes |
| 批量驗證 | 不支援 | 原生支援 |
| 簽章聚合 | 不可行 | 原生線性 |
| 可塑性 | 需要額外處理 | 不可塑 |
| 安全證明 | 較弱 | 可證明安全 |
數學基礎
橢圓曲線參數
比特幣使用 secp256k1 曲線:
# 曲線方程
y² = x³ + 7 (mod p)
# 參數
p = 2²⁵⁶ - 2³² - 977 (質數域)
n = 曲線階(群的大小)
G = 生成點(基點)
密鑰生成
# 私鑰
x = 隨機數 ∈ [1, n-1]
# 公鑰
P = x·G(橢圓曲線點乘法)
簽章流程
簽章生成
- 1. 生成 nonce
k = 隨機數 ∈ [1, n-1]
R = k·G
- 2. 計算挑戰
e = H(R || P || m)
- 3. 計算簽章
s = k + e·x (mod n)
- 4. 輸出簽章
σ = (R, s) = 64 bytes
簽章驗證
- 1. 計算挑戰
e = H(R || P || m)
- 2. 驗證等式
s·G == R + e·P ?
證明:s·G = (k + e·x)·G = k·G + e·x·G = R + e·P ✓
BIP-340 規範
BIP-340 定義了比特幣使用的具體 Schnorr 實現:
x-only 公鑰
BIP-340 只使用公鑰的 x 座標(32 bytes),假設 y 座標總是偶數。 這減少了公鑰大小,並簡化了與 Taproot 的集成。
# 公鑰格式
傳統:33 bytes (02/03 前綴 + 32 bytes x)
BIP-340:32 bytes (僅 x 座標)
標籤化哈希
BIP-340 使用「標籤化哈希」來防止跨協議攻擊:
H_tag(m) = SHA256(SHA256(tag) || SHA256(tag) || m)
# 標籤示例
"BIP0340/challenge" - 簽章挑戰
"BIP0340/nonce" - nonce 派生
批量驗證
Schnorr 的線性特性允許高效的批量驗證。驗證 n 個簽章的成本 接近驗證單個簽章的成本,而不是 n 倍。
# 批量驗證
# 驗證 (R₁,s₁,P₁,m₁), (R₂,s₂,P₂,m₂), ...
(s₁+s₂+...)·G == (R₁+R₂+...) + e₁·P₁ + e₂·P₂ + ...
效能提升: 批量驗證 100 個簽章的速度比單獨驗證 100 次快約 2-3 倍。 這對區塊驗證有重大影響。
簽章聚合
Schnorr 簽章可以線性聚合。多個簽章者可以共同產生一個單一簽章, 這是 MuSig 協議的基礎。
簡化示例(不安全)
聚合公鑰:P = P₁ + P₂
聚合 nonce:R = R₁ + R₂
聚合簽章:s = s₁ + s₂
實際使用需要 MuSig 協議防止惡意密鑰攻擊
安全注意事項
Nonce 安全
警告:
- • 永遠不要重用 nonce
- • 永遠不要使用可預測的 nonce
- • 使用 RFC 6979 確定性 nonce 派生