fix(account): select t+1 parties for threshold signing
TSS threshold semantics: for threshold parameter t, the required number of signers is t+1. For 2-of-3 with t=2, we need 2+1=3 signers (all parties must participate). Previous error: 't+1=3 is not satisfied by the key count of 2' Fix: Changed from selecting t parties to selecting t+1 parties. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
0ea64e02ae
commit
7660868a38
|
|
@ -732,9 +732,10 @@ func (h *AccountHTTPHandler) CreateSigningSession(c *gin.Context) {
|
||||||
zap.String("username", req.Username),
|
zap.String("username", req.Username),
|
||||||
zap.Strings("configured_parties", partyIDs))
|
zap.Strings("configured_parties", partyIDs))
|
||||||
} else {
|
} else {
|
||||||
// For threshold signing, select minimum required parties (threshold_t)
|
// For threshold signing, select minimum required parties (threshold_t + 1)
|
||||||
// For 2-of-3, we need exactly 2 parties to sign (not all 3)
|
// TSS threshold semantics: for threshold t, we need t+1 signers
|
||||||
requiredParties := accountOutput.Account.ThresholdT
|
// For 2-of-3: t=1, so we need t+1=2 parties to sign
|
||||||
|
requiredParties := accountOutput.Account.ThresholdT + 1
|
||||||
if len(allActivePartyIDs) < requiredParties {
|
if len(allActivePartyIDs) < requiredParties {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{
|
c.JSON(http.StatusBadRequest, gin.H{
|
||||||
"error": "insufficient active parties for signing",
|
"error": "insufficient active parties for signing",
|
||||||
|
|
@ -744,12 +745,13 @@ func (h *AccountHTTPHandler) CreateSigningSession(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select first 'threshold_t' parties
|
// Select first 'threshold_t + 1' parties
|
||||||
partyIDs = allActivePartyIDs[:requiredParties]
|
partyIDs = allActivePartyIDs[:requiredParties]
|
||||||
|
|
||||||
logger.Info("Using minimum required parties for threshold signing",
|
logger.Info("Using minimum required parties for threshold signing",
|
||||||
zap.String("username", req.Username),
|
zap.String("username", req.Username),
|
||||||
zap.Int("threshold_t", requiredParties),
|
zap.Int("threshold_t", accountOutput.Account.ThresholdT),
|
||||||
|
zap.Int("required_signers", requiredParties),
|
||||||
zap.Int("total_active", len(allActivePartyIDs)),
|
zap.Int("total_active", len(allActivePartyIDs)),
|
||||||
zap.Strings("selected_parties", partyIDs))
|
zap.Strings("selected_parties", partyIDs))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue