11 KiB
分布式多方共管钱包创建功能实现计划
概述
为 RWADurian 项目实现分布式多方共管钱包创建功能,包括:
- Admin-Web 扩展: 在授权管理页面添加创建共管钱包入口
- Service-Party 桌面应用: 跨平台 Electron 应用,用户可在各自电脑上参与钱包创建
系统架构
+-------------------+ +-------------------+ +-------------------+
| Admin Web | | Service Party | | Service Party |
| (发起者/管理员) | | Desktop App #1 | | Desktop App #2 |
+--------+----------+ +--------+----------+ +--------+----------+
| | |
| HTTP/WebSocket | gRPC | gRPC
| | |
v v v
+--------+-----------------------------+-----------------------------+----------+
| Message Router (现有 gRPC 服务) |
| backend/mpc-system/services/message-router |
+--------+-----------------------------+-----------------------------+----------+
| | |
v v v
+-------------------+ +----------------------------------------+
| Session | | TSS Keygen Protocol (分布式执行) |
| Coordinator | | 所有参与方通过 Message Router 交换消息|
+-------------------+ +----------------------------------------+
第一阶段:Admin-Web 扩展
1.1 修改授权管理页面
文件: frontend/admin-web/src/app/(dashboard)/authorization/page.tsx
添加"创建共管钱包"卡片区域:
- 配置钱包名称
- 配置阈值 (T-of-N)
- 生成邀请链接/二维码
- 实时显示参与方加入状态
1.2 新增组件
目录: frontend/admin-web/src/components/features/co-managed-wallet/
| 文件 | 功能 |
|---|---|
CreateWalletModal.tsx |
创建钱包向导对话框 |
ThresholdConfig.tsx |
阈值配置 (T-of-N) |
InviteQRCode.tsx |
邀请二维码生成 |
ParticipantList.tsx |
参与方列表实时状态 |
SessionProgress.tsx |
Keygen 进度显示 |
WalletResult.tsx |
创建结果展示 |
1.3 新增 API 服务
文件: frontend/admin-web/src/services/coManagedWalletService.ts
export const coManagedWalletService = {
// 创建共管钱包会话
createSession(params: {
walletName: string;
thresholdT: number;
thresholdN: number;
}): Promise<SessionResponse>;
// 获取会话状态
getSessionStatus(sessionId: string): Promise<SessionStatus>;
// WebSocket 订阅会话更新
subscribeSession(sessionId: string, onUpdate: (status: SessionStatus) => void): () => void;
};
1.4 新增 React Query Hooks
文件: frontend/admin-web/src/hooks/useCoManagedWallet.ts
export function useCreateCoManagedWallet();
export function useCoManagedWalletSession(sessionId: string);
export function useCoManagedWalletList();
第二阶段:Service-Party 桌面应用
2.1 项目结构
新项目目录: backend/mpc-system/services/service-party-app/
backend/mpc-system/services/service-party-app/
├── electron/
│ ├── main.ts # Electron 主进程
│ ├── preload.ts # 预加载脚本
│ └── modules/
│ ├── grpc-client.ts # gRPC 客户端 (连接 Message Router)
│ ├── tss-handler.ts # TSS 协议处理
│ ├── storage.ts # 本地加密存储
│ └── server.ts # 内置 HTTP 服务器
├── src/
│ ├── App.tsx
│ ├── pages/
│ │ ├── Home.tsx # 主页 - Share 列表
│ │ ├── Join.tsx # 加入会话页面
│ │ ├── Session.tsx # 会话进度页面
│ │ └── Settings.tsx # 设置页面
│ ├── components/
│ │ ├── ShareCard.tsx # Share 卡片
│ │ ├── JoinForm.tsx # 加入会话表单
│ │ ├── ProgressSteps.tsx # 进度步骤
│ │ ├── ExportDialog.tsx # 导出对话框
│ │ └── ImportDialog.tsx # 导入对话框
│ └── hooks/
│ ├── useGrpc.ts # gRPC 连接 Hook
│ ├── useSession.ts # 会话状态 Hook
│ └── useStorage.ts # 本地存储 Hook
├── wasm/
│ └── tss_lib.wasm # TSS 库 WASM 编译版
├── package.json
├── electron-builder.json # Electron 打包配置
└── tsconfig.json
2.2 技术选型
| 组件 | 技术 | 说明 |
|---|---|---|
| 桌面框架 | Electron 28+ | 跨平台支持 Windows/Mac/Linux |
| 前端框架 | React 18 + TypeScript | 与 admin-web 保持一致 |
| 状态管理 | Zustand | 轻量级状态管理 |
| gRPC 客户端 | @grpc/grpc-js | Node.js gRPC 实现 |
| TSS 协议 | Go -> WASM | 编译 tss-lib 到 WebAssembly |
| 本地存储 | electron-store | 加密本地存储 |
| 加密 | Node.js crypto | AES-256-GCM 加密 |
| 打包 | electron-builder | 多平台打包 |
2.3 核心功能实现
gRPC 客户端模块
文件: electron/modules/grpc-client.ts
连接到现有 Message Router,实现以下接口:
RegisterParty()- 注册为参与方Heartbeat()- 心跳保活SubscribeSessionEvents()- 订阅会话事件JoinSession()- 加入会话SubscribeMessages()- 订阅 MPC 消息RouteMessage()- 发送 MPC 消息ReportCompletion()- 报告完成
TSS 协议处理
文件: electron/modules/tss-handler.ts
参考现有实现: backend/mpc-system/services/server-party/application/use_cases/participate_keygen.go
class TSSHandler {
// 参与 keygen
async participateKeygen(sessionInfo: SessionInfo): Promise<KeygenResult>;
// 参与 signing (未来扩展)
async participateSigning(sessionInfo: SessionInfo, messageHash: string): Promise<SignResult>;
}
本地加密存储
文件: electron/modules/storage.ts
interface ShareEntry {
id: string;
sessionId: string;
walletName: string;
partyId: string;
partyIndex: number;
threshold: { t: number; n: number };
publicKey: string;
encryptedShare: string; // AES-256-GCM 加密
createdAt: string;
metadata: {
participants: Array<{ partyId: string; name: string }>;
};
}
class SecureStorage {
saveShare(share: ShareEntry, password: string): void;
loadShare(id: string, password: string): ShareEntry;
listShares(): ShareEntry[];
exportShare(id: string, password: string): Buffer; // 加密导出文件
importShare(data: Buffer, password: string): ShareEntry;
}
2.4 用户界面
主页 (Share 列表)
- 显示已保存的 share 列表
- 每个 share 显示:钱包名称、公钥、创建时间、参与方数量
- 操作:导出备份、删除
加入会话页面
- 输入/粘贴邀请链接
- 或扫描二维码 (使用摄像头)
- 输入参与者名称
- 显示会话信息确认
会话进度页面
- 显示当前状态:等待其他参与方 / Keygen 进行中 / 完成
- 参与方列表及其状态
- 进度条显示 Keygen 轮次
设置页面
- Message Router 连接地址配置
- 存储密码管理
- 自动备份设置
第三阶段:后端扩展
3.1 Admin-Service API 扩展
目录: backend/services/admin-service/src/modules/co-managed-wallet/
| 文件 | 功能 |
|---|---|
co-managed-wallet.module.ts |
模块定义 |
co-managed-wallet.controller.ts |
REST 控制器 |
co-managed-wallet.service.ts |
业务逻辑 |
co-managed-wallet.gateway.ts |
WebSocket 网关 |
API 端点:
POST /api/v1/co-managed-wallets/sessions
创建共管钱包会话
GET /api/v1/co-managed-wallets/sessions/:id
获取会话状态
GET /api/v1/co-managed-wallets
获取共管钱包列表
WebSocket /co-managed-wallets/:sessionId
实时会话状态推送
3.2 Session Coordinator 扩展
文件: backend/mpc-system/services/session-coordinator/application/use_cases/create_co_managed_session.go
扩展现有 create_session.go,支持:
co_managed_keygen会话类型- 邀请码生成
- 参与方名称管理
实现步骤
Step 1: Admin-Web 基础 UI (2-3天)
- 在 authorization 页面添加"共管钱包"卡片
- 实现 CreateWalletModal 组件
- 实现阈值配置 UI
Step 2: 后端 API (2-3天)
- 实现 admin-service 的共管钱包 API
- 扩展 Session Coordinator 支持新会话类型
- 实现 WebSocket 状态推送
Step 3: Admin-Web 完善 (2天)
- 实现邀请链接/二维码生成
- 实现参与方列表实时更新
- 实现会话状态显示
Step 4: Service-Party 脚手架 (2天)
- 创建 Electron 项目结构
- 配置 React + TypeScript
- 实现基础 UI 框架
Step 5: gRPC 集成 (3天)
- 复制 proto 文件
- 实现 gRPC 客户端
- 实现会话订阅和消息处理
Step 6: TSS 集成 (5天)
- 编译 tss-lib 到 WASM
- 实现 TSS 协议处理器
- 集成到 Electron 应用
Step 7: 本地存储 (2天)
- 实现加密存储模块
- 实现导出/导入功能
- 实现备份下载
Step 8: 测试与优化 (3天)
- 端到端测试
- 多机/多网络测试
- 错误处理优化
关键文件清单
需要修改的现有文件
| 文件路径 | 修改内容 |
|---|---|
frontend/admin-web/src/app/(dashboard)/authorization/page.tsx |
添加共管钱包入口卡片 |
frontend/admin-web/src/infrastructure/api/endpoints.ts |
添加共管钱包 API 端点 |
backend/mpc-system/services/session-coordinator/domain/entities/session.go |
扩展会话类型 |
需要新增的文件
| 文件路径 | 说明 |
|---|---|
frontend/admin-web/src/components/features/co-managed-wallet/* |
前端组件 (6个文件) |
frontend/admin-web/src/services/coManagedWalletService.ts |
API 服务 |
frontend/admin-web/src/hooks/useCoManagedWallet.ts |
React Query Hooks |
backend/mpc-system/services/service-party-app/* |
整个桌面应用项目 |
backend/services/admin-service/src/modules/co-managed-wallet/* |
后端模块 (4个文件) |
技术风险与解决方案
风险1: TSS 库编译到 WASM
问题: Go 的 tss-lib 使用了大量加密原语,编译到 WASM 可能有兼容性问题
解决方案:
- 优先尝试 TinyGo 编译
- 备选方案:编译为动态库 (.dll/.so/.dylib),通过 ffi-napi 调用
风险2: 网络连通性
问题: 参与方可能在 NAT 后或防火墙内
解决方案:
- Message Router 部署在公网,所有客户端主动连接
- gRPC 使用 HTTP/2,对防火墙友好
- 实现断线重连和消息重发
风险3: Share 安全
问题: 本地存储的 share 可能被恶意软件窃取
解决方案:
- AES-256-GCM 加密,密钥由用户密码派生 (PBKDF2)
- 可选集成硬件安全密钥
- 提醒用户备份到安全位置
预计工时
| 阶段 | 工时 |
|---|---|
| Admin-Web 扩展 | 5-7天 |
| Service-Party 桌面应用 | 12-15天 |
| 后端扩展 | 3-4天 |
| 测试与优化 | 3-5天 |
| 总计 | 23-31天 |