From 71eea98ea541f547b1ef772d0b1efae0adeb85fb Mon Sep 17 00:00:00 2001 From: hailin Date: Tue, 27 Jan 2026 08:03:28 -0800 Subject: [PATCH] =?UTF-8?q?fix(android):=20=E4=BF=AE=E5=A4=8D=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E5=88=9B=E5=BB=BAMPC=E8=B4=A6=E6=88=B7=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: - 用户第一次创建MPC账户成功后返回钱包界面 - 再次创建新的MPC账户时,keygen无法自动开始 - 原因是第一次keygen完成后错误地取消了全局会话事件订阅 根本原因分析: 1. startKeygenAsInitiator() 完成时调用了 sessionEventJob?.cancel() 2. sessionEventJob 是在 registerParty() 时启动的全局事件订阅 3. 取消后,新创建的keygen会话无法接收 session_started 事件 4. 导致keygen无法自动触发 对比发现: - Sign流程在开始前会调用 ensureSessionEventSubscriptionActive() 检查订阅状态 - Keygen流程没有这个检查,存在不一致性 修复方案: 1. 删除 startKeygenAsInitiator() 中的 sessionEventJob?.cancel() - 全局订阅不应该在单次操作完成后取消 - 只在 cancelSession() 和断开连接时才取消 2. 在 createKeygenSession() 开头添加 ensureSessionEventSubscriptionActive() - 与sign流程保持一致 - 即使有其他代码意外取消订阅,也能自我恢复 影响范围: - TssRepository.kt: startKeygenAsInitiator(), createKeygenSession() Co-Authored-By: Claude Opus 4.5 --- .../com/durian/tssparty/data/repository/TssRepository.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt index 8033d9cf..eeb3c81f 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt @@ -642,6 +642,10 @@ class TssRepository @Inject constructor( thresholdN: Int, participantName: String ): Result { + // Ensure session event subscription is active before creating keygen session + // This handles the case where a previous keygen might have left the subscription inactive + ensureSessionEventSubscriptionActive() + return withContext(Dispatchers.IO) { try { val jsonMediaType = "application/json; charset=utf-8".toMediaType() @@ -1975,7 +1979,8 @@ class TssRepository @Inject constructor( stopProgressCollection() _sessionStatus.value = SessionStatus.COMPLETED pendingSessionId = null // Clear pending session ID on completion - sessionEventJob?.cancel() + // NOTE: Do NOT cancel sessionEventJob here - it's a global subscription + // that should remain active for subsequent keygen/sign sessions Result.success(shareEntity.copy(id = id).toShareRecord())