返回 Expert 笔记
Expert Day 207

阈值签名 — FROST 与 GG18/GG20

阈值签名形式化、Distributed Key Generation (DKG)、FROST (Schnorr) 协议、GG18/GG20 (ECDSA) 协议、TSS 在 Web3 中的应用

2026-11-24
Phase 4 - 经典密码学 (Day 195-208)
密码学阈值签名FROSTGG20MPC

日期: 2026-11-24 方向: 密码学 / 经典原语 阶段: Phase 4 - 经典密码学 (Day 195-208) 标签: #密码学 #阈值签名 #FROST #GG20 #MPC


今日目标

类型内容
学习阈值签名形式化、Distributed Key Generation (DKG)、FROST (Schnorr) 协议、GG18/GG20 (ECDSA) 协议、TSS 在 Web3 中的应用
实操阅读 FROST RFC 9591、研究 ZenGo / Fireblocks MPC 实现、对比 TSS vs 多签
产出tss.md — 阈值签名完整分析

一、阈值签名 (Threshold Signature Scheme, TSS)

1.1 定义

$(t, n)$-TSS: $n$ 方共享一个虚拟私钥 $sk$。任 $\ge t$ 方协作可签名,$< t$ 方无法。

输出 $\sigma$ 与单签者签名不可区分 — 这是 TSS 与多签 (multisig) 的关键区别。

1.2 TSS vs Multisig 对比

维度MultisigTSS
链上表现显式多签合约 / OP_CHECKMULTISIG单签
链上 gas$n$ ×$1$ ×
隐私暴露所有 signer完全隐藏
链兼容性需链支持任何链 (输出标准签名)
协议复杂度简单复杂多方计算
链下通信无 (各自签)多 round 交互

1.3 应用场景

用途例子
MPC 钱包 / custodyFireblocks / Coinbase Prime / ZenGo / Safeheron
跨链桥多签THORChain / Maya / Wanchain
验证者签名DFINITY (BLS), Zilliqa
协作私钥分散"2-of-3 hardware wallet split"
抗强迫披露 (UK RIPA)$t < n$ → 单方被胁迫无法签

二、Shamir Secret Sharing (TSS 基石)

2.1 协议

设阶 $q$ 群。dealer 选 $f(X) = a_0 + a_1 X + ... + a_{t-1} X^{t-1}$ 度 $t-1$ 多项式,$a_0 = sk$.

每参与者 $i$ 拿 share $sk_i = f(i)$.

2.2 重构

任 $t$ 个 share ${sk_i}{i \in S}$ 用 Lagrange 插值: $$sk = f(0) = \sum{i \in S} \lambda_{i,S} \cdot sk_i$$ $$\lambda_{i,S} = \prod_{j \in S, j \ne i} \frac{0 - j}{i - j} = \prod_{j \ne i} \frac{-j}{i - j}$$

2.3 Verifiable Secret Sharing (Pedersen-VSS)

Dealer 同时公布 $a_i \cdot G$ 作为承诺。每参与者验证收到的 share: $$sk_i \cdot G \stackrel{?}{=} \sum_{j=0}^{t-1} i^j \cdot a_j G$$

→ 防 dealer 给虚假 share。


三、Distributed Key Generation (DKG)

3.1 目标

不依赖 trusted dealer,$n$ 方协作生成 sk + 各自 share,没人知 sk

3.2 Pedersen DKG

每参与者 $i$:

  1. 选自己的 $f_i(X)$ 度 $t-1$, 计算 share $f_i(j)$ 给 $j$
  2. 公布 commitments ${a_{i,j} \cdot G}_j$ (Feldman) 或 Pedersen-style
  3. 接收方 $j$ 验证收到的 share 在 commitment 上
  4. 抱怨阶段: 错误 share → public dispute
  5. 排除恶意方
  6. 最终: $sk = \sum_i f_i(0)$, $sk_j = \sum_i f_i(j)$, $pk = \sum_i f_i(0) \cdot G$

