From 4a18ec49d799b69dc9d5fdd3b53619893a4158ba Mon Sep 17 00:00:00 2001 From: minh-bq <97180373+minh-bq@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:20:33 +0700 Subject: [PATCH] p2p/server: add DNS resolved candidates to distributed hash table (#370) Currently, DNS resolved candidates of eth protocol are added as candidates for dialing but not added to DHT. The DHT's seed nodes are still configured via hardcoded nodes in bootnodes flag. As we want to replace the hardcoded bootnodes entirely with DNS resolved nodes, we resolve some nodes from the DNS discovery URL and put them into DHT when setting up the p2p discovery. --- p2p/server.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/p2p/server.go b/p2p/server.go index bcfc1bd10b..2ee1554adb 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -62,6 +62,12 @@ const ( // Maximum amount of time allowed for writing a complete message. frameWriteTimeout = 20 * time.Second + + // The number of DHT seed nodes got from DNS resolve + numSeedNodesFromDns = 5 + + // Name of eth protocol + ethProtocolName = "eth" ) var errServerStopped = errors.New("server stopped") @@ -539,6 +545,22 @@ func (srv *Server) setupDiscovery() error { added := make(map[string]bool) for _, proto := range srv.Protocols { if proto.DialCandidates != nil && !added[proto.Name] { + // If the protocol is eth, the dial candidates are retrieved from + // DNS URL. We want to use the DNS discovery for bootstrap nodes + // too, so resolve some nodes from DNS and add to DHT. + if proto.Name == ethProtocolName { + for i := 0; i < numSeedNodesFromDns; i++ { + if !proto.DialCandidates.Next() { + break + } + + node := proto.DialCandidates.Node() + log.Info("Add resolved DNS node to discovery bootstrap nodes", "node", node.String()) + srv.BootstrapNodes = append(srv.BootstrapNodes, node) + srv.BootstrapNodesV5 = append(srv.BootstrapNodesV5, node) + } + } + srv.discmix.AddSource(proto.DialCandidates) added[proto.Name] = true }