## 问题根因 备份恢复后的钱包在签名时失败,根本原因是 gRPC 通信使用了**设备的 partyId**, 而不是 **share 的原始 partyId**(keygen 时生成的 partyId)。 这导致: 1. 消息订阅使用错误的 partyId,无法接收其他参与方发送的消息 2. 消息发送使用错误的 fromParty,其他参与方无法正确路由消息 3. Session 事件订阅使用错误的 partyId,无法接收 session_started 等事件 4. API 调用使用错误的 partyId,服务端无法正确识别参与方 ## 修改内容 ### 1. 添加新的成员变量用于跟踪正确的 partyId - `currentMessageRoutingPartyId`: 消息路由使用的 partyId - `currentSessionEventPartyId`: Session 事件订阅使用的 partyId ### 2. 修改 startMessageRouting 方法 - 添加 `routingPartyId` 可选参数 - 签名流程中使用 signingPartyId(share 原始 partyId) - 消息发送 (routeMessage fromParty) 使用正确的 partyId - 消息订阅 (subscribeMessages) 使用正确的 partyId ### 3. 修改 startSessionEventSubscription 方法 - 添加 `subscriptionPartyId` 可选参数 - 签名流程中使用 signingPartyId ### 4. 修改 ensureSessionEventSubscriptionActive 方法 - 添加 `signingPartyId` 可选参数 - 支持动态切换订阅的 partyId ### 5. 修复所有签名流程中的调用 #### joinSignSessionViaGrpc 流程: - grpcClient.joinSession 使用 signingPartyId - startMessageRouting 使用 signingPartyId - ensureSessionEventSubscriptionActive 使用 signingPartyId #### joinSignSessionViaApiAndExecute 流程: - joinSignSessionViaApi HTTP 请求使用 signingPartyId - grpcClient.joinSession 使用 signingPartyId - startMessageRouting 使用 signingPartyId #### createSignSession 流程: - ensureSessionEventSubscriptionActive 使用 signingPartyId - join_tokens 查找使用 originalPartyId - grpcClient.joinSession 使用 signingPartyId - startMessageRouting 使用 signingPartyId #### startSigning 流程: - startMessageRouting 使用 signingPartyId ### 6. 修复 joinSignSessionViaApi 函数 - 添加 signingPartyId 参数 - HTTP 请求体中的 party_id 和 device_id 使用 signingPartyId ### 7. 修复重连恢复逻辑 (restoreStreamsAfterReconnect) - startMessageRouting 使用保存的 currentMessageRoutingPartyId - startSessionEventSubscription 使用保存的 currentSessionEventPartyId ## 测试场景 修复后应支持以下场景: 1. 原设备 keygen → 原设备签名 ✓ 2. 原设备 keygen → 备份 → 新设备恢复 → 新设备发起签名 ✓ 3. 原设备 keygen → 备份 → 新设备恢复 → 新设备参与签名 ✓ Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| .claude | ||
| api-gateway | ||
| infrastructure | ||
| mpc-system | ||
| scripts | ||
| services | ||
| .env.windows | ||
| docker-compose.windows.yml | ||