feat: Addresses.AppendAnnounce (#8177)
* feat: Addresses.AppendAnnounce Closes #7791 * fix: deduplicate Swarm.Announce and AppendAnnounce https://github.com/ipfs/go-ipfs/pull/8177#discussion_r759317772 https://github.com/ipfs/go-ipfs/pull/8177#discussion_r759320332 Co-authored-by: Marcin Rataj <lidel@lidel.org>
Jorropo committed
Nov 30, 2021 at 17:58 UTC
c2953ab8f1d45a23677170eac814ccd3f1ab0523
4 files changed
+68
-10
core/node/groups.go
+1
-1
@@ -145,7 +145,7 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option {
145
BaseLibP2P,
146
147
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)),
149
fx.Provide(libp2p.SmuxTransport(cfg.Swarm.Transports)),
150
fx.Provide(libp2p.RelayTransport(enableRelayTransport)),
151
fx.Provide(libp2p.RelayService(cfg.Swarm.RelayService.Enabled.WithDefault(true), cfg.Swarm.RelayService)),
core/node/libp2p/addrs.go
+24
-7
@@ -25,14 +25,30 @@ func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) {
25
}
26
}
27
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)
48
if err != nil {
49
return nil, err
50
}
35
- annAddrs = append(annAddrs, maddr)
51
+ appendAnnAddrs = append(appendAnnAddrs, appendAddr)
52
}
53
54
filters := ma.NewFilters()
@@ -57,6 +73,7 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac
73
} else {
74
addrs = allAddrs
75
}
76
+ addrs = append(addrs, appendAnnAddrs...)
77
78
var out []ma.Multiaddr
79
for _, maddr := range addrs {
@@ -71,9 +88,9 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac
88
}, nil
89
}
90
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) {
92
return func() (opts Libp2pOpts, err error) {
76
- addrsFactory, err := makeAddrsFactory(announce, noAnnounce)
93
+ addrsFactory, err := makeAddrsFactory(announce, appendAnnouce, noAnnounce)
94
if err != nil {
95
return opts, err
96
}
docs/config.md
+12
@@ -21,6 +21,7 @@ config file at runtime.
21
- [`Addresses.Gateway`](#addressesgateway)
22
- [`Addresses.Swarm`](#addressesswarm)
23
- [`Addresses.Announce`](#addressesannounce)
24
+ - [`Addresses.AppendAnnounce`](#addressesappendannounce)
25
- [`Addresses.NoAnnounce`](#addressesnoannounce)
26
- [`API`](#api)
27
- [`API.HTTPHeaders`](#apihttpheaders)
@@ -336,8 +337,19 @@ Default: `[]`
337
338
Type: `array[string]` (multiaddrs)
339
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
+
349
### `Addresses.NoAnnounce`
350
+
351
An array of swarm addresses not to announce to the network.
352
+Takes precedence over `Addresses.Announce` and `Addresses.AppendAnnounce`.
353
354
Default: `[]`
355
test/sharness/t0140-swarm.sh
+31
-2
@@ -65,6 +65,33 @@ test_expect_success 'Addresses.Announce affects addresses' '
65
66
test_kill_ipfs_daemon
67
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
+
95
noAnnounceCfg='["/ip4/1.2.3.4/tcp/1234"]'
96
test_expect_success "test_config_set succeeds" "
97
ipfs config --json Addresses.NoAnnounce '$noAnnounceCfg'
@@ -72,11 +99,13 @@ test_expect_success "test_config_set succeeds" "
99
100
test_launch_ipfs_daemon
101
75
-test_expect_success "Addresses.NoAnnounce affects addresses" '
102
+test_expect_success "Addresses.NoAnnounce affects addresses from Announce and AppendAnnounce" '
103
ipfs swarm addrs local >actual &&
104
grep -v "/ip4/1.2.3.4/tcp/1234" actual &&
105
+ grep -v "/ip4/10.20.30.40/tcp/4321" actual &&
106
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
109
'
110
111
test_kill_ipfs_daemon