Skip to content

Commit 3f89af0

Browse files
committed
feat: dynamically set host addresses in handshake protocol
1 parent 8e6584f commit 3f89af0

File tree

2 files changed

+45
-18
lines changed

2 files changed

+45
-18
lines changed

pkg/p2p/libp2p/internal/handshake/handshake.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ type AdvertisableAddressResolver interface {
6161
Resolve(observedAddress ma.Multiaddr) (ma.Multiaddr, error)
6262
}
6363

64+
type Addresser interface {
65+
AdvertizableAddrs() ([]ma.Multiaddr, error)
66+
}
67+
6468
type Option struct {
6569
bee260compatibility bool
6670
}
@@ -85,7 +89,7 @@ type Service struct {
8589
libp2pID libp2ppeer.ID
8690
metrics metrics
8791
picker p2p.Picker
88-
hostAddrs []ma.Multiaddr
92+
hostAddresser Addresser
8993
}
9094

9195
// Info contains the information received from the handshake.
@@ -103,7 +107,7 @@ func (i *Info) LightString() string {
103107
}
104108

105109
// New creates a new handshake Service.
106-
func New(signer crypto.Signer, advertisableAddresser AdvertisableAddressResolver, overlay swarm.Address, networkID uint64, fullNode bool, nonce []byte, hostAddrs []ma.Multiaddr, welcomeMessage string, validateOverlay bool, ownPeerID libp2ppeer.ID, logger log.Logger) (*Service, error) {
110+
func New(signer crypto.Signer, advertisableAddresser AdvertisableAddressResolver, overlay swarm.Address, networkID uint64, fullNode bool, nonce []byte, hostAddresser Addresser, welcomeMessage string, validateOverlay bool, ownPeerID libp2ppeer.ID, logger log.Logger) (*Service, error) {
107111
if len(welcomeMessage) > MaxWelcomeMessageLength {
108112
return nil, ErrWelcomeMessageLength
109113
}
@@ -119,7 +123,7 @@ func New(signer crypto.Signer, advertisableAddresser AdvertisableAddressResolver
119123
libp2pID: ownPeerID,
120124
logger: logger.WithName(loggerName).Register(),
121125
metrics: newMetrics(),
122-
hostAddrs: hostAddrs,
126+
hostAddresser: hostAddresser,
123127
}
124128
svc.welcomeMessage.Store(welcomeMessage)
125129

@@ -181,7 +185,14 @@ func (s *Service) Handshake(ctx context.Context, stream p2p.Stream, peerMultiadd
181185
advertisableUnderlays[i] = advertisableUnderlay
182186
}
183187

184-
advertisableUnderlays = append(advertisableUnderlays, s.hostAddrs...)
188+
if s.hostAddresser != nil {
189+
hostAddrs, err := s.hostAddresser.AdvertizableAddrs()
190+
if err != nil {
191+
return nil, fmt.Errorf("get host advertizable addresses: %w", err)
192+
}
193+
194+
advertisableUnderlays = append(advertisableUnderlays, hostAddrs...)
195+
}
185196

186197
// sort to remove potential duplicates
187198
slices.SortFunc(advertisableUnderlays, func(a, b ma.Multiaddr) int {
@@ -280,7 +291,14 @@ func (s *Service) Handle(ctx context.Context, stream p2p.Stream, peerMultiaddrs
280291
advertisableUnderlays[i] = advertisableUnderlay
281292
}
282293

283-
advertisableUnderlays = append(advertisableUnderlays, s.hostAddrs...)
294+
if s.hostAddresser != nil {
295+
hostAddrs, err := s.hostAddresser.AdvertizableAddrs()
296+
if err != nil {
297+
return nil, fmt.Errorf("get host advertizable addresses: %w", err)
298+
}
299+
300+
advertisableUnderlays = append(advertisableUnderlays, hostAddrs...)
301+
}
284302

285303
// sort to remove potential duplicates
286304
slices.SortFunc(advertisableUnderlays, func(a, b ma.Multiaddr) int {

pkg/p2p/libp2p/libp2p.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -306,19 +306,7 @@ func New(ctx context.Context, signer beecrypto.Signer, networkID uint64, overlay
306306
advertisableAddresser = natAddrResolver
307307
}
308308

309-
advertizableAddresses := make([]ma.Multiaddr, 0)
310-
for _, a := range h.Addrs() {
311-
if manet.IsIPLoopback(a) {
312-
continue
313-
}
314-
a, err := buildFullMA(a, h.ID())
315-
if err != nil {
316-
return nil, fmt.Errorf("build full node multiaddr: %w", err)
317-
}
318-
advertizableAddresses = append(advertizableAddresses, a)
319-
}
320-
321-
handshakeService, err := handshake.New(signer, advertisableAddresser, overlay, networkID, o.FullNode, o.Nonce, advertizableAddresses, o.WelcomeMessage, o.ValidateOverlay, h.ID(), logger)
309+
handshakeService, err := handshake.New(signer, advertisableAddresser, overlay, networkID, o.FullNode, o.Nonce, newHostAddresser(h), o.WelcomeMessage, o.ValidateOverlay, h.ID(), logger)
322310
if err != nil {
323311
return nil, fmt.Errorf("handshake service: %w", err)
324312
}
@@ -1292,6 +1280,27 @@ func isNetworkOrHostUnreachableError(err error) bool {
12921280
return false
12931281
}
12941282

1283+
type hostAddresser struct {
1284+
host host.Host
1285+
}
1286+
1287+
func newHostAddresser(host host.Host) *hostAddresser {
1288+
return &hostAddresser{
1289+
host: host,
1290+
}
1291+
}
1292+
1293+
func (h *hostAddresser) AdvertizableAddrs() ([]ma.Multiaddr, error) {
1294+
addrs := make([]ma.Multiaddr, 0)
1295+
for _, a := range h.host.Addrs() {
1296+
if manet.IsIPLoopback(a) {
1297+
continue
1298+
}
1299+
addrs = append(addrs, a)
1300+
}
1301+
return buildFullMAs(addrs, h.host.ID())
1302+
}
1303+
12951304
func buildFullMAs(addrs []ma.Multiaddr, peerID libp2ppeer.ID) ([]ma.Multiaddr, error) {
12961305
fullMAs := make([]ma.Multiaddr, 0)
12971306
for _, addr := range addrs {

0 commit comments

Comments
 (0)