fix(mpc-system): GetSessionStatus API 返回 threshold_t 和 threshold_n
问题: - Account 服务的 GetSessionStatus HTTP API 没有返回 threshold 字段 - 导致 service-party-app 获取到的 threshold 始终是 0 - TSS keygen 无法使用正确的阈值参数 修复: - Account gRPC client 添加 ThresholdT 和 ThresholdN 字段映射 - Account HTTP handler 返回 threshold_t 和 threshold_n - service-party-app 优先使用后端返回的 threshold 值 - checkAndTriggerKeygen 使用后端 threshold 更新 activeKeygenSession 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
fb1b27e36f
commit
674bc9e5cd
|
|
@ -314,6 +314,8 @@ func (h *CoManagedHTTPHandler) GetSessionStatus(c *gin.Context) {
|
||||||
"session_id": sessionID,
|
"session_id": sessionID,
|
||||||
"status": resp.Status,
|
"status": resp.Status,
|
||||||
"session_type": resp.SessionType,
|
"session_type": resp.SessionType,
|
||||||
|
"threshold_t": resp.ThresholdT,
|
||||||
|
"threshold_n": resp.ThresholdN,
|
||||||
"completed_parties": resp.CompletedParties,
|
"completed_parties": resp.CompletedParties,
|
||||||
"total_parties": resp.TotalParties,
|
"total_parties": resp.TotalParties,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -225,6 +225,8 @@ func (c *SessionCoordinatorClient) GetSessionStatus(
|
||||||
Status: resp.Status,
|
Status: resp.Status,
|
||||||
CompletedParties: resp.CompletedParties,
|
CompletedParties: resp.CompletedParties,
|
||||||
TotalParties: resp.TotalParties,
|
TotalParties: resp.TotalParties,
|
||||||
|
ThresholdT: resp.ThresholdT,
|
||||||
|
ThresholdN: resp.ThresholdN,
|
||||||
SessionType: resp.SessionType,
|
SessionType: resp.SessionType,
|
||||||
PublicKey: resp.PublicKey,
|
PublicKey: resp.PublicKey,
|
||||||
Signature: resp.Signature,
|
Signature: resp.Signature,
|
||||||
|
|
@ -293,6 +295,8 @@ type SessionStatusResponse struct {
|
||||||
Status string
|
Status string
|
||||||
CompletedParties int32
|
CompletedParties int32
|
||||||
TotalParties int32
|
TotalParties int32
|
||||||
|
ThresholdT int32 // Minimum parties needed to sign (e.g., 2 in 2-of-3)
|
||||||
|
ThresholdN int32 // Total number of parties required (e.g., 3 in 2-of-3)
|
||||||
SessionType string // "keygen" or "sign"
|
SessionType string // "keygen" or "sign"
|
||||||
PublicKey []byte
|
PublicKey []byte
|
||||||
Signature []byte
|
Signature []byte
|
||||||
|
|
|
||||||
|
|
@ -166,10 +166,13 @@ async function checkAndTriggerKeygen(sessionId: string) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const expectedN = status.total_parties || activeKeygenSession.threshold.n;
|
// 优先使用后端返回的 threshold 值
|
||||||
|
const thresholdN = status.threshold_n || status.total_parties || activeKeygenSession.threshold.n;
|
||||||
|
const thresholdT = status.threshold_t || activeKeygenSession.threshold.t;
|
||||||
|
const expectedN = thresholdN;
|
||||||
const currentParticipants = status.participants?.length || 0;
|
const currentParticipants = status.participants?.length || 0;
|
||||||
|
|
||||||
debugLog.debug('main', `Session ${sessionId} status: ${status.status}, participants: ${currentParticipants}/${expectedN}`);
|
debugLog.debug('main', `Session ${sessionId} status: ${status.status}, participants: ${currentParticipants}/${expectedN}, threshold: ${thresholdT}-of-${thresholdN}`);
|
||||||
|
|
||||||
// 检查是否满足启动条件
|
// 检查是否满足启动条件
|
||||||
const hasAllParticipants = currentParticipants >= expectedN;
|
const hasAllParticipants = currentParticipants >= expectedN;
|
||||||
|
|
@ -207,13 +210,16 @@ async function checkAndTriggerKeygen(sessionId: string) {
|
||||||
})))}`);
|
})))}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新 activeKeygenSession 的 threshold(使用后端返回的正确值)
|
||||||
|
activeKeygenSession.threshold = { t: thresholdT, n: thresholdN };
|
||||||
|
|
||||||
const selectedParties = activeKeygenSession.participants.map(p => p.partyId);
|
const selectedParties = activeKeygenSession.participants.map(p => p.partyId);
|
||||||
|
|
||||||
await handleSessionStart({
|
await handleSessionStart({
|
||||||
eventType: 'session_started',
|
eventType: 'session_started',
|
||||||
sessionId: sessionId,
|
sessionId: sessionId,
|
||||||
thresholdN: activeKeygenSession.threshold.n,
|
thresholdN: thresholdN,
|
||||||
thresholdT: activeKeygenSession.threshold.t,
|
thresholdT: thresholdT,
|
||||||
selectedParties: selectedParties,
|
selectedParties: selectedParties,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -869,8 +875,11 @@ function setupIpcHandlers() {
|
||||||
ipcMain.handle('grpc:getSessionStatus', async (_event, { sessionId }) => {
|
ipcMain.handle('grpc:getSessionStatus', async (_event, { sessionId }) => {
|
||||||
try {
|
try {
|
||||||
const result = await accountClient?.getSessionStatus(sessionId);
|
const result = await accountClient?.getSessionStatus(sessionId);
|
||||||
// 从 activeKeygenSession 获取更完整的信息
|
// 优先使用后端返回的 threshold,否则从 activeKeygenSession 获取
|
||||||
const threshold = activeKeygenSession?.threshold || { t: 0, n: result?.total_parties || 0 };
|
const threshold = {
|
||||||
|
t: result?.threshold_t || activeKeygenSession?.threshold?.t || 0,
|
||||||
|
n: result?.threshold_n || result?.total_parties || activeKeygenSession?.threshold?.n || 0,
|
||||||
|
};
|
||||||
const participants = result?.participants?.map((p, idx) => ({
|
const participants = result?.participants?.map((p, idx) => ({
|
||||||
partyId: p.party_id,
|
partyId: p.party_id,
|
||||||
partyIndex: p.party_index,
|
partyIndex: p.party_index,
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,8 @@ export interface ParticipantStatusInfo {
|
||||||
export interface GetSessionStatusResponse {
|
export interface GetSessionStatusResponse {
|
||||||
session_id: string;
|
session_id: string;
|
||||||
status: string;
|
status: string;
|
||||||
|
threshold_t: number; // Minimum parties needed to sign (e.g., 2 in 2-of-3)
|
||||||
|
threshold_n: number; // Total number of parties required (e.g., 3 in 2-of-3)
|
||||||
completed_parties: number;
|
completed_parties: number;
|
||||||
total_parties: number;
|
total_parties: number;
|
||||||
session_type: string;
|
session_type: string;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue