Skip to content

Commit c2953ab

Browse files
Jorropolidel
andauthored
feat: Addresses.AppendAnnounce (#8177)
* feat: Addresses.AppendAnnounce Closes #7791 * fix: deduplicate Swarm.Announce and AppendAnnounce #8177 (comment) #8177 (comment) Co-authored-by: Marcin Rataj <[email protected]>
1 parent 4fb4c2d commit c2953ab

File tree

4 files changed

+68
-10
lines changed

4 files changed

+68
-10
lines changed

core/node/groups.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option {
145145
BaseLibP2P,
146146

147147
fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)),
148-
fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.NoAnnounce)),
148+
fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.AppendAnnounce, cfg.Addresses.NoAnnounce)),
149149
fx.Provide(libp2p.SmuxTransport(cfg.Swarm.Transports)),
150150
fx.Provide(libp2p.RelayTransport(enableRelayTransport)),
151151
fx.Provide(libp2p.RelayService(cfg.Swarm.RelayService.Enabled.WithDefault(true), cfg.Swarm.RelayService)),

core/node/libp2p/addrs.go

+24-7
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,30 @@ func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) {
2525
}
2626
}
2727

28-
func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) {
29-
var annAddrs []ma.Multiaddr
30-
for _, addr := range announce {
31-
maddr, err := ma.NewMultiaddr(addr)
28+
func makeAddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) {
29+
var err error // To assign to the slice in the for loop
30+
existing := make(map[string]bool) // To avoid duplicates
31+
32+
annAddrs := make([]ma.Multiaddr, len(announce))
33+
for i, addr := range announce {
34+
annAddrs[i], err = ma.NewMultiaddr(addr)
35+
if err != nil {
36+
return nil, err
37+
}
38+
existing[addr] = true
39+
}
40+
41+
var appendAnnAddrs []ma.Multiaddr
42+
for _, addr := range appendAnnouce {
43+
if existing[addr] {
44+
// skip AppendAnnounce that is on the Announce list already
45+
continue
46+
}
47+
appendAddr, err := ma.NewMultiaddr(addr)
3248
if err != nil {
3349
return nil, err
3450
}
35-
annAddrs = append(annAddrs, maddr)
51+
appendAnnAddrs = append(appendAnnAddrs, appendAddr)
3652
}
3753

3854
filters := ma.NewFilters()
@@ -57,6 +73,7 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac
5773
} else {
5874
addrs = allAddrs
5975
}
76+
addrs = append(addrs, appendAnnAddrs...)
6077

6178
var out []ma.Multiaddr
6279
for _, maddr := range addrs {
@@ -71,9 +88,9 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac
7188
}, nil
7289
}
7390

74-
func AddrsFactory(announce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) {
91+
func AddrsFactory(announce []string, appendAnnouce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) {
7592
return func() (opts Libp2pOpts, err error) {
76-
addrsFactory, err := makeAddrsFactory(announce, noAnnounce)
93+
addrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce)
7794
if err != nil {
7895
return opts, err
7996
}

docs/config.md

+12
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ config file at runtime.
2121
- [`Addresses.Gateway`](#addressesgateway)
2222
- [`Addresses.Swarm`](#addressesswarm)
2323
- [`Addresses.Announce`](#addressesannounce)
24+
- [`Addresses.AppendAnnounce`](#addressesappendannounce)
2425
- [`Addresses.NoAnnounce`](#addressesnoannounce)
2526
- [`API`](#api)
2627
- [`API.HTTPHeaders`](#apihttpheaders)
@@ -336,8 +337,19 @@ Default: `[]`
336337

337338
Type: `array[string]` (multiaddrs)
338339

340+
### `Addresses.AppendAnnounce`
341+
342+
Similar to [`Addresses.Announce`](#addressesannounce) except this doesn't
343+
override inferred swarm addresses if non-empty.
344+
345+
Default: `[]`
346+
347+
Type: `array[string]` (multiaddrs)
348+
339349
### `Addresses.NoAnnounce`
350+
340351
An array of swarm addresses not to announce to the network.
352+
Takes precedence over `Addresses.Announce` and `Addresses.AppendAnnounce`.
341353

342354
Default: `[]`
343355

test/sharness/t0140-swarm.sh

+31-2
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,47 @@ test_expect_success 'Addresses.Announce affects addresses' '
6565

6666
test_kill_ipfs_daemon
6767

68+
69+
announceCfg='["/ip4/127.0.0.1/tcp/4001", "/ip4/1.2.3.4/tcp/1234"]'
70+
test_expect_success "test_config_set succeeds" "
71+
ipfs config --json Addresses.Announce '$announceCfg'
72+
"
73+
# Include "/ip4/1.2.3.4/tcp/1234" to ensure we deduplicate addrs already present in Swarm.Announce
74+
appendAnnounceCfg='["/dnsaddr/dynamic.example.com", "/ip4/10.20.30.40/tcp/4321", "/ip4/1.2.3.4/tcp/1234"]'
75+
test_expect_success "test_config_set Announce and AppendAnnounce succeeds" "
76+
ipfs config --json Addresses.Announce '$announceCfg' &&
77+
ipfs config --json Addresses.AppendAnnounce '$appendAnnounceCfg'
78+
"
79+
80+
test_launch_ipfs_daemon
81+
82+
test_expect_success 'Addresses.AppendAnnounce is applied on top of Announce' '
83+
ipfs swarm addrs local >actual &&
84+
grep "/ip4/1.2.3.4/tcp/1234" actual &&
85+
grep "/dnsaddr/dynamic.example.com" actual &&
86+
grep "/ip4/10.20.30.40/tcp/4321" actual &&
87+
ipfs id -f"<addrs>" | xargs -n1 echo | tee actual &&
88+
grep "/ip4/1.2.3.4/tcp/1234/p2p" actual &&
89+
grep "/dnsaddr/dynamic.example.com/p2p/" actual &&
90+
grep "/ip4/10.20.30.40/tcp/4321/p2p/" actual
91+
'
92+
93+
test_kill_ipfs_daemon
94+
6895
noAnnounceCfg='["/ip4/1.2.3.4/tcp/1234"]'
6996
test_expect_success "test_config_set succeeds" "
7097
ipfs config --json Addresses.NoAnnounce '$noAnnounceCfg'
7198
"
7299

73100
test_launch_ipfs_daemon
74101

75-
test_expect_success "Addresses.NoAnnounce affects addresses" '
102+
test_expect_success "Addresses.NoAnnounce affects addresses from Announce and AppendAnnounce" '
76103
ipfs swarm addrs local >actual &&
77104
grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
105+
grep -v "/ip4/10.20.30.40/tcp/4321" actual &&
78106
ipfs id -f"<addrs>" | xargs -n1 echo >actual &&
79-
grep -v "/ip4/1.2.3.4/tcp/1234" actual
107+
grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
108+
grep -v "//ip4/10.20.30.40/tcp/4321" actual
80109
'
81110

82111
test_kill_ipfs_daemon

0 commit comments

Comments
 (0)