3.3 Gennaro Attack on Pedersen-DKG

1999 攻击: Pedersen-DKG 中 dishonest player 可在最后调整自己的 share 影响 $pk$ 的低位 → biased pk distribution.

修复 (Gennaro et al. 1999): 两阶段提交 + Pedersen commitment 而非 Feldman.

3.4 Asynchronous DKG

更现代: 容忍部分参与者掉线 + 网络异步。Implementations: HoneyBadgerDKG, Cobalt-DKG.


四、FROST — Threshold Schnorr (RFC 9591)

4.1 设计动机

Schnorr 签名线性: $\sigma = (R, s)$ 中 $R = \sum R_i, s = \sum s_i$. → 阈值签名相对简单.

但朴素方案受 Wagner generalized birthday attack: 攻击者在多次 partial sign 中 grinding 不同 nonce → 可恢复 sk.

FROST (Komlo & Goldberg 2020) 用 nonce commitment + binding factor 防御。

4.2 协议(简化)

前提: 已完成 DKG, 每参与者 $i$ 持 $sk_i$, $pk = sk \cdot G$ 公开。

Round 1 (一次性 preprocessing):

  • 每参与者 $i$ 选两个 nonces $(d_i, e_i)$, 公布 $D_i = d_i G, E_i = e_i G$

Round 2 (signing):

  • $t$ 个参与者 $S$ 协作签 $m$:
  • 每方计算 binding factor $\rho_i = H(i, m, {D_j, E_j}_{j \in S})$
  • 共同 $R = \sum_{j \in S} (D_j + \rho_j E_j)$
  • $c = H(R, pk, m)$
  • 每方计算 $z_i = d_i + \rho_i e_i + \lambda_{i,S} sk_i c$
  • 输出 $z = \sum z_i$
  • 签名 $(R, z)$ 是有效 Schnorr signature on $pk$

4.3 验证

完全标准 Schnorr verify: $$z G \stackrel{?}{=} R + c \cdot pk$$

链上无法分辨这是 TSS 输出 — 完美隐私.

4.4 安全性

  • Robust: 单方掉线 → 协议失败但不泄漏
  • Concurrent secure: 多个 sign session 同时进行不互相影响
  • vs 多方签名版本 (FROST2 / FROST3): 优化 round 数

4.5 性能

  • DKG: 1-2 round
  • Sign Round 1: 一次性 (preprocessing, 可线下做)
  • Sign Round 2: 1 round
  • 总通信: $O(t)$ 消息每 sign

五、GG18/GG20 — Threshold ECDSA

5.1 为什么 ECDSA TSS 难?

ECDSA 有 $k^{-1}$ 项: $s = k^{-1}(z + rd)$. 反元素不线性 → 不能简单用 Shamir.

要实现 $(t,n)$-TSS, 必须用 MPC 计算:

  • $k^{-1}$ from shares of $k$
  • $k^{-1} \cdot d$ from shares of $k^{-1}$ and $d$

5.2 GG18 (Gennaro-Goldfeder 2018)

Paillier 加密 实现 multiplication-to-addition 转换:

设 $\alpha + \beta = ab$ where $a$ in P1's share, $b$ in P2's share.

  1. P1 加密 $\text{Enc}(a)$ 用 Paillier
  2. P2 计算 $\text{Enc}(a) \cdot b + \text{Enc}(\beta) = \text{Enc}(ab + \beta)$ (Paillier 同态)
  3. P1 解密 → $\alpha = ab + \beta$
  4. 现 $a, b$ 各方分别持 share, $ab = \alpha + \beta$ 也分散

通过此 MtA (Multiplicative-to-Additive) 协议构造 ECDSA $k^{-1} \cdot d$ 的 share.

GG18: 5 rounds, 大量 ZK proof 验证每步骤.

5.3 GG20 (Improved 2020)

减 round 到 4, 修复 GG18 中的 abort attack.

5.4 GG18/GG20 漏洞史

