跳至主要內容
高級

Schnorr 簽章詳解

Schnorr 簽章是 Taproot 升級的核心技術,提供更簡潔、更高效、更靈活的簽章方案。

20 分鐘

什麼是 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. 1. 生成 nonce

    k = 隨機數 ∈ [1, n-1]

    R = k·G

  2. 2. 計算挑戰

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

  3. 3. 計算簽章

    s = k + e·x (mod n)

  4. 4. 輸出簽章

    σ = (R, s) = 64 bytes

簽章驗證

  1. 1. 計算挑戰

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

  2. 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 派生
重用 nonce 會導致私鑰可以被計算:x = (s₁ - s₂) / (e₁ - e₂)

相關資源

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