本文档详细介绍 MPC(多方计算)钱包的技术原理、产品功能和安全架构。本 MPC 方案基于 Lindell 17 论文,并扩展为 2-of-n 门限方案。
MPC(Multi-Party Computation)钱包将私钥拆分为多个"份额"(shares),分布在不同参与方之间。签名时各方协作完成计算,私钥本身从不完整出现。
| 公司 | 时间 | 类型 | 面向用户 |
|---|---|---|---|
| Unbound Security | 2018 | 托管 | 机构 |
| Zengo | 2018 | 托管 | 机构 |
| Fireblocks | 2018 | 托管 | 机构 |
| Liminal | 2021 | 托管 | 机构 |
| Coinbase | 2023.03 | 自托管 | 个人及更多 | | Binance | 2023.11 | 自托管 | 个人 |
关键问题:MPC 不存在 BIP 级别的共识方案,业界基本都基于著名密码学论文私有实现,导致了 MPC 钱包孤岛化的问题。
graph LR
A[创建] --> B[备份]
B --> C[签名交易]
C --> D[恢复]
D --> E[逃逸]
A -->|"服务端生成share1(TEE内)<br/>客户端生成share2,share3"| A
B -->|"客户端加密share3<br/>备份到第三方"| B
C -->|"share1+share2<br/>协作签名"| C
D -->|"share3+share1<br/>重新计算新的3个share"| D
E -->|"share1+share2<br/>计算出根私钥→EOA"| E
| 功能 | 参与方 | 说明 |
|---|---|---|
| 创建 | 服务端 + 客户端 | 服务端在 Enclave 内生成 share1,客户端生成 share2 和 share3 |
| 备份 | 客户端 | 加密 share3 后备份到第三方(如 iCloud) |
| 签名 | share1 + share2 | 通过数学和密码学协作完成签名 |
| 恢复 | share1 + share3 | 用备份的 share3 结合 share1 重新生成新的三个 share |
| 逃逸 | share1 + share2 | 计算出完整私钥,转换为普通 EOA 钱包 |
一句话理解:两个点确定一条直线,三个点确定一条抛物线(拉格朗日插值法)。
构造 次多项式:
假设银行卡密码是 ,构造 :
→ 因此单纯 SSS 不够安全,需要 DKG 和 VSS 增强。
目标:不需要 Dealer(中心化分发者),每个参与方自己生成秘密并互相分享。
sequenceDiagram
participant P1 as 参与方 P1
participant P2 as 参与方 P2
participant P3 as 参与方 P3
Note over P1,P3: 每个参与方生成自己的随机多项式
P1->>P1: 生成 f1(x) = a1·x + b1
P2->>P2: 生成 f2(x) = a2·x + b2
P3->>P3: 生成 f3(x) = a3·x + b3
Note over P1,P3: 互相分发计算结果
P2->>P1: 发送 f2(1)
P3->>P1: 发送 f3(1)
P1->>P2: 发送 f1(2)
P3->>P2: 发送 f3(2)
P1->>P3: 发送 f1(3)
P2->>P3: 发送 f2(3)
Note over P1,P3: 各自求和得到私钥份额
P1->>P1: share1 = f1(1)+f2(1)+f3(1)
P2->>P2: share2 = f1(2)+f2(2)+f3(2)
P3->>P3: share3 = f1(3)+f2(3)+f3(3)
Note over P1,P3: 任意2个share可恢复私钥 b1+b2+b3
关键特点:
创新点:基于拉格朗日插值权重,将 Lindell 17 的 2-2 方案扩展到 2-n。
假设多项式 ,群体私钥 = 1
三个点 、、,取任意两点计算权重:
一句话总结:已知直线上两点,通过拉格朗日权重计算出两个值,其和等于 y 轴截距(群体私钥)。
| 步骤 | 标准 ECDSA | 阈值签名(2方) |
|---|---|---|
| 1. 公钥 Q | 生成私钥 , | ,通过 DH 密钥交换计算 |
| 2. 混淆密钥 k | 随机生成 | P1 生成 ,P2 生成 , |
| 3. 混淆公钥 R | 通过 DH 交换计算群体 | |
| 4. 计算 r | 同 ECDSA | |
| 5. 计算 s | 使用 Paillier 同态加密协作计算 |
核心特性(加同态):仅已知公钥和两个加密消息 和 ,不解密即可计算出 。
群体签名计算公式:
展开后:
P2 将部分计算结果用 Paillier 加密发给 P1,P1 利用同态性质完成最终计算。
sequenceDiagram
participant P1 as 参与方 P1 (share1)
participant P2 as 参与方 P2 (share2)
Note over P1,P2: 签名准备
P1->>P1: 生成 k1, 计算 R1=k1·G
P2->>P2: 生成 k2, 计算 R2=k2·G
P1->>P2: 发送 R1
P2->>P1: 发送 R2
Note over P1,P2: 计算群体 R
P1->>P1: R = k1·R2 = k1·k2·G
P2->>P2: R = k2·R1 = k1·k2·G
Note over P1,P2: 同态加密协作签名
P2->>P2: 用Paillier公钥加密部分计算
P2->>P1: 发送加密结果
P1->>P1: 利用同态性质完成签名计算
P1->>P1: 得到最终签名 (r, s)
签名结果与 EOA 完全一致,因此验签无差别。
注意:MPC 签名中临时密钥 使用不确定性随机算法(而非 RFC6979),导致相同数据每次签名结果不同。这对某些 L2(如 dYdX)会有影响。
当用户设备的 share2 丢失,使用 share1 + share3 恢复:
通过拉格朗日插值计算缺失的 share2:
三个点的横坐标是 MPC 协议预定义的常量。
使用拉格朗日插值恢复完整私钥 :
graph TB
A[安全架构] --> B[鉴权层]
A --> C[传输层]
A --> D[计算层]
B --> B1[用户中心 Token 鉴权]
C --> C1[RSA 公钥加密 AES Key]
C --> C2[AES 对称加密通信]
D --> D1[AWS Nitro Enclaves TEE]
D --> D2[AWS KMS 密钥管理]
所有与服务端的交互均携带鉴权 token,每次请求先过用户中心。
先非对称、再对称——兼顾安全性和性能。
使用 AWS Nitro Enclaves 可信执行环境:
| 操作 | 流程 |
|---|---|
| 加密存储 | share1 在 Enclave 内生成 → 调用 KMS 生成 data key → 用 data key 加密 share1 → 加密的 share1 + 加密的 data key 存入 DB |
| 解密使用 | 从 DB 取出 → 将 data key 发送到 KMS 解密 → 在 Enclave 内解密 share1 |
关键:share1 的加密和解密全程在 TEE 内完成,外部无法访问。
| 维度 | 方案 |
|---|---|
| 门限方案 | Lindell 17 扩展到 2-of-n |
| 密钥生成 | DKG + Feldman's VSS |
| 门限签名 | 拉格朗日权重 + DH 交换 + Paillier 同态加密 |
| 传输安全 | RSA + AES 混合加密 |
| 计算安全 | AWS Nitro Enclaves |
MPC 技术积累可复用于新场景,如(底层 MPC + 上层 AA 方案,用户无感创建钱包)。