Skip to content

Commit 8e5fd8a

Browse files
update ENR record with AutoNAT
1 parent 0865dab commit 8e5fd8a

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

beacon-chain/p2p/service.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/libp2p/go-libp2p/core/peer"
3636
"github.com/libp2p/go-libp2p/core/protocol"
3737
"github.com/multiformats/go-multiaddr"
38+
manet "github.com/multiformats/go-multiaddr/net"
3839
"github.com/patrickmn/go-cache"
3940
"github.com/pkg/errors"
4041
"github.com/sirupsen/logrus"
@@ -589,13 +590,54 @@ func (s *Service) subscribeReachabilityEvents() error {
589590
"unreachable": multiaddrsToStrings(event.Unreachable),
590591
"unknown": multiaddrsToStrings(event.Unknown),
591592
}).Info("Address reachability changed")
593+
594+
// Update ENR with reachable addresses if ENR has no addresses configured
595+
if len(event.Reachable) > 0 {
596+
s.updateENRFromReachableAddrs(event.Reachable)
597+
}
592598
}
593599
}
594600
}
595601
}()
602+
596603
return nil
597604
}
598605

606+
// updateENRFromReachableAddrs updates the ENR with IP addresses discovered
607+
// by AutoNAT if the ENR doesn't already have a static/fallback IP configured.
608+
func (s *Service) updateENRFromReachableAddrs(reachableAddrs []multiaddr.Multiaddr) {
609+
// Skip if HostAddress was already configured
610+
if s.cfg != nil && s.cfg.HostAddress != "" {
611+
return
612+
}
613+
614+
if s.dv5Listener == nil {
615+
return
616+
}
617+
618+
localNode := s.dv5Listener.LocalNode()
619+
620+
// Extract the first valid IP from reachable addresses
621+
for _, addr := range reachableAddrs {
622+
ip, err := manet.ToIP(addr)
623+
if err != nil {
624+
continue
625+
}
626+
627+
// Validate the IP is either IPv4 or IPv6
628+
if ip.To4() == nil && ip.To16() == nil {
629+
continue
630+
}
631+
632+
// Set fallback and static IP like we do for HostAddress
633+
localNode.SetFallbackIP(ip)
634+
localNode.SetStaticIP(ip)
635+
636+
log.WithField("ip", ip.String()).Info("Updated ENR IP from AutoNAT reachability")
637+
return
638+
}
639+
}
640+
599641
func multiaddrsToStrings(addrs []multiaddr.Multiaddr) []string {
600642
strs := make([]string, len(addrs))
601643
for i, a := range addrs {

0 commit comments

Comments
 (0)