@@ -584,7 +584,7 @@ func (s *Service) handleIncoming(stream network.Stream) {
584584 peerID := stream .Conn ().RemotePeer ()
585585 handshakeStream := newStream (stream , s .metrics )
586586
587- peerMultiaddrs , err := s .peerMultiaddrs (s .ctx , stream . Conn (). RemoteMultiaddr () , peerID )
587+ peerAddrs , err := s .peerMultiaddrs (s .ctx , peerID )
588588 if err != nil {
589589 s .logger .Debug ("stream handler: handshake: build remote multiaddrs" , "peer_id" , peerID , "error" , err )
590590 s .logger .Error (nil , "stream handler: handshake: build remote multiaddrs" , "peer_id" , peerID )
@@ -593,12 +593,28 @@ func (s *Service) handleIncoming(stream network.Stream) {
593593 return
594594 }
595595
596+ // For the handshake we always need an observed address (ObservedUnderlay).
597+ // If the peerstore had no addresses, fall back to RemoteMultiaddr for the
598+ // handshake only. This typically means the peer is behind NAT and its
599+ // address is not reachable from the outside.
600+ observedAddrs := peerAddrs
601+ if len (observedAddrs ) == 0 {
602+ observedAddrs , err = buildFullMAs ([]ma.Multiaddr {stream .Conn ().RemoteMultiaddr ()}, peerID )
603+ if err != nil {
604+ s .logger .Debug ("stream handler: handshake: build remote multiaddrs fallback" , "peer_id" , peerID , "error" , err )
605+ s .logger .Error (nil , "stream handler: handshake: build remote multiaddrs fallback" , "peer_id" , peerID )
606+ _ = handshakeStream .Reset ()
607+ _ = s .host .Network ().ClosePeer (peerID )
608+ return
609+ }
610+ }
611+
596612 bee260Compat := s .bee260BackwardCompatibility (peerID )
597613
598614 i , err := s .handshakeService .Handle (
599615 s .ctx ,
600616 handshakeStream ,
601- peerMultiaddrs ,
617+ observedAddrs ,
602618 handshake .WithBee260Compatibility (bee260Compat ),
603619 )
604620 if err != nil {
@@ -644,7 +660,8 @@ func (s *Service) handleIncoming(stream network.Stream) {
644660 return
645661 }
646662
647- if i .FullNode {
663+ // Only persist in addressbook when we have real peerstore addresses.
664+ if i .FullNode && len (peerAddrs ) > 0 {
648665 err = s .addressbook .Put (i .BzzAddress .Overlay , * i .BzzAddress )
649666 if err != nil {
650667 s .logger .Debug ("stream handler: addressbook put error" , "peer_id" , peerID , "error" , err )
@@ -727,7 +744,9 @@ func (s *Service) handleIncoming(stream network.Stream) {
727744 return
728745 }
729746
730- s .notifyReacherConnected (overlay , peerMultiaddrs )
747+ if len (peerAddrs ) > 0 {
748+ s .notifyReacherConnected (overlay , peerAddrs )
749+ }
731750
732751 peerUserAgent := appendSpace (s .peerUserAgent (s .ctx , peerID ))
733752 s .networkStatus .Store (int32 (p2p .NetworkStatusAvailable ))
@@ -1029,19 +1048,29 @@ func (s *Service) Connect(ctx context.Context, addrs []ma.Multiaddr) (address *b
10291048
10301049 handshakeStream := newStream (stream , s .metrics )
10311050
1032- peerMultiaddrs , err := s .peerMultiaddrs (ctx , stream . Conn (). RemoteMultiaddr () , peerID )
1051+ peerAddrs , err := s .peerMultiaddrs (ctx , peerID )
10331052 if err != nil {
10341053 _ = handshakeStream .Reset ()
10351054 _ = s .host .Network ().ClosePeer (peerID )
10361055 return nil , fmt .Errorf ("build peer multiaddrs: %w" , err )
10371056 }
10381057
1058+ observedAddrs := peerAddrs
1059+ if len (observedAddrs ) == 0 {
1060+ observedAddrs , err = buildFullMAs ([]ma.Multiaddr {stream .Conn ().RemoteMultiaddr ()}, peerID )
1061+ if err != nil {
1062+ _ = handshakeStream .Reset ()
1063+ _ = s .host .Network ().ClosePeer (peerID )
1064+ return nil , fmt .Errorf ("build peer multiaddrs fallback: %w" , err )
1065+ }
1066+ }
1067+
10391068 bee260Compat := s .bee260BackwardCompatibility (peerID )
10401069
10411070 i , err := s .handshakeService .Handshake (
10421071 s .ctx ,
10431072 handshakeStream ,
1044- peerMultiaddrs ,
1073+ observedAddrs ,
10451074 handshake .WithBee260Compatibility (bee260Compat ),
10461075 )
10471076 if err != nil {
@@ -1120,7 +1149,9 @@ func (s *Service) Connect(ctx context.Context, addrs []ma.Multiaddr) (address *b
11201149
11211150 s .metrics .CreatedConnectionCount .Inc ()
11221151
1123- s .notifyReacherConnected (overlay , peerMultiaddrs )
1152+ if len (peerAddrs ) > 0 {
1153+ s .notifyReacherConnected (overlay , peerAddrs )
1154+ }
11241155
11251156 peerUA := appendSpace (s .peerUserAgent (ctx , peerID ))
11261157 loggerV1 .Debug ("successfully connected to peer (outbound)" , "addresses" , i .BzzAddress .ShortString (), "light" , i .LightString (), "user_agent" , peerUA )
@@ -1429,17 +1460,12 @@ func (s *Service) determineCurrentNetworkStatus(err error) error {
14291460 return err
14301461}
14311462
1432- // peerMultiaddrs builds full multiaddresses for a peer given information from
1433- // the libp2p host peerstore. If the peerstore doesn't have addresses yet,
1434- // it falls back to using the remote address from the active connection.
1435- func (s * Service ) peerMultiaddrs (ctx context.Context , remoteAddr ma.Multiaddr , peerID libp2ppeer.ID ) ([]ma.Multiaddr , error ) {
1463+ // peerMultiaddrs builds full multiaddresses for a peer using the peerstore.
1464+ func (s * Service ) peerMultiaddrs (ctx context.Context , peerID libp2ppeer.ID ) ([]ma.Multiaddr , error ) {
14361465 waitPeersCtx , cancel := context .WithTimeout (ctx , peerstoreWaitAddrsTimeout )
14371466 defer cancel ()
14381467
14391468 mas := waitPeerAddrs (waitPeersCtx , s .host .Peerstore (), peerID )
1440- if len (mas ) == 0 && remoteAddr != nil {
1441- mas = []ma.Multiaddr {remoteAddr }
1442- }
14431469
14441470 return buildFullMAs (mas , peerID )
14451471}
0 commit comments