p2p/discover: add config option for disabling FINDNODE liveness check (#30512)

This is for fixing Prysm integration tests.
This commit is contained in:
Felix Lange 2024-09-30 10:56:14 +02:00 committed by GitHub
parent 283be23817
commit 6b61b54dc7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 11 additions and 8 deletions

@ -53,9 +53,10 @@ type Config struct {
Unhandled chan<- ReadPacket // unhandled packets are sent on this channel
// Node table configuration:
Bootnodes []*enode.Node // list of bootstrap nodes
PingInterval time.Duration // speed of node liveness check
RefreshInterval time.Duration // used in bucket refresh
Bootnodes []*enode.Node // list of bootstrap nodes
PingInterval time.Duration // speed of node liveness check
RefreshInterval time.Duration // used in bucket refresh
NoFindnodeLivenessCheck bool // turns off validation of table nodes in FINDNODE handler
// The options below are useful in very specific cases, like in unit tests.
V5ProtocolID *[6]byte

@ -268,9 +268,9 @@ func (tab *Table) findnodeByID(target enode.ID, nresults int, preferLive bool) *
return nodes
}
// appendLiveNodes adds nodes at the given distance to the result slice.
// appendBucketNodes adds nodes at the given distance to the result slice.
// This is used by the FINDNODE/v5 handler.
func (tab *Table) appendLiveNodes(dist uint, result []*enode.Node) []*enode.Node {
func (tab *Table) appendBucketNodes(dist uint, result []*enode.Node, checkLive bool) []*enode.Node {
if dist > 256 {
return result
}
@ -280,7 +280,7 @@ func (tab *Table) appendLiveNodes(dist uint, result []*enode.Node) []*enode.Node
tab.mutex.Lock()
for _, n := range tab.bucketAtDistance(int(dist)).entries {
if n.isValidatedLive {
if !checkLive || n.isValidatedLive {
result = append(result, n.Node)
}
}

@ -746,7 +746,8 @@ func (t *UDPv4) handleFindnode(h *packetHandlerV4, from netip.AddrPort, fromID e
// Determine closest nodes.
target := enode.ID(crypto.Keccak256Hash(req.Target[:]))
closest := t.tab.findnodeByID(target, bucketSize, true).entries
preferLive := !t.tab.cfg.NoFindnodeLivenessCheck
closest := t.tab.findnodeByID(target, bucketSize, preferLive).entries
// Send neighbors in chunks with at most maxNeighbors per packet
// to stay below the packet size limit.

@ -862,7 +862,8 @@ func (t *UDPv5) collectTableNodes(rip netip.Addr, distances []uint, limit int) [
}
processed[dist] = struct{}{}
for _, n := range t.tab.appendLiveNodes(dist, bn[:0]) {
checkLive := !t.tab.cfg.NoFindnodeLivenessCheck
for _, n := range t.tab.appendBucketNodes(dist, bn[:0], checkLive) {
// Apply some pre-checks to avoid sending invalid nodes.
// Note liveness is checked by appendLiveNodes.
if netutil.CheckRelayAddr(rip, n.IPAddr()) != nil {