阈值签名 — FROST 与 GG18/GG20
阈值签名形式化、Distributed Key Generation (DKG)、FROST (Schnorr) 协议、GG18/GG20 (ECDSA) 协议、TSS 在 Web3 中的应用
日期: 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 对比
| 维度 | Multisig | TSS |
|---|---|---|
| 链上表现 | 显式多签合约 / OP_CHECKMULTISIG | 单签 |
| 链上 gas | $n$ × | $1$ × |
| 隐私 | 暴露所有 signer | 完全隐藏 |
| 链兼容性 | 需链支持 | 任何链 (输出标准签名) |
| 协议复杂度 | 简单 | 复杂多方计算 |
| 链下通信 | 无 (各自签) | 多 round 交互 |
1.3 应用场景
| 用途 | 例子 |
|---|---|
| MPC 钱包 / custody | Fireblocks / 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$:
- 选自己的 $f_i(X)$ 度 $t-1$, 计算 share $f_i(j)$ 给 $j$
- 公布 commitments ${a_{i,j} \cdot G}_j$ (Feldman) 或 Pedersen-style
- 接收方 $j$ 验证收到的 share 在 commitment 上
- 抱怨阶段: 错误 share → public dispute
- 排除恶意方
- 最终: $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.
- P1 加密 $\text{Enc}(a)$ 用 Paillier
- P2 计算 $\text{Enc}(a) \cdot b + \text{Enc}(\beta) = \text{Enc}(ab + \beta)$ (Paillier 同态)
- P1 解密 → $\alpha = ab + \beta$
- 现 $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 漏洞史
| 年份 | 漏洞 | 影响 |
|---|---|---|
| 2020 | Alpha-Rays attack (Coinbase) | GG18 中可恢复部分私钥 |
| 2021 | "TSSHOCK" (Verichains) | 多个 GG20 实现私钥泄漏 |
| 2022 | Fireblocks GG20 fix | range proof 不全 |
| 2023 | ZenGo "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:
- DKG → 每参与者 $i$ 持 $sk_i = f(i)$
- 每方独立计算 partial sig: $\sigma_i = sk_i \cdot H(m)$
- Aggregator 聚合: $\sigma = \sum_{i \in S} \lambda_{i,S} \cdot \sigma_i$
- $\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 | 算法 | 模式 |
|---|---|---|
| Fireblocks | GG20 (ECDSA) + 自研 | $(t, n)$ between users + Fireblocks node |
| ZenGo | GG18 → GG20 → CGGMP (升级) | 2-of-2 (用户 + ZenGo) |
| Coinbase Prime | DKLs18 / DKLs19 | $(2,3)$ 或 $(3,5)$ |
| Safeheron | GG20 + CMP | 企业级 |
| Web3Auth | Lindell17 (2-of-2 ECDSA) | 用户 + Web3Auth node |
| Particle Network | Same | Account abstraction 友好 |
7.2 跨链桥多签
| Bridge | TSS 方案 |
|---|---|
| THORChain | TSS-lib (GG18/20) |
| Wanchain | GPK (Group Public Key) |
| Multichain (broken) | 曾用 GG18 → 2023 内部 key 失窃 |
| Axelar | (混合) |
| LayerZero | 19 of 32 multisig (非真 TSS, 链上多签合约) |
7.3 验证者集
| 协议 | TSS 用途 |
|---|---|
| DFINITY | NIDKG + threshold BLS for randomness |
| Algorand | VRF + state proofs |
| Penumbra | DKG + threshold ed25519 |
| Drand | Threshold 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 |
十、常见陷阱
- DKG 错误: 随便聚合不验证 → biased pk
- 重用 nonce 在 partial sign: FROST 中 nonce reuse → key leak
- GG18 abort attack: 部分参与者中途退出可让攻击者增量学 sk
- 网络层泄漏: TSS 通信内容可被分析(即使加密,timing 泄漏)
- State management: 部分参与者掉线后状态恢复错误 → 重用 nonce
- Side channel: HSM 内的 share 计算可能 timing 攻击
- 不验证 ZK proofs: GG20 中每步骤需要 ZK proof,不验 → fake share 注入
- Ed25519 cofactor 问题: TSS-Ed25519 cofactor 8 处理不当 → bias
十一、关键速查
TSS 协议性能 (2-of-3)
| 协议 | DKG rounds | Sign rounds | 通信 / sign |
|---|---|---|---|
| FROST | 2 | 2 (含 preproc) | 几 KB |
| GG18 | 4 | 5 | ~100 KB (Paillier ZK proofs) |
| GG20 | 4 | 4 | ~80 KB |
| CGGMP | 4 | 4 | ~50 KB |
| DKLs19 | 3 | 2 | ~30 KB |
| Threshold BLS | 1-2 | 1 | <1 KB |
Sign 时延实测
| 协议 | 时延 (LAN) |
|---|---|
| FROST | 50-100 ms |
| GG20 | 1-2 sec |
| CGGMP | 800 ms |
| DKLs19 | 400 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 证明系统做铺垫。