@cryptotaxi247 / kubo / commits / c2953ab8f

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