@@ -83,6 +83,7 @@ func (p *Node) CreateKeyGenSession(
8383 walletID string ,
8484 threshold int ,
8585 resultQueue messaging.MessageQueue ,
86+ selectedNodeIDs []string ,
8687) (KeyGenSession , error ) {
8788 if ! p .peerRegistry .ArePeersReady () {
8889 return nil , errors .New ("All nodes are not ready!" )
@@ -93,24 +94,43 @@ func (p *Node) CreateKeyGenSession(
9394 return nil , fmt .Errorf ("Key already exists: %s" , walletID )
9495 }
9596
97+ var nodeIDs []string
98+ if len (selectedNodeIDs ) > 0 {
99+ // Use selected node IDs, but filter to only include ready peers
100+ readyPeerIDs := p .peerRegistry .GetReadyPeersIncludeSelf ()
101+ nodeIDs = p .filterReadyPeers (selectedNodeIDs , readyPeerIDs )
102+
103+ // Validate that we have enough ready nodes
104+ if len (nodeIDs ) < threshold + 1 {
105+ return nil , fmt .Errorf ("not enough ready nodes in selected list: expected at least %d, got %d" , threshold + 1 , len (nodeIDs ))
106+ }
107+
108+ // Validate that self is in the selected list - return special error to skip, same as sign
109+ if ! slices .Contains (nodeIDs , p .nodeID ) {
110+ return nil , ErrNotInParticipantList
111+ }
112+ } else {
113+ // Use all ready peers if no selection provided
114+ nodeIDs = p .peerRegistry .GetReadyPeersIncludeSelf ()
115+ }
116+
96117 switch sessionType {
97118 case SessionTypeECDSA :
98- return p .createECDSAKeyGenSession (walletID , threshold , DefaultVersion , resultQueue )
119+ return p .createECDSAKeyGenSession (walletID , threshold , DefaultVersion , resultQueue , nodeIDs )
99120 case SessionTypeEDDSA :
100- return p .createEDDSAKeyGenSession (walletID , threshold , DefaultVersion , resultQueue )
121+ return p .createEDDSAKeyGenSession (walletID , threshold , DefaultVersion , resultQueue , nodeIDs )
101122 default :
102123 return nil , fmt .Errorf ("Unknown session type: %s" , sessionType )
103124 }
104125}
105126
106- func (p * Node ) createECDSAKeyGenSession (walletID string , threshold int , version int , resultQueue messaging.MessageQueue ) (KeyGenSession , error ) {
107- readyPeerIDs := p .peerRegistry .GetReadyPeersIncludeSelf ()
108- selfPartyID , allPartyIDs := p .generatePartyIDs (PurposeKeygen , readyPeerIDs , version )
127+ func (p * Node ) createECDSAKeyGenSession (walletID string , threshold int , version int , resultQueue messaging.MessageQueue , nodeIDs []string ) (KeyGenSession , error ) {
128+ selfPartyID , allPartyIDs := p .generatePartyIDs (PurposeKeygen , nodeIDs , version )
109129 session := newECDSAKeygenSession (
110130 walletID ,
111131 p .pubSub ,
112132 p .direct ,
113- readyPeerIDs ,
133+ nodeIDs ,
114134 selfPartyID ,
115135 allPartyIDs ,
116136 threshold ,
@@ -123,14 +143,13 @@ func (p *Node) createECDSAKeyGenSession(walletID string, threshold int, version
123143 return session , nil
124144}
125145
126- func (p * Node ) createEDDSAKeyGenSession (walletID string , threshold int , version int , resultQueue messaging.MessageQueue ) (KeyGenSession , error ) {
127- readyPeerIDs := p .peerRegistry .GetReadyPeersIncludeSelf ()
128- selfPartyID , allPartyIDs := p .generatePartyIDs (PurposeKeygen , readyPeerIDs , version )
146+ func (p * Node ) createEDDSAKeyGenSession (walletID string , threshold int , version int , resultQueue messaging.MessageQueue , nodeIDs []string ) (KeyGenSession , error ) {
147+ selfPartyID , allPartyIDs := p .generatePartyIDs (PurposeKeygen , nodeIDs , version )
129148 session := newEDDSAKeygenSession (
130149 walletID ,
131150 p .pubSub ,
132151 p .direct ,
133- readyPeerIDs ,
152+ nodeIDs ,
134153 selfPartyID ,
135154 allPartyIDs ,
136155 threshold ,
@@ -250,6 +269,17 @@ func (p *Node) getReadyPeersForSession(keyInfo *keyinfo.KeyInfo, readyPeers []st
250269 return readyParticipantIDs
251270}
252271
272+ func (p * Node ) filterReadyPeers (selectedNodeIDs []string , readyPeers []string ) []string {
273+ // Filter selected node IDs to only include ready peers
274+ filtered := make ([]string , 0 , len (selectedNodeIDs ))
275+ for _ , nodeID := range selectedNodeIDs {
276+ if slices .Contains (readyPeers , nodeID ) {
277+ filtered = append (filtered , nodeID )
278+ }
279+ }
280+ return filtered
281+ }
282+
253283func (p * Node ) ensureNodeIsParticipant (keyInfo * keyinfo.KeyInfo ) error {
254284 if ! slices .Contains (keyInfo .ParticipantPeerIDs , p .nodeID ) {
255285 return ErrNotInParticipantList
0 commit comments