# MPC-System 集成指南 > **面向后端服务开发者**: 如何与 MPC 分布式签名系统集成,发起密钥生成和签名会话 --- ## 📚 目录 1. [系统架构理解](#1-系统架构理解) 2. [服务职责说明](#2-服务职责说明) 3. [标准 MPC 会话类型](#3-标准-mpc-会话类型) 4. [集成方式](#4-集成方式) 5. [完整示例代码](#5-完整示例代码) 6. [故障排查](#6-故障排查) --- ## 1. 系统架构理解 ### 1.1 为什么需要这些服务? MPC-System 实现了一个**真正的分布式多方计算系统**,遵循以下核心原则: ``` 核心设计理念: ├── 私钥永不完整存在于任何单点 ├── 所有参与方地位对等 (无主从关系) ├── Coordinator 只协调流程,不参与计算 └── 密钥分片物理隔离存储 ``` ### 1.2 架构层次图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 业务层 (您的服务) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ API Gateway │ │ MPC Service │ │ Wallet App │ │ │ │ │ │ │ │ (前端) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ └────────────────┼────────────────┘ │ │ ▼ │ └──────────────────────────┼──────────────────────────────────────┘ │ ┌─────────────────┼─────────────────┐ │ MPC-System 边界 (独立部署) │ │ ▼ │ ┌────────┴─────────────────────────────────────────────────────┐ │ Account Service (入口层) │ │ 端口: 4000 │ │ 职责: ❶ 统一入口 ❷ 账户管理 ❸ 认证授权 ❹ 业务编排 │ │ API: POST /api/v1/mpc/keygen │ │ POST /api/v1/mpc/sign │ └──────────────────────┬───────────────────────────────────────┘ │ ┌─────────────┼─────────────────┐ │ ▼ │ ┌────────┴──────────────────────────────┴──────────────────────┐ │ 协调层 (不参与 MPC 计算) │ │ │ │ ┌───────────────────────┐ ┌───────────────────────┐ │ │ │ Session Coordinator │ │ Message Router │ │ │ │ 端口: 8081/50051 │◄──►│ 端口: 8082/50051 │ │ │ ├───────────────────────┤ ├───────────────────────┤ │ │ │ ✓ 会话生命周期管理 │ │ ✓ P2P 消息路由 │ │ │ │ ✓ 参与方注册与认证 │ │ ✓ gRPC Stream 推送 │ │ │ │ ✓ 状态机控制 │ │ ✓ 消息持久化 │ │ │ │ ✓ 超时保护 │ │ ✓ 离线消息缓存 │ │ │ │ │ │ │ │ │ │ ✗ 不参与 MPC 计算 │ │ ✗ 不解密 MPC 消息 │ │ │ │ ✗ 不存储密钥分片 │ │ ✗ 不参与 MPC 计算 │ │ │ └───────────────────────┘ └───────────────────────┘ │ └───────────────────────────────────────────────────────────────┘ │ ┌─────────────┼─────────────────┐ │ ▼ │ ┌────────┴──────────────────────────────┴──────────────────────┐ │ MPC 计算层 (真正执行 TSS 协议的参与方) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Server Party │ │ Server Party │ │ Server Party │ │ │ │ 1 │ │ 2 │ │ 3 │ │ │ │ (50051) │ │ (50051) │ │ (50051) │ │ │ ├──────────────┤ ├──────────────┤ ├──────────────┤ │ │ │ ✓ 运行 tss-lib│ │ ✓ 运行 tss-lib│ │ ✓ 运行 tss-lib│ │ │ │ ✓ 存储加密分片│ │ ✓ 存储加密分片│ │ ✓ 存储加密分片│ │ │ │ ✓ 参与 TSS │ │ ✓ 参与 TSS │ │ ✓ 参与 TSS │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ Server Party API (无状态) │ │ │ │ 端口: 8083 │ │ │ │ ✓ 为用户设备动态生成密钥分片 │ │ │ │ ✓ 不存储用户分片(返回给调用方) │ │ │ └──────────────────────────────────────────────────┘ │ └───────────────────────────────────────────────────────────────┘ ``` --- ## 2. 服务职责说明 ### 2.1 Account Service - 为什么需要它? **核心职责**: MPC 系统的**统一业务入口** #### 存在的原因: 1. **业务语义转换** - 外部: "创建钱包账户" → 内部: "发起 2-of-3 keygen 会话 + 3 个参与方" - 外部: "交易签名" → 内部: "发起 sign 会话 + 加载账户分片" 2. **账户生命周期管理** - 账户创建/激活/暂停/恢复 - 密钥分片元数据存储 (不是分片本身) - 账户恢复流程编排 3. **认证授权** - 用户登录验证 - API 密钥认证 - JWT 令牌管理 4. **业务编排** - 协调 Session Coordinator 创建会话 - 协调 Server Parties 参与 TSS - 聚合结果并持久化 #### 典型数据存储 (PostgreSQL): ```sql -- 账户表 (不存储私钥!) CREATE TABLE accounts ( id UUID PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, public_key BYTEA NOT NULL, -- 群公钥 threshold_n INT NOT NULL, -- 总参与方数 threshold_t INT NOT NULL, -- 签名阈值 status VARCHAR(50) NOT NULL, created_at TIMESTAMP NOT NULL ); -- 分片元数据表 (存储分片在哪,但不存储分片内容) CREATE TABLE account_shares ( id UUID PRIMARY KEY, account_id UUID REFERENCES accounts(id), share_type VARCHAR(50) NOT NULL, -- user_device / server / recovery party_id VARCHAR(255) NOT NULL, party_index INT NOT NULL, device_type VARCHAR(50), -- android / ios / server storage_location VARCHAR(255), -- 分片存储位置标识 is_active BOOLEAN DEFAULT true, created_at TIMESTAMP NOT NULL ); ``` **关键点**: Account Service 只知道"分片存在于哪里",而不存储实际的加密分片内容。 --- ### 2.2 Session Coordinator - 会话协调器 **核心职责**: MPC 会话的**生命周期管理器** (但不参与计算) #### 主要功能: ```go // 会话状态机 created → waiting → in_progress → completed/failed/expired ``` 1. **会话创建** - 生成 session_id - 为每个参与方生成 join_token (JWT) - 记录会话元数据 2. **参与方管理** - 验证参与方身份 (join_token) - 追踪参与方状态: invited → joined → ready → computing → completed - 控制参与方数量限制 3. **会话编排** - 等待所有参与方就绪 - 触发 TSS 协议启动 - 收集完成状态 4. **超时保护** - 会话过期自动清理 - 防止僵尸会话占用资源 #### 典型数据存储: ```sql -- 会话表 CREATE TABLE mpc_sessions ( id UUID PRIMARY KEY, session_type VARCHAR(50) NOT NULL, -- keygen / sign threshold_n INT NOT NULL, threshold_t INT NOT NULL, status VARCHAR(50) NOT NULL, message_hash BYTEA, -- 签名会话的待签消息 public_key BYTEA, -- keygen 完成后的群公钥 signature BYTEA, -- sign 完成后的签名 created_at TIMESTAMP NOT NULL, expires_at TIMESTAMP NOT NULL ); -- 参与方表 CREATE TABLE session_participants ( id UUID PRIMARY KEY, session_id UUID REFERENCES mpc_sessions(id), party_id VARCHAR(255) NOT NULL, party_index INT NOT NULL, status VARCHAR(50) NOT NULL, device_type VARCHAR(50), joined_at TIMESTAMP ); ``` **关键点**: Coordinator 只管理会话元数据,从不参与 MPC 计算,也看不到密钥分片。 --- ### 2.3 Message Router - 消息路由器 **核心职责**: MPC 参与方之间的**通信基础设施** #### 为什么需要独立的消息路由? TSS 协议需要参与方之间频繁交换消息 (通常 3-9 轮): ``` Round 1: Party 0 → Party 1, Party 2 (承诺值) Round 2: Party 1 → Party 0, Party 2 (秘密分享) Round 3: 所有参与方互相广播 (验证值) ... ``` 如果没有统一路由器,每个参与方需要: - 知道所有其他参与方的网络地址 - 维护 N² 个连接 - 处理离线消息重传 **Message Router 解决的问题:** 1. **P2P 消息中继** - 统一的消息入口 - 自动路由到目标参与方 - 支持广播和点对点 2. **实时推送 (gRPC Stream)** ```protobuf rpc SubscribeMessages(SubscribeRequest) returns (stream MPCMessage); ``` - 长连接推送消息 - 低延迟 (毫秒级) 3. **消息持久化** - 离线参与方的消息缓存 - 消息去重和排序 - 支持轮询回退 (如果 Stream 不可用) 4. **安全性** - 消息是端到端加密的 (tss-lib 加密) - Router 只转发,不解密内容 - 按 session_id 隔离 #### 典型数据流: ``` Party 0 (tss-lib) → Message Router → Party 1 (tss-lib) ↓ ↑ 加密消息 payload 原样转发 (Router 看不懂) (不解密) ``` --- ### 2.4 Server Parties - MPC 计算节点 **核心职责**: **真正执行 TSS 协议的参与方** #### 特点: 1. **运行完整的 tss-lib** - 与客户端地位完全对等 - 执行相同的 Keygen/Signing 算法 2. **存储加密的密钥分片** ``` Server Party 1 → 分片 1 (AES-256-GCM 加密) → PostgreSQL Server Party 2 → 分片 2 (AES-256-GCM 加密) → PostgreSQL Server Party 3 → 分片 3 (AES-256-GCM 加密) → PostgreSQL ``` 3. **物理隔离** - 3 个 Party 独立部署 (可以在不同服务器) - 互相看不到对方的分片 - 任意 2 个被攻破也无法重建私钥 4. **自动参与会话** - 监听 Session Coordinator 的事件 - 自动加入指定的 keygen/sign 会话 - 完成后上报结果 --- ### 2.5 Server Party API - 用户分片生成服务 **核心职责**: 为**用户设备**提供临时分片生成 (无状态) #### 为什么需要它? **场景**: 用户在手机 App 上创建钱包 ``` 问题: 手机端无法直接参与服务端的 MPC 会话 (网络/性能限制) 解决: Server Party API 代表用户参与一次 keygen,生成分片后返回 ``` #### 工作流程: ``` 1. 手机 App 调用: POST /api/v1/keygen/generate-user-share ↓ 2. Server Party API: - 代表用户加入 MPC 会话 - 与 Server Party 1, 2 执行 TSS Keygen - 获得用户的密钥分片 ↓ 3. 返回加密分片给手机 ↓ 4. 手机存储到 Android KeyStore / iOS Secure Enclave ↓ 5. Server Party API 丢弃分片 (不存储) ``` **关键特性**: - **无状态**: 不存储任何分片 - **即时返回**: 同步 API (等待 keygen 完成) - **端到端加密**: 可选用户公钥加密分片 --- ### 2.6 服务间关系总结 ``` ┌──────────────────────────────────────────────────────┐ │ 关系矩阵 │ ├──────────────────────────────────────────────────────┤ │ │ │ Account Service │ │ ├─ 调用 → Session Coordinator (创建会话) │ │ ├─ 调用 → Server Party API (生成用户分片) │ │ └─ 查询 → Session Coordinator (会话状态) │ │ │ │ Session Coordinator │ │ ├─ 读写 → PostgreSQL (会话元数据) │ │ ├─ 发布 → RabbitMQ (会话事件) │ │ └─ 被调用 ← Server Parties (加入会话) │ │ │ │ Message Router │ │ ├─ 转发 → MPC 消息 (端到端加密) │ │ ├─ 持久化 → PostgreSQL (离线消息) │ │ └─ Stream → gRPC Stream (实时推送) │ │ │ │ Server Parties │ │ ├─ 监听 → RabbitMQ (会话创建事件) │ │ ├─ 调用 → Session Coordinator (加入会话) │ │ ├─ 通信 → Message Router (交换 MPC 消息) │ │ └─ 存储 → PostgreSQL (加密分片) │ │ │ │ Server Party API │ │ ├─ 调用 → Session Coordinator (加入会话) │ │ ├─ 通信 → Message Router (交换 MPC 消息) │ │ └─ 返回 → 用户分片 (不存储) │ │ │ └──────────────────────────────────────────────────────┘ ``` --- ## 3. 标准 MPC 会话类型 ### 3.1 Keygen 会话 (密钥生成) **目的**: 分布式生成 ECDSA 密钥对,无任何单点知道完整私钥 #### 参与方配置: ```json { "threshold_n": 3, // 总共 3 个参与方 "threshold_t": 2, // 至少 2 个参与方才能签名 "participants": [ { "party_id": "user_device_001", "device_type": "android" }, { "party_id": "server_party_1", "device_type": "server" }, { "party_id": "server_party_2", "device_type": "server" } ] } ``` #### 输出: ```json { "public_key": "04a1b2c3d4...", // 群公钥 (以太坊地址) "shares": [ { "party_id": "user_device_001", "share_data": "encrypted_share_1" // 用户分片 (加密) }, { "party_id": "server_party_1", "share_data": "encrypted_share_2" // 服务端存储 }, { "party_id": "server_party_2", "share_data": "encrypted_share_3" // 服务端存储 } ] } ``` #### 常见阈值方案: | 方案 | 场景 | 参与方 | 优势 | |-----|------|--------|------| | 2-of-3 | 个人钱包 | 用户设备 + 2 个服务器 | 用户 + 1 个服务器即可签名 | | 3-of-5 | 企业多签 | 5 个高管 | 需要 3 人同意 (民主决策) | | 2-of-2 | 两方托管 | 用户 + 服务商 | 必须双方同意 | | 4-of-7 | 高安全审批 | 7 个董事会成员 | 需要过半数同意 | --- ### 3.2 Sign 会话 (门限签名) **目的**: 使用密钥分片对消息进行 ECDSA 签名 #### 参与方配置: ```json { "account_id": "uuid-of-account", "message_hash": "a1b2c3d4...", // 待签消息 (SHA-256) "participants": [ { "party_id": "user_device_001", "share_data": "encrypted_share" // 用户提供本地分片 }, { "party_id": "server_party_1" // 服务端自动加载分片 } ] } ``` **注意**: Sign 会话只需要 `threshold_t` 个参与方 (例如 2-of-3 中的 2 个) #### 输出: ```json { "signature": "3045022100...", // DER 编码签名 "r": "a1b2c3d4...", // 签名 R 值 "s": "e5f6g7h8...", // 签名 S 值 "v": 0 // 恢复 ID (以太坊需要) } ``` #### 验证签名: ```javascript // 以太坊 / 比特币标准验证 const publicKey = "04a1b2c3d4..."; const messageHash = "hash_of_transaction"; const signature = { r, s, v }; const isValid = ecrecover(messageHash, signature) === publicKey; ``` --- ### 3.3 恢复会话 (密钥恢复) **场景**: 用户丢失手机,需要恢复钱包 #### 两种恢复方案: **方案 A: 使用恢复分片 (推荐)** ``` 初始 Keygen: user_device + server_1 + recovery_backup (3 方) 用户丢失设备后: → 使用 recovery_backup + server_1 执行 Sign (2-of-3 仍可用) → 生成新的 user_device_new 分片 (重新 keygen) ``` **方案 B: 社交恢复** ``` 初始 Keygen: user + server + guardian_1 + guardian_2 + guardian_3 (5 方, 3-of-5) 用户丢失设备后: → 联系 3 个 guardians → 执行新的 keygen 生成新分片 ``` --- ## 4. 集成方式 ### 4.1 推荐架构 ``` ┌────────────────────────────────────────────────┐ │ 您的后端服务架构 │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ API Gateway │ │ Wallet Service│ │ │ │ (Kong/Nginx) │─────►│ │ │ │ └──────────────┘ │ • 用户管理 │ │ │ │ • 交易构建 │ │ │ │ • 余额查询 │ │ │ └───────┬──────┘ │ │ │ │ └────────────────────────────────┼───────────────┘ │ 调用 MPC-System API │ ┌────────────────────────────────▼───────────────┐ │ MPC-System (独立部署) │ │ ┌──────────────────────────────────────┐ │ │ │ Account Service: http://mpc:4000 │ │ │ └──────────────────────────────────────┘ │ └────────────────────────────────────────────────┘ ``` ### 4.2 环境配置 **方式 1: Docker Compose (开发/测试)** ```yaml # docker-compose.yml version: '3.8' services: # 您的服务 wallet-service: build: ./wallet-service environment: - MPC_BASE_URL=http://mpc-account-service:4000 - MPC_API_KEY=your_secure_api_key depends_on: - mpc-account-service # MPC 系统 (一键部署) mpc-account-service: image: rwadurian/mpc-account-service:latest ports: - "4000:8080" environment: - MPC_API_KEY=your_secure_api_key - DATABASE_URL=postgresql://... depends_on: - mpc-session-coordinator - mpc-postgres mpc-session-coordinator: image: rwadurian/mpc-session-coordinator:latest # ... 其他配置 # ... 其他 MPC 服务 ``` **方式 2: Kubernetes (生产)** ```yaml # values.yaml mpc: accountService: enabled: true replicaCount: 3 image: rwadurian/mpc-account-service:v1.0.0 sessionCoordinator: enabled: true replicaCount: 2 serverParties: count: 3 resources: requests: memory: "2Gi" cpu: "1000m" ``` --- ## 5. 完整示例代码 ### 5.1 场景: 用户创建钱包 #### 步骤 1: 创建 Keygen 会话 ```bash # HTTP API POST http://mpc-account-service:4000/api/v1/mpc/keygen Content-Type: application/json X-API-Key: your_api_key { "threshold_n": 3, "threshold_t": 2, "participants": [ { "party_id": "user_device_12345", "device_type": "android", "device_id": "android_device_uuid" }, { "party_id": "server_party_1", "device_type": "server", "platform": "linux" }, { "party_id": "server_party_2", "device_type": "server", "platform": "linux" } ] } ``` **响应**: ```json { "session_id": "550e8400-e29b-41d4-a716-446655440000", "session_type": "keygen", "threshold_n": 3, "threshold_t": 2, "join_tokens": { "user_device_12345": "eyJhbGciOiJIUzI1NiIs...", "server_party_1": "eyJhbGciOiJIUzI1NiIs...", "server_party_2": "eyJhbGciOiJIUzI1NiIs..." }, "status": "created" } ``` #### 步骤 2: 为用户生成分片 ```bash # 调用 Server Party API 代表用户参与 keygen POST http://mpc-server-party-api:8083/api/v1/keygen/generate-user-share Content-Type: application/json X-API-Key: your_api_key { "session_id": "550e8400-e29b-41d4-a716-446655440000", "party_id": "user_device_12345", "join_token": "eyJhbGciOiJIUzI1NiIs...", "user_public_key": "optional_hex_for_e2e_encryption" } ``` **响应 (大约 30-90 秒后)**: ```json { "success": true, "session_id": "550e8400-e29b-41d4-a716-446655440000", "party_id": "user_device_12345", "party_index": 0, "share_data": "a1b2c3d4e5f6...", // 加密的用户分片 (hex) "public_key": "04a1b2c3d4e5f6..." // 群公钥 } ``` #### 步骤 3: 将分片和公钥返回给用户 ```javascript // 前端 (React Native / Flutter) const response = await createWallet(userId); // 存储分片到设备安全存储 await SecureStore.setItemAsync( `wallet_share_${userId}`, response.share_data ); // 存储公钥 (用于显示地址) const ethereumAddress = publicKeyToAddress(response.public_key); await AsyncStorage.setItem(`wallet_address_${userId}`, ethereumAddress); ``` --- ### 5.2 场景: 用户签名交易 #### 步骤 1: 构建交易并计算哈希 ```javascript // 后端: 构建以太坊交易 const txParams = { to: "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb", value: ethers.utils.parseEther("1.0"), gasLimit: 21000, gasPrice: ethers.utils.parseUnits("50", "gwei"), nonce: await provider.getTransactionCount(walletAddress), chainId: 1 }; const txHash = ethers.utils.keccak256( ethers.utils.serializeTransaction(txParams) ); // txHash: 0xa1b2c3d4e5f6... ``` #### 步骤 2: 创建 Sign 会话 ```bash POST http://mpc-account-service:4000/api/v1/mpc/sign Content-Type: application/json X-API-Key: your_api_key { "account_id": "user_account_uuid", "message_hash": "a1b2c3d4e5f6...", // 去掉 0x 前缀 "participants": [ { "party_id": "user_device_12345", "device_type": "android" }, { "party_id": "server_party_1", "device_type": "server" } ] } ``` **响应**: ```json { "session_id": "660e8400-e29b-41d4-a716-446655440001", "session_type": "sign", "account_id": "user_account_uuid", "message_hash": "a1b2c3d4e5f6...", "threshold_t": 2, "join_tokens": { "user_device_12345": "eyJhbGciOiJIUzI1NiIs...", "server_party_1": "eyJhbGciOiJIUzI1NiIs..." }, "status": "created" } ``` #### 步骤 3: 使用用户分片参与签名 ```bash POST http://mpc-server-party-api:8083/api/v1/sign/with-user-share Content-Type: application/json X-API-Key: your_api_key { "session_id": "660e8400-e29b-41d4-a716-446655440001", "party_id": "user_device_12345", "join_token": "eyJhbGciOiJIUzI1NiIs...", "share_data": "a1b2c3d4e5f6...", // 用户的加密分片 (从设备存储读取) "message_hash": "a1b2c3d4e5f6..." } ``` **响应 (大约 5-15 秒后)**: ```json { "success": true, "session_id": "660e8400-e29b-41d4-a716-446655440001", "party_id": "user_device_12345", "signature": "3045022100a1b2c3...", "r": "a1b2c3d4e5f6...", "s": "e5f6g7h8i9j0...", "v": 0 } ``` #### 步骤 4: 广播交易到区块链 ```javascript // 组装完整签名 const signedTx = ethers.utils.serializeTransaction(txParams, { r: "0x" + response.r, s: "0x" + response.s, v: response.v }); // 广播到以太坊网络 const txResponse = await provider.sendTransaction(signedTx); const receipt = await txResponse.wait(); console.log("Transaction hash:", receipt.transactionHash); ``` --- ### 5.3 Go SDK 示例 ```go package main import ( "context" "fmt" "github.com/rwadurian/mpc-client-sdk-go" ) func main() { // 初始化 MPC 客户端 client := mpc.NewClient(&mpc.Config{ BaseURL: "http://mpc-account-service:4000", APIKey: "your_api_key", Timeout: 5 * time.Minute, }) ctx := context.Background() // 创建钱包 keygenReq := &mpc.KeygenRequest{ ThresholdN: 3, ThresholdT: 2, Participants: []mpc.Participant{ {PartyID: "user_device", DeviceType: "android"}, {PartyID: "server_party_1", DeviceType: "server"}, {PartyID: "server_party_2", DeviceType: "server"}, }, } keygenResp, err := client.CreateKeygen(ctx, keygenReq) if err != nil { panic(err) } fmt.Printf("Session ID: %s\n", keygenResp.SessionID) fmt.Printf("Join Token: %s\n", keygenResp.JoinTokens["user_device"]) // 生成用户分片 shareReq := &mpc.GenerateUserShareRequest{ SessionID: keygenResp.SessionID, PartyID: "user_device", JoinToken: keygenResp.JoinTokens["user_device"], } shareResp, err := client.GenerateUserShare(ctx, shareReq) if err != nil { panic(err) } fmt.Printf("Public Key: %s\n", shareResp.PublicKey) fmt.Printf("User Share: %s\n", shareResp.ShareData) // 存储分片到数据库 // ... // 稍后签名交易 signReq := &mpc.SignRequest{ AccountID: "user_account_uuid", MessageHash: "a1b2c3d4e5f6...", Participants: []mpc.SignParticipant{ {PartyID: "user_device", ShareData: shareResp.ShareData}, {PartyID: "server_party_1"}, }, } signResp, err := client.CreateSign(ctx, signReq) if err != nil { panic(err) } fmt.Printf("Signature R: %s\n", signResp.R) fmt.Printf("Signature S: %s\n", signResp.S) } ``` --- ### 5.4 Python SDK 示例 ```python from mpc_client import MPCClient # 初始化客户端 client = MPCClient( base_url="http://mpc-account-service:4000", api_key="your_api_key" ) # 创建钱包 keygen_response = client.create_keygen( threshold_n=3, threshold_t=2, participants=[ {"party_id": "user_device", "device_type": "ios"}, {"party_id": "server_party_1", "device_type": "server"}, {"party_id": "server_party_2", "device_type": "server"}, ] ) print(f"Session ID: {keygen_response.session_id}") # 生成用户分片 share_response = client.generate_user_share( session_id=keygen_response.session_id, party_id="user_device", join_token=keygen_response.join_tokens["user_device"] ) print(f"Public Key: {share_response.public_key}") print(f"User Share: {share_response.share_data}") # 签名交易 sign_response = client.sign_transaction( account_id="user_account_uuid", message_hash="a1b2c3d4e5f6...", participants=[ {"party_id": "user_device", "share_data": share_response.share_data}, {"party_id": "server_party_1"} ] ) print(f"Signature: {sign_response.signature}") ``` --- ## 6. 故障排查 ### 6.1 常见错误 #### 错误 1: "session not found" **原因**: 会话已过期或不存在 **解决**: ```bash # 检查会话状态 GET http://mpc-account-service:4000/api/v1/mpc/sessions/{session_id} # 会话默认 10 分钟过期,确保在有效期内完成操作 ``` #### 错误 2: "insufficient participants" **原因**: 参与方数量不足 **解决**: ```json // 确保 Sign 会话至少有 threshold_t 个参与方 { "account_id": "...", "participants": [ {"party_id": "user_device"}, {"party_id": "server_party_1"} // 2-of-3 需要至少 2 个 ] } ``` #### 错误 3: "invalid join token" **原因**: Token 过期或被篡改 **解决**: - 重新创建会话获取新 token - 检查服务端时钟同步 (JWT 依赖时间) #### 错误 4: "keygen failed: timeout" **原因**: TSS 协议执行超时 **排查步骤**: ```bash # 1. 检查 Server Parties 是否都在运行 docker compose ps | grep server-party # 2. 查看 Message Router 日志 docker compose logs message-router | grep ERROR # 3. 检查网络连通性 docker compose exec server-party-1 nc -zv message-router 50051 ``` --- ### 6.2 性能优化 #### Keygen 性能 | 阈值方案 | 预期时间 | 优化建议 | |---------|---------|---------| | 2-of-3 | 30-60s | 正常 | | 3-of-5 | 90-120s | 增加 CPU 资源 | | 4-of-7 | 180-240s | 考虑异步处理 | #### Sign 性能 | 阈值方案 | 预期时间 | 优化建议 | |---------|---------|---------| | 2-of-3 | 5-10s | 正常 | | 3-of-5 | 10-15s | 使用 gRPC Stream | | 4-of-7 | 15-20s | 批量签名 | #### 并发优化 ```yaml # docker-compose.yml services: mpc-session-coordinator: deploy: replicas: 3 # 水平扩展 resources: limits: cpus: '2' memory: 2G ``` --- ### 6.3 监控指标 **关键指标**: ```yaml # Prometheus metrics mpc_keygen_duration_seconds{quantile="0.95"} < 120 mpc_sign_duration_seconds{quantile="0.95"} < 15 mpc_session_success_rate > 0.99 mpc_active_sessions < 100 ``` **日志示例**: ``` [INFO] Session 550e8400 created: type=keygen, participants=3 [INFO] Party user_device joined session 550e8400 [INFO] Party server_party_1 joined session 550e8400 [INFO] Session 550e8400 started: all parties ready [INFO] Keygen completed: session=550e8400, duration=45.2s ``` --- ## 7. 安全建议 ### 7.1 API 密钥管理 ```bash # 生成强密钥 openssl rand -base64 48 # 环境变量方式 (推荐) export MPC_API_KEY="your_generated_key" # 定期轮换 (每 90 天) ``` ### 7.2 网络隔离 ```yaml # docker-compose.yml networks: mpc-internal: internal: true # 内部服务网络 public: driver: bridge # 外部访问网络 services: mpc-account-service: networks: - public # 暴露给外部 - mpc-internal mpc-session-coordinator: networks: - mpc-internal # 仅内部访问 ``` ### 7.3 审计日志 ```sql -- 记录所有 MPC 操作 CREATE TABLE mpc_audit_logs ( id SERIAL PRIMARY KEY, session_id UUID NOT NULL, operation VARCHAR(50) NOT NULL, user_id VARCHAR(255), ip_address INET, user_agent TEXT, request_body JSONB, response_status INT, created_at TIMESTAMP DEFAULT NOW() ); -- 查询异常活动 SELECT * FROM mpc_audit_logs WHERE response_status >= 400 AND created_at > NOW() - INTERVAL '1 hour'; ``` --- ## 8. 附录 ### 8.1 完整 API 参考 详细 API 文档请参考: - [Account Service API](docs/02-api-reference.md#account-service-api) - [Session Coordinator gRPC](api/proto/session_coordinator.proto) - [Message Router gRPC](api/proto/message_router.proto) ### 8.2 SDK 下载 - Go SDK: `go get github.com/rwadurian/mpc-client-sdk-go` - Python SDK: `pip install mpc-client-sdk` - JavaScript SDK: `npm install @rwadurian/mpc-client-sdk` ### 8.3 联系支持 - GitHub Issues: https://github.com/rwadurian/mpc-system/issues - Email: mpc-support@rwadurian.com - 文档: https://docs.rwadurian.com/mpc-system --- **文档版本**: 1.0.0 **最后更新**: 2025-12-05 **适用于**: MPC-System v1.0.0+