MPC-TSS Overview ⚡️
详细内容见其他章节
MPC-TSS 方案的演变历史
MPC-TSS 方案演变历史
-
Shamir's Secret Sharing (1979) 介绍 Shamir's Secret Sharing 方案及其在秘密共享中的基础地位。
-
Verifiable Secret Sharing (VSS) (1985-1987) 讨论基于 VSS 的方案,确保秘密共享过程中的正确性和安全性。
多方计算与门限签名的结合
-
Multiparty Computation (MPC) (1980s-1990s) 介绍 MPC 的基本概念和早期协议,如 Yao's Garbled Circuits、GMW 协议和 BGW 协议。
-
Threshold Signatures (1991) 描述门限签名方案及其在分布式系统中的应用。
门限 ECDSA 的发展
-
Gennaro-Jarecki-Krawczyk-Rabin (GJKR) Protocol (2000) 介绍 GJKR 协议及其在门限 ECDSA 中的应用。
-
分布式密钥生成(DKG) (1999) 讨论 DKG 协议的提出及其在分布式系统中的重要性。
-
Lindell's Protocol (2017) 描述 Lindell 协议及其在高效门限 ECDSA 中的贡献。
-
Gennaro-Goldfeder (GG) Protocols (2018-2020) 介绍 Gennaro 和 Goldfeder 提出的一系列协议及其在门限签名中的应用。
重要技术概念
- 同态证明(Homomorphic Proofs) 讨论同态加密和同态证明在 MPC-TSS 方案中的应用,包括:
- Paillier 同态加密(1999):允许在密文上进行加法运算。
- 全同态加密(FHE):Craig Gentry 提出的全同态加密方案,允许在密文上进行任意运算,并提供了相应的安全性证明。
- 应用案例:同态加密在现代 MPC 协议中的应用,如安全多方计算和隐私保护数据分析。
- 零知识证明(Zero-Knowledge Proofs, ZKPs) 介绍零知识证明的基础概念和应用,包括:
- 经典零知识证明(1980 年代):如 Goldwasser、Micali 和 Rackoff 提出的交互式零知识证明。
- 非交互零知识证明(NIZK):Blum、Feldman 和 Micali 提出的非交互零知识证明。
- zk-SNARKs 和 zk-STARKs:高效的零知识证明系统,广泛应用于区块链和隐私保护。
- 应用案例:零知识证明在 MPC 和 TSS 中的应用,如验证计算正确性和保护隐私。
最新发展与优化
-
FROST (Flexible Round-Optimized Schnorr Threshold) (2020) 讨论 FROST 协议及其在优化门限签名过程中的贡献。
-
MuSig2 (2020) 介绍 MuSig2 协议及其在简化和提高多方签名过程中的作用。
最新研究方向
概述当前 MPC-TSS 领域的最新研究方向和技术趋势,如同态加密、零知识证明和区块链应用。
MPC-TSS 流程
MPC-TSS 流程 无分发验证
- 私钥分片分发
- 交易数据签名
- 密钥分片刷新(保证公钥不变) - 可以刷单个 P1、P2、P3 , 可以刷多个 P1,P2,P3
- 见:tss/ed25519/keygen
MPC-TSS 流程 分发验证
MPC-TSS 理论基础
- 密码学: 是数学的一个分支,密码学证明是数学证明计算相等
- 零知识证明:不暴露自己知道的秘密,向验证方证明自己知道(向验证方发送掩盖后的秘密----掩盖后的秘密很难被恢复)
- BIP32(Bitcoin Improvement Proposal 32)是比特币改进提案,密钥非硬化派生(派生出来的密钥可以继续派生)
- HASH Commitment Schemes,commit-open 用于
{2,2}{2,n}hash - 椭圆曲线 ECDSA、ED25519 Elliptic Curve point addition (ℝ)
- 零知识证明 Schnorr ZK
- 非交互式零知识 证明 Schnorr NIZK, Fiat-Shamir 变换
- 同态非交互式零知识证明 Paillier NIZK
- DKG 分布式密钥生成
- TSS
{2,2}Lindell 17’ - TSS
{2,n}Feldman's VSS - TSS
{2,n}Feldman's VSS 多项式-----拉格朗日插值 - Shamir's 与 Feldman's VSS 的区别
TSS {2,3} 猜测
分开生成
- 服务端生成 P1
- 客户端生成 P2(用户设备), P3(用户备份 refresh)
客户端分发
客户端生成 P1、P2、P3, 将 P1 发送到服务器存储,P2(用户设备), P3(用户备份 refresh)

