# 分布式多方共管钱包创建功能实现计划

## 概述

为 RWADurian 项目实现分布式多方共管钱包创建功能，包括：
1. **Admin-Web 扩展**: 在授权管理页面添加创建共管钱包入口
2. **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`

```typescript
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`

```typescript
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`

```typescript
class TSSHandler {
  // 参与 keygen
  async participateKeygen(sessionInfo: SessionInfo): Promise<KeygenResult>;

  // 参与 signing (未来扩展)
  async participateSigning(sessionInfo: SessionInfo, messageHash: string): Promise<SignResult>;
}
```

#### 本地加密存储

**文件**: `electron/modules/storage.ts`

```typescript
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天)
1. 在 authorization 页面添加"共管钱包"卡片
2. 实现 CreateWalletModal 组件
3. 实现阈值配置 UI

### Step 2: 后端 API (2-3天)
1. 实现 admin-service 的共管钱包 API
2. 扩展 Session Coordinator 支持新会话类型
3. 实现 WebSocket 状态推送

### Step 3: Admin-Web 完善 (2天)
1. 实现邀请链接/二维码生成
2. 实现参与方列表实时更新
3. 实现会话状态显示

### Step 4: Service-Party 脚手架 (2天)
1. 创建 Electron 项目结构
2. 配置 React + TypeScript
3. 实现基础 UI 框架

### Step 5: gRPC 集成 (3天)
1. 复制 proto 文件
2. 实现 gRPC 客户端
3. 实现会话订阅和消息处理

### Step 6: TSS 集成 (5天)
1. 编译 tss-lib 到 WASM
2. 实现 TSS 协议处理器
3. 集成到 Electron 应用

### Step 7: 本地存储 (2天)
1. 实现加密存储模块
2. 实现导出/导入功能
3. 实现备份下载

### Step 8: 测试与优化 (3天)
1. 端到端测试
2. 多机/多网络测试
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天** |