年份漏洞影响
2020Alpha-Rays attack (Coinbase)GG18 中可恢复部分私钥
2021"TSSHOCK" (Verichains)多个 GG20 实现私钥泄漏
2022Fireblocks GG20 fixrange proof 不全
2023ZenGo "0-Day MPC"协议自身的边缘情况

→ ECDSA TSS 安全审计极难. 工程经验: 用 FROST (Schnorr) 总是更安全, 仅 ECDSA 兼容必需时才用 GG20.

5.5 ECDSA TSS 替代方案

  • CMP / CGGMP (Canetti-Makriyannis-Peled 2020): 基于 Paillier,比 GG20 更紧凑安全证明
  • DKLS18 / DKLs19: 用 OT 而非 Paillier, 工程更简单
  • Ligero TSS: ZKP 全程

六、阈值 BLS — 最简单的 TSS

6.1 协议

完全是 Shamir + Lagrange:

  1. DKG → 每参与者 $i$ 持 $sk_i = f(i)$
  2. 每方独立计算 partial sig: $\sigma_i = sk_i \cdot H(m)$
  3. Aggregator 聚合: $\sigma = \sum_{i \in S} \lambda_{i,S} \cdot \sigma_i$
  4. $\sigma = sk \cdot H(m)$ → 标准 BLS 验证

无需复杂 MPC! 仅 1 round (sign).

6.2 应用

  • DFINITY / ICP: 阈值 BLS 作 Random Beacon (每 block 2/3 验证者签随机数)
  • Drand: League of Entropy 网络 (Cloudflare, EPFL, Protocol Labs 等共 12+ 节点)
  • Filecoin / 各种 oracle: 用阈值 BLS 防单点失败

七、TSS 在 Web3 中的实战

7.1 MPC 钱包

Provider算法模式
FireblocksGG20 (ECDSA) + 自研$(t, n)$ between users + Fireblocks node
ZenGoGG18 → GG20 → CGGMP (升级)2-of-2 (用户 + ZenGo)
Coinbase PrimeDKLs18 / DKLs19$(2,3)$ 或 $(3,5)$
SafeheronGG20 + CMP企业级
Web3AuthLindell17 (2-of-2 ECDSA)用户 + Web3Auth node
Particle NetworkSameAccount abstraction 友好

7.2 跨链桥多签

BridgeTSS 方案
THORChainTSS-lib (GG18/20)
WanchainGPK (Group Public Key)
Multichain (broken)曾用 GG18 → 2023 内部 key 失窃
Axelar(混合)
LayerZero19 of 32 multisig (非真 TSS, 链上多签合约)

7.3 验证者集

协议TSS 用途
DFINITYNIDKG + threshold BLS for randomness
AlgorandVRF + state proofs
PenumbraDKG + threshold ed25519
DrandThreshold BLS public randomness

八、TSS 协议选择决策树

需要 (t,n) 阈值签名?
├── 输出在哪条链?
│   ├── BTC / ETH (ECDSA) → GG20 / CGGMP / DKLs
│   ├── Bitcoin Taproot (Schnorr) → FROST
│   ├── Solana / Cosmos (Ed25519) → FROST 变种
│   └── Eth2 (BLS) → Threshold BLS (简单)
│
├── 安全性优先?
│   ├── 是 → CGGMP / DKLs > GG20 > GG18
│   └── 工程速度 → 现成开源 (tss-lib by binance)
│
├── 后量子需求?
│   └── Threshold lattice signatures (Frodo-TSS, 研究中)
│
└── 隐私需求?
    └── ALL TSS schemes provide on-chain unlinkability

九、TSS vs Smart Contract Multisig

场景推荐
Eth gov DAO (需透明)Safe (smart contract multisig)
企业 custody (需隐私)TSS (Fireblocks 类)
跨链桥(链不支持原生多签)TSS
个人钱包 + 社交恢复Smart contract AA (ERC-4337) 或 TSS-AA hybrid