DKG
DKG 中几个关系
- 私钥份额 si = 发到 i 参与者的所有共享份额 shares 的累加
- 私钥 s = 所有参与者私钥份额 si 的累加
- verifiers 用于 HashCommitment 和零知识证明
{2,n}私钥份额签名累加(同态 私钥签名)
两个重要公式推导
公共多项式系数计算

公共密钥份额计算公式

DKG 生成
在 Feldman 分布式密钥生成(DKG)方案中,每个参与方生成一个多项式。这个多项式用于生成密钥份额,并通过其系数生成验证者
-
第一轮:每个参与者生成初始私钥份额 ui,并通过秘密共享方案生成共享份额 shares 和验证者 verifiers。这些值通过承诺广播(P2P)给其他参与者。
-
第二轮:每个参与者生成其私钥份额的零知识证明,并将其与共享份额一起发送给其他参与者。
-
第三轮:每个参与者验证收到 的零知识证明和共享份额,然后将所有收到的共享份额相加,生成最终的私钥份额 xi。

DKG 刷新
分布式密钥生成(DKG)刷新私钥,保证公钥不变
- 公钥(公钥份额总和)不变,私钥(私钥份额总和)也不变,因为 X = G xi, G 不变
- 刷新私钥份额,是将完整私钥重新分配的过程(完整的私钥是公共多项式的常数项之和)
- 门限3, 2 个参与者足够还原完整私钥,2 个参与者对应的新公共多项式就可以实现私钥份额的重新分配
- 私钥份额总和(是各个参与者常数项的总和),如果不知道 P2,知道 P1,P3,只需要 P2 多项式的常数项为 0,这样可以保证 P1,P2,P3 的新公共多项式的常数项之和不变,生成的新私钥份额总和不变

DKG 的刷新代码 vs DKG 生成代码
几乎一致,稍有区别
刷新时的代码,ui,chaincode 使用生成时的, 过滤掉 0G, 也就是 g(x) 上述 P2 的多项式常数项,g(0) = 0
// 过滤 0*G
if ujPoint.X.Cmp(big.NewInt(0)) == 0 || ujPoint.Y.Cmp(big.NewInt(0)) == 0 {
continue
}
DKG-Bip32 签名流程概述
-
分布式密钥生成(DKG):首先,生成初始的共享密钥和公钥。
-
BIP-32 派生子私钥份额:从 DKG 生成的私钥份额派生出子私钥份额。
-
门限签名(TSS):使用派生出的子私钥份 额进行门限签名。
缺点:不可以进行 DKG 刷新,刷新后私钥份额变了,同样的派生路径,获取到公私钥对变了,最终 TSS 签名也和之前不一样了
签名片段收集
- 接口调用
- 扫码
- 硬件存储
门限签名

ECDSA 与 ed25519 不同,tss-ECDSA 需要 Paillier, 而 tss-ED25519 不需要
签名与验签
签名时候有个随机数,验签时候没有,这个随机会造成每次前面结果不一样,对验签没影响

推导

TSS ECDSA 需要 Paillier
上面的两张图已经证明了验签与随机数无关,之后 k,k1,k2 随机数关系表示为:k = k1+k2

TSS ED25519 不需要 Paillier

OKX APP
刷新私钥片段

导出完整私钥

导出完整私钥-实现

以 TSS {t,n} 为例:
选择参与者:选择至少 t 个参与者 P1.....Pt。 收集秘密份额:收集这些参与者的秘密份额 s1.....st。 使用拉格朗日插值法重建私钥:使用这些秘密份额通过拉格朗日插值法重建完整私钥 s。

Shamir's 与 Feldman's VSS 的区别

Other
TSS{t,n}

- https://eprint.iacr.org/2021/1621.pdf
- https://github.com/ZenGo-X/multi-party-ecdsa
- https://github.com/ZenGo-X/multi-party-ecdsa/blob/master/README.md
MPC-DKLS19
