p2p: implement naive version of discv4 forkid filtering

Simple version that does the filtering, but misses pipelining,
waiting for ENRs to be retrieved one-by-one.

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2025-04-03 22:51:04 +02:00
parent 2a1784baef
commit 721b494854
No known key found for this signature in database
GPG key ID: 0FE274EE8C95166E
3 changed files with 40 additions and 1 deletions

View file

@ -487,6 +487,15 @@ func (s *Ethereum) setupDiscovery() error {
s.discmix.AddSource(iter)
}
// Add DHT nodes from discv4.
if s.p2pServer.DiscoveryV4() != nil {
asyncFilter := s.p2pServer.DiscoveryV4().RequestENR
filter := eth.NewNodeFilter(s.blockchain)
iter := enode.AsyncFilter(s.p2pServer.DiscoveryV4().RandomNodes(), asyncFilter)
iter = enode.Filter(iter, filter)
s.discmix.AddSource(iter)
}
// Add DHT nodes from discv5.
if s.p2pServer.DiscoveryV5() != nil {
filter := eth.NewNodeFilter(s.blockchain)

View file

@ -152,6 +152,37 @@ func (f *filterIter) Next() bool {
return false
}
// AsyncFilter wraps an iterator such that Next only returns nodes for which
// the 'check' function returns a (possibly modified) node.
func AsyncFilter(it Iterator, check func(*Node) (*Node, error)) Iterator {
return &AsyncFilterIter{it, nil, check}
}
type AsyncFilterIter struct {
it Iterator
buffer *Node
check func(*Node) (*Node, error)
}
func (f *AsyncFilterIter) Next() bool {
for f.it.Next() {
nn, err := f.check(f.it.Node())
if err == nil {
f.buffer = nn
return true
}
}
return false
}
func (f *AsyncFilterIter) Node() *Node {
return f.buffer
}
func (f *AsyncFilterIter) Close() {
f.it.Close()
}
// FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends
// only when Close is called. Source iterators added via AddSource are removed from the
// mix when they end.

View file

@ -483,7 +483,6 @@ func (srv *Server) setupDiscovery() error {
return err
}
srv.discv4 = ntab
srv.discmix.AddSource(ntab.RandomNodes())
}
if srv.Config.DiscoveryV5 {
cfg := discover.Config{