十、常见陷阱

  1. DKG 错误: 随便聚合不验证 → biased pk
  2. 重用 nonce 在 partial sign: FROST 中 nonce reuse → key leak
  3. GG18 abort attack: 部分参与者中途退出可让攻击者增量学 sk
  4. 网络层泄漏: TSS 通信内容可被分析(即使加密,timing 泄漏)
  5. State management: 部分参与者掉线后状态恢复错误 → 重用 nonce
  6. Side channel: HSM 内的 share 计算可能 timing 攻击
  7. 不验证 ZK proofs: GG20 中每步骤需要 ZK proof,不验 → fake share 注入
  8. Ed25519 cofactor 问题: TSS-Ed25519 cofactor 8 处理不当 → bias

十一、关键速查

TSS 协议性能 (2-of-3)

协议DKG roundsSign rounds通信 / sign
FROST22 (含 preproc)几 KB
GG1845~100 KB (Paillier ZK proofs)
GG2044~80 KB
CGGMP44~50 KB
DKLs1932~30 KB
Threshold BLS1-21<1 KB

Sign 时延实测

协议时延 (LAN)
FROST50-100 ms
GG201-2 sec
CGGMP800 ms
DKLs19400 ms
Threshold BLS<10 ms

十二、面试题

Q1: TSS 比 multisig 好在哪?什么场景反而 multisig 更好? A: TSS 优势: (1) 链上单签 → gas 便宜; (2) 隐私 (无人知是阈值); (3) 跨链兼容. 多签优势: (1) 链上透明 (DAO 治理需要); (2) 协议简单审计; (3) 链支持原生 (Eth Safe). 结论: 私有 custody 选 TSS, 公开治理选 multisig.

Q2: 为什么 FROST 比 GG20 更安全? A: 数学根本: Schnorr 线性 → TSS 直接对应 Shamir + Lagrange,最多 2 round 协议. ECDSA 含 $k^{-1}$ → 必须用 Paillier MPC + 多步 ZKP,每步骤都是漏洞面 (TSSHOCK 系列攻击说明)。FROST 的安全归约干净 (Schnorr → DLP), GG20 依赖 Paillier + 数十种 range proof.

Q3: 阈值 BLS 为什么这么简单? A: BLS 完全线性: $\sigma = sk \cdot H(m)$. 阈值化后:

  • $\sigma_i = sk_i \cdot H(m)$ (每方独立)
  • $\sigma = \sum \lambda_{i,S} \sigma_i = sk \cdot H(m)$ (Lagrange 聚合)
  • 1 round, 无 MPC,直接 BLS verify
  • 这就是为什么 DFINITY 选 BLS 而非 ECDSA + GG20

Q4: GG18/20 的实战漏洞集中在哪? A:

  • MtA (Mult-to-Add) 协议: Paillier 同态运算,需多个 range proof
  • Range proof gap: 如果 plaintext 不在范围内,单 bit 信息泄漏
  • TSSHOCK 系列攻击: 利用部分 ZK proof 不严格 → 几次签名后可恢复 share
  • Abort attack: 协议中途退出,攻击者学习剩余信息

工程教训: ECDSA TSS 库必须经过专业密码学审计 (Trail of Bits, Verichains, Kudelski 等)。

Q5: Fireblocks 类 MPC 钱包真比硬件钱包安全吗? A: 不同威胁模型:

  • 硬件钱包 (Ledger): 单点持有 → seed 泄漏 = 完全失控
  • TSS MPC (Fireblocks): $t$ 方协作 → 单点泄漏不致命
  • 但: TSS 实现复杂,bug 风险更高 (TSSHOCK)
  • Fireblocks 优势: 企业级 monitoring + policy engine + insurance, 不是单纯密码学

实践: 个人用户硬件钱包仍最简最安全; 机构 (>$1M) 用 MPC 必要.


十三、明日预告

Day 208: Week 31 复习 — 整合本周 (承诺方案 + Verkle + PQ + TSS) 学习,搭建完整密码学基础库 v1,为 Phase 4 Day 209+ 的 ZK 证明系统做铺垫。