@@ -200,12 +200,6 @@ func (t *UDPv5) Close() {
200
200
})
201
201
}
202
202
203
- // Ping sends a ping message to the given node.
204
- func (t * UDPv5 ) Ping (n * enode.Node ) error {
205
- _ , err := t .ping (n )
206
- return err
207
- }
208
-
209
203
// Resolve searches for a specific node with the given ID and tries to get the most recent
210
204
// version of the node record for it. It returns n if the node could not be resolved.
211
205
func (t * UDPv5 ) Resolve (n * enode.Node ) * enode.Node {
@@ -226,6 +220,36 @@ func (t *UDPv5) Resolve(n *enode.Node) *enode.Node {
226
220
return n
227
221
}
228
222
223
+ // ResolveNodeId searches for a specific Node with the given ID.
224
+ // It returns nil if the nodeId could not be resolved.
225
+ func (t * UDPv5 ) ResolveNodeId (id enode.ID ) * enode.Node {
226
+ if id == t .Self ().ID () {
227
+ return t .Self ()
228
+ }
229
+
230
+ n := t .tab .getNode (id )
231
+ if n != nil {
232
+ // Try asking directly. This works if the Node is still responding on the endpoint we have.
233
+ if resp , err := t .RequestENR (n ); err == nil {
234
+ return resp
235
+ }
236
+ }
237
+
238
+ // Otherwise do a network lookup.
239
+ result := t .Lookup (id )
240
+ for _ , rn := range result {
241
+ if rn .ID () == id {
242
+ if n != nil && rn .Seq () <= n .Seq () {
243
+ return n
244
+ } else {
245
+ return rn
246
+ }
247
+ }
248
+ }
249
+
250
+ return n
251
+ }
252
+
229
253
// AllNodes returns all the nodes stored in the local table.
230
254
func (t * UDPv5 ) AllNodes () []* enode.Node {
231
255
t .tab .mutex .Lock ()
@@ -240,7 +264,18 @@ func (t *UDPv5) AllNodes() []*enode.Node {
240
264
return nodes
241
265
}
242
266
243
- // LocalNode returns the current local node running the
267
+ // AddKnownNode adds a node to the routing table.
268
+ // The function should be used for testing only.
269
+ func (t * UDPv5 ) AddKnownNode (n * enode.Node ) bool {
270
+ return t .tab .addFoundNode (n , true )
271
+ }
272
+
273
+ // DeleteNode removes a node from the routing table. Used for Portal discv5 DeleteEnr API.
274
+ func (t * UDPv5 ) DeleteNode (n * enode.Node ) {
275
+ t .tab .deleteNode (n )
276
+ }
277
+
278
+ // LocalNode returns the current local Node running the
244
279
// protocol.
245
280
func (t * UDPv5 ) LocalNode () * enode.LocalNode {
246
281
return t .localNode
@@ -328,7 +363,7 @@ func (t *UDPv5) lookupWorker(destNode *enode.Node, target enode.ID) ([]*enode.No
328
363
err error
329
364
)
330
365
var r []* enode.Node
331
- r , err = t .findnode (destNode , dists )
366
+ r , err = t .Findnode (destNode , dists )
332
367
if errors .Is (err , errClosed ) {
333
368
return nil , err
334
369
}
@@ -359,21 +394,31 @@ func lookupDistances(target, dest enode.ID) (dists []uint) {
359
394
360
395
// ping calls PING on a node and waits for a PONG response.
361
396
func (t * UDPv5 ) ping (n * enode.Node ) (uint64 , error ) {
397
+ pong , err := t .Ping (n )
398
+ if err != nil {
399
+ return 0 , err
400
+ }
401
+
402
+ return pong .ENRSeq , nil
403
+ }
404
+
405
+ // Ping calls PING on a node and waits for a PONG response.
406
+ func (t * UDPv5 ) Ping (n * enode.Node ) (* v5wire.Pong , error ) {
362
407
req := & v5wire.Ping {ENRSeq : t .localNode .Node ().Seq ()}
363
408
resp := t .callToNode (n , v5wire .PongMsg , req )
364
409
defer t .callDone (resp )
365
410
366
411
select {
367
412
case pong := <- resp .ch :
368
- return pong .(* v5wire.Pong ). ENRSeq , nil
413
+ return pong .(* v5wire.Pong ), nil
369
414
case err := <- resp .err :
370
- return 0 , err
415
+ return nil , err
371
416
}
372
417
}
373
418
374
419
// RequestENR requests n's record.
375
420
func (t * UDPv5 ) RequestENR (n * enode.Node ) (* enode.Node , error ) {
376
- nodes , err := t .findnode (n , []uint {0 })
421
+ nodes , err := t .Findnode (n , []uint {0 })
377
422
if err != nil {
378
423
return nil , err
379
424
}
@@ -383,8 +428,8 @@ func (t *UDPv5) RequestENR(n *enode.Node) (*enode.Node, error) {
383
428
return nodes [0 ], nil
384
429
}
385
430
386
- // findnode calls FINDNODE on a node and waits for responses.
387
- func (t * UDPv5 ) findnode (n * enode.Node , distances []uint ) ([]* enode.Node , error ) {
431
+ // Findnode calls FINDNODE on a node and waits for responses.
432
+ func (t * UDPv5 ) Findnode (n * enode.Node , distances []uint ) ([]* enode.Node , error ) {
388
433
resp := t .callToNode (n , v5wire .NodesMsg , & v5wire.Findnode {Distances : distances })
389
434
return t .waitForNodes (resp , distances )
390
435
}
@@ -736,8 +781,8 @@ func (t *UDPv5) handleCallResponse(fromID enode.ID, fromAddr netip.AddrPort, p v
736
781
return true
737
782
}
738
783
739
- // getNode looks for a node record in table and database.
740
- func (t * UDPv5 ) getNode (id enode.ID ) * enode.Node {
784
+ // GetNode looks for a node record in table and database.
785
+ func (t * UDPv5 ) GetNode (id enode.ID ) * enode.Node {
741
786
if n := t .tab .getNode (id ); n != nil {
742
787
return n
743
788
}
@@ -747,6 +792,11 @@ func (t *UDPv5) getNode(id enode.ID) *enode.Node {
747
792
return nil
748
793
}
749
794
795
+ // Nodes returns the nodes in the routing table.
796
+ func (t * UDPv5 ) Nodes () [][]BucketNode {
797
+ return t .tab .Nodes ()
798
+ }
799
+
750
800
// handle processes incoming packets according to their message type.
751
801
func (t * UDPv5 ) handle (p v5wire.Packet , fromID enode.ID , fromAddr netip.AddrPort ) {
752
802
switch p := p .(type ) {
@@ -776,7 +826,7 @@ func (t *UDPv5) handle(p v5wire.Packet, fromID enode.ID, fromAddr netip.AddrPort
776
826
func (t * UDPv5 ) handleUnknown (p * v5wire.Unknown , fromID enode.ID , fromAddr netip.AddrPort ) {
777
827
challenge := & v5wire.Whoareyou {Nonce : p .Nonce }
778
828
crand .Read (challenge .IDNonce [:])
779
- if n := t .getNode (fromID ); n != nil {
829
+ if n := t .GetNode (fromID ); n != nil {
780
830
challenge .Node = n
781
831
challenge .RecordSeq = n .Seq ()
782
832
}
0 commit comments