chore: migrate bootstrap to ipfs/boxo (#10158)
Andrew Gillis committed
Oct 31, 2023 at 10:25 UTC
d1ccdf052b6414c7f3b8fb284c0deb2477fdb2ed
15 files changed
+16
-526
core/bootstrap/bootstrap.go
deleted
-371
@@ -1,371 +0,0 @@
1
-package bootstrap
2
-
3
-import (
4
- "context"
5
- "errors"
6
- "io"
7
- "math/rand"
8
- "sync"
9
- "sync/atomic"
10
- "time"
11
-
12
- logging "github.com/ipfs/go-log"
13
- "github.com/jbenet/goprocess"
14
- goprocessctx "github.com/jbenet/goprocess/context"
15
- periodicproc "github.com/jbenet/goprocess/periodic"
16
- "github.com/libp2p/go-libp2p/core/host"
17
- "github.com/libp2p/go-libp2p/core/network"
18
- "github.com/libp2p/go-libp2p/core/peer"
19
- "github.com/libp2p/go-libp2p/core/peerstore"
20
- "github.com/libp2p/go-libp2p/core/routing"
21
-)
22
-
23
-var log = logging.Logger("bootstrap")
24
-
25
-// ErrNotEnoughBootstrapPeers signals that we do not have enough bootstrap
26
-// peers to bootstrap correctly.
27
-var ErrNotEnoughBootstrapPeers = errors.New("not enough bootstrap peers to bootstrap")
28
-
29
-// BootstrapConfig specifies parameters used in an IpfsNode's network
30
-// bootstrapping process.
31
-type BootstrapConfig struct {
32
- // MinPeerThreshold governs whether to bootstrap more connections. If the
33
- // node has less open connections than this number, it will open connections
34
- // to the bootstrap nodes. From there, the routing system should be able
35
- // to use the connections to the bootstrap nodes to connect to even more
36
- // peers. Routing systems like the IpfsDHT do so in their own Bootstrap
37
- // process, which issues random queries to find more peers.
38
- MinPeerThreshold int
39
-
40
- // Period governs the periodic interval at which the node will
41
- // attempt to bootstrap. The bootstrap process is not very expensive, so
42
- // this threshold can afford to be small (<=30s).
43
- Period time.Duration
44
-
45
- // ConnectionTimeout determines how long to wait for a bootstrap
46
- // connection attempt before cancelling it.
47
- ConnectionTimeout time.Duration
48
-
49
- // BootstrapPeers is a function that returns a set of bootstrap peers
50
- // for the bootstrap process to use. This makes it possible for clients
51
- // to control the peers the process uses at any moment.
52
- BootstrapPeers func() []peer.AddrInfo
53
-
54
- // BackupBootstrapInterval governs the periodic interval at which the node will
55
- // attempt to save connected nodes to use as temporary bootstrap peers.
56
- BackupBootstrapInterval time.Duration
57
-
58
- // MaxBackupBootstrapSize controls the maximum number of peers we're saving
59
- // as backup bootstrap peers.
60
- MaxBackupBootstrapSize int
61
-
62
- saveBackupBootstrapPeers func(context.Context, []peer.AddrInfo)
63
- loadBackupBootstrapPeers func(context.Context) []peer.AddrInfo
64
-}
65
-
66
-// DefaultBootstrapConfig specifies default sane parameters for bootstrapping.
67
-var DefaultBootstrapConfig = BootstrapConfig{
68
- MinPeerThreshold: 4,
69
- Period: 30 * time.Second,
70
- ConnectionTimeout: (30 * time.Second) / 3, // Perod / 3
71
- BackupBootstrapInterval: 1 * time.Hour,
72
- MaxBackupBootstrapSize: 20,
73
-}
74
-
75
-// BootstrapConfigWithPeers creates a default BootstrapConfig configured with
76
-// the specified peers, and optional functions to load and save backup peers.
77
-func BootstrapConfigWithPeers(pis []peer.AddrInfo, options ...func(*BootstrapConfig)) BootstrapConfig {
78
- cfg := DefaultBootstrapConfig
79
- cfg.BootstrapPeers = func() []peer.AddrInfo {
80
- return pis
81
- }
82
- for _, opt := range options {
83
- opt(&cfg)
84
- }
85
- return cfg
86
-}
87
-
88
-// WithBackupPeers configures functions to load and save backup bootstrap peers.
89
-func WithBackupPeers(load func(context.Context) []peer.AddrInfo, save func(context.Context, []peer.AddrInfo)) func(*BootstrapConfig) {
90
- if save == nil && load != nil || save != nil && load == nil {
91
- panic("both load and save backup bootstrap peers functions must be defined")
92
- }
93
- return func(cfg *BootstrapConfig) {
94
- cfg.loadBackupBootstrapPeers = load
95
- cfg.saveBackupBootstrapPeers = save
96
- }
97
-}
98
-
99
-// BackupPeers returns the load and save backup peers functions.
100
-func (cfg *BootstrapConfig) BackupPeers() (func(context.Context) []peer.AddrInfo, func(context.Context, []peer.AddrInfo)) {
101
- return cfg.loadBackupBootstrapPeers, cfg.saveBackupBootstrapPeers
102
-}
103
-
104
-// SetBackupPeers sets the load and save backup peers functions.
105
-func (cfg *BootstrapConfig) SetBackupPeers(load func(context.Context) []peer.AddrInfo, save func(context.Context, []peer.AddrInfo)) {
106
- opt := WithBackupPeers(load, save)
107
- opt(cfg)
108
-}
109
-
110
-// Bootstrap kicks off IpfsNode bootstrapping. This function will periodically
111
-// check the number of open connections and -- if there are too few -- initiate
112
-// connections to well-known bootstrap peers. It also kicks off subsystem
113
-// bootstrapping (i.e. routing).
114
-func Bootstrap(id peer.ID, host host.Host, rt routing.Routing, cfg BootstrapConfig) (io.Closer, error) {
115
- // make a signal to wait for one bootstrap round to complete.
116
- doneWithRound := make(chan struct{})
117
-
118
- if len(cfg.BootstrapPeers()) == 0 {
119
- // We *need* to bootstrap but we have no bootstrap peers
120
- // configured *at all*, inform the user.
121
- log.Warn("no bootstrap nodes configured: go-ipfs may have difficulty connecting to the network")
122
- }
123
-
124
- // the periodic bootstrap function -- the connection supervisor
125
- periodic := func(worker goprocess.Process) {
126
- ctx := goprocessctx.OnClosingContext(worker)
127
-
128
- if err := bootstrapRound(ctx, host, cfg); err != nil {
129
- log.Debugf("%s bootstrap error: %s", id, err)
130
- }
131
-
132
- // Exit the first call (triggered independently by `proc.Go`, not `Tick`)
133
- // only after being done with the *single* Routing.Bootstrap call. Following
134
- // periodic calls (`Tick`) will not block on this.
135
- <-doneWithRound
136
- }
137
-
138
- // kick off the node's periodic bootstrapping
139
- proc := periodicproc.Tick(cfg.Period, periodic)
140
- proc.Go(periodic) // run one right now.
141
-
142
- // kick off Routing.Bootstrap
143
- if rt != nil {
144
- ctx := goprocessctx.OnClosingContext(proc)
145
- if err := rt.Bootstrap(ctx); err != nil {
146
- proc.Close()
147
- return nil, err
148
- }
149
- }
150
-
151
- doneWithRound <- struct{}{}
152
- close(doneWithRound) // it no longer blocks periodic
153
-
154
- // If loadBackupBootstrapPeers is not nil then saveBackupBootstrapPeers
155
- // must also not be nil.
156
- if cfg.loadBackupBootstrapPeers != nil {
157
- startSavePeersAsTemporaryBootstrapProc(cfg, host, proc)
158
- }
159
-
160
- return proc, nil
161
-}
162
-
163
-// Aside of the main bootstrap process we also run a secondary one that saves
164
-// connected peers as a backup measure if we can't connect to the official
165
-// bootstrap ones. These peers will serve as *temporary* bootstrap nodes.
166
-func startSavePeersAsTemporaryBootstrapProc(cfg BootstrapConfig, host host.Host, bootstrapProc goprocess.Process) {
167
- savePeersFn := func(worker goprocess.Process) {
168
- ctx := goprocessctx.OnClosingContext(worker)
169
-
170
- if err := saveConnectedPeersAsTemporaryBootstrap(ctx, host, cfg); err != nil {
171
- log.Debugf("saveConnectedPeersAsTemporaryBootstrap error: %s", err)
172
- }
173
- }
174
- savePeersProc := periodicproc.Tick(cfg.BackupBootstrapInterval, savePeersFn)
175
-
176
- // When the main bootstrap process ends also terminate the 'save connected
177
- // peers' ones. Coupling the two seems the easiest way to handle this backup
178
- // process without additional complexity.
179
- go func() {
180
- <-bootstrapProc.Closing()
181
- savePeersProc.Close()
182
- }()
183
-
184
- // Run the first round now (after the first bootstrap process has finished)
185
- // as the SavePeersPeriod can be much longer than bootstrap.
186
- savePeersProc.Go(savePeersFn)
187
-}
188
-
189
-func saveConnectedPeersAsTemporaryBootstrap(ctx context.Context, host host.Host, cfg BootstrapConfig) error {
190
- // Randomize the list of connected peers, we don't prioritize anyone.
191
- connectedPeers := randomizeList(host.Network().Peers())
192
-
193
- bootstrapPeers := cfg.BootstrapPeers()
194
- backupPeers := make([]peer.AddrInfo, 0, cfg.MaxBackupBootstrapSize)
195
- foundPeers := make(map[peer.ID]struct{}, cfg.MaxBackupBootstrapSize+len(bootstrapPeers))
196
-
197
- // Don't record bootstrap peers
198
- for _, b := range bootstrapPeers {
199
- foundPeers[b.ID] = struct{}{}
200
- }
201
-
202
- // Choose peers to save and filter out the ones that are already bootstrap nodes.
203
- for _, p := range connectedPeers {
204
- if _, found := foundPeers[p]; found {
205
- continue
206
- }
207
- foundPeers[p] = struct{}{}
208
-
209
- backupPeers = append(backupPeers, peer.AddrInfo{
210
- ID: p,
211
- Addrs: host.Network().Peerstore().Addrs(p),
212
- })
213
-
214
- if len(backupPeers) >= cfg.MaxBackupBootstrapSize {
215
- break
216
- }
217
- }
218
-
219
- // If we didn't reach the target number use previously stored connected peers.
220
- if len(backupPeers) < cfg.MaxBackupBootstrapSize {
221
- oldSavedPeers := cfg.loadBackupBootstrapPeers(ctx)
222
- log.Debugf("missing %d peers to reach backup bootstrap target of %d, trying from previous list of %d saved peers",
223
- cfg.MaxBackupBootstrapSize-len(backupPeers), cfg.MaxBackupBootstrapSize, len(oldSavedPeers))
224
-
225
- // Add some of the old saved peers. Ensure we don't duplicate them.
226
- for _, p := range oldSavedPeers {
227
- if _, found := foundPeers[p.ID]; found {
228
- continue
229
- }
230
- foundPeers[p.ID] = struct{}{}
231
-
232
- backupPeers = append(backupPeers, p)
233
-
234
- if len(backupPeers) >= cfg.MaxBackupBootstrapSize {
235
- break
236
- }
237
- }
238
- }
239
-
240
- cfg.saveBackupBootstrapPeers(ctx, backupPeers)
241
- log.Debugf("saved %d peers (of %d target) as bootstrap backup in the config", len(backupPeers), cfg.MaxBackupBootstrapSize)
242
- return nil
243
-}
244
-
245
-// Connect to as many peers needed to reach the BootstrapConfig.MinPeerThreshold.
246
-// Peers can be original bootstrap or temporary ones (drawn from a list of
247
-// persisted previously connected peers).
248
-func bootstrapRound(ctx context.Context, host host.Host, cfg BootstrapConfig) error {
249
- ctx, cancel := context.WithTimeout(ctx, cfg.ConnectionTimeout)
250
- defer cancel()
251
- id := host.ID()
252
-
253
- // get bootstrap peers from config. retrieving them here makes
254
- // sure we remain observant of changes to client configuration.
255
- peers := cfg.BootstrapPeers()
256
- // determine how many bootstrap connections to open
257
- connected := host.Network().Peers()
258
- if len(connected) >= cfg.MinPeerThreshold {
259
- log.Debugf("%s core bootstrap skipped -- connected to %d (> %d) nodes",
260
- id, len(connected), cfg.MinPeerThreshold)
261
- return nil
262
- }
263
- numToDial := cfg.MinPeerThreshold - len(connected) // numToDial > 0
264
-
265
- if len(peers) > 0 {
266
- numToDial -= int(peersConnect(ctx, host, peers, numToDial, true))
267
- if numToDial <= 0 {
268
- return nil
269
- }
270
- }
271
-
272
- if cfg.loadBackupBootstrapPeers == nil {
273
- log.Debugf("not enough bootstrap peers to fill the remaining target of %d connections", numToDial)
274
- return ErrNotEnoughBootstrapPeers
275
- }
276
-
277
- log.Debugf("not enough bootstrap peers to fill the remaining target of %d connections, trying backup list", numToDial)
278
-
279
- tempBootstrapPeers := cfg.loadBackupBootstrapPeers(ctx)
280
- if len(tempBootstrapPeers) > 0 {
281
- numToDial -= int(peersConnect(ctx, host, tempBootstrapPeers, numToDial, false))
282
- if numToDial <= 0 {
283
- return nil
284
- }
285
- }
286
-
287
- log.Debugf("tried both original bootstrap peers and temporary ones but still missing target of %d connections", numToDial)
288
-
289
- return ErrNotEnoughBootstrapPeers
290
-}
291
-
292
-// Attempt to make `needed` connections from the `availablePeers` list. Mark
293
-// peers as either `permanent` or temporary when adding them to the Peerstore.
294
-// Return the number of connections completed. We eagerly over-connect in parallel,
295
-// so we might connect to more than needed.
296
-// (We spawn as many routines and attempt connections as the number of availablePeers,
297
-// but this list comes from restricted sets of original or temporary bootstrap
298
-// nodes which will keep it under a sane value.)
299
-func peersConnect(ctx context.Context, ph host.Host, availablePeers []peer.AddrInfo, needed int, permanent bool) uint64 {
300
- peers := randomizeList(availablePeers)
301
-
302
- // Monitor the number of connections and stop if we reach the target.
303
- var connected uint64
304
- ctx, cancel := context.WithCancel(ctx)
305
- defer cancel()
306
- go func() {
307
- for {
308
- select {
309
- case <-ctx.Done():
310
- return
311
- case <-time.After(1 * time.Second):
312
- if int(atomic.LoadUint64(&connected)) >= needed {
313
- cancel()
314
- return
315
- }
316
- }
317
- }
318
- }()
319
-
320
- var wg sync.WaitGroup
321
- for _, p := range peers {
322
-
323
- // performed asynchronously because when performed synchronously, if
324
- // one `Connect` call hangs, subsequent calls are more likely to
325
- // fail/abort due to an expiring context.
326
- // Also, performed asynchronously for dial speed.
327
-
328
- if int(atomic.LoadUint64(&connected)) >= needed {
329
- cancel()
330
- break
331
- }
332
-
333
- wg.Add(1)
334
- go func(p peer.AddrInfo) {
335
- defer wg.Done()
336
-
337
- // Skip addresses belonging to a peer we're already connected to.
338
- // (Not a guarantee but a best-effort policy.)
339
- if ph.Network().Connectedness(p.ID) == network.Connected {
340
- return
341
- }
342
- log.Debugf("%s bootstrapping to %s", ph.ID(), p.ID)
343
-
344
- if err := ph.Connect(ctx, p); err != nil {
345
- if ctx.Err() != context.Canceled {
346
- log.Debugf("failed to bootstrap with %v: %s", p.ID, err)
347
- }
348
- return
349
- }
350
- if permanent {
351
- // We're connecting to an original bootstrap peer, mark it as
352
- // a permanent address (Connect will register it as TempAddrTTL).
353
- ph.Peerstore().AddAddrs(p.ID, p.Addrs, peerstore.PermanentAddrTTL)
354
- }
355
-
356
- log.Infof("bootstrapped with %v", p.ID)
357
- atomic.AddUint64(&connected, 1)
358
- }(p)
359
- }
360
- wg.Wait()
361
-
362
- return connected
363
-}
364
-
365
-func randomizeList[T any](in []T) []T {
366
- out := make([]T, len(in))
367
- for i, val := range rand.Perm(len(in)) {
368
- out[i] = in[val]
369
- }
370
- return out
371
-}
core/bootstrap/bootstrap_test.go
deleted
-139
@@ -1,139 +0,0 @@
1
-package bootstrap
2
-
3
-import (
4
- "context"
5
- "crypto/rand"
6
- "reflect"
7
- "testing"
8
- "time"
9
-
10
- "github.com/libp2p/go-libp2p"
11
- "github.com/libp2p/go-libp2p/core/crypto"
12
- "github.com/libp2p/go-libp2p/core/peer"
13
- "github.com/libp2p/go-libp2p/core/test"
14
-)
15
-
16
-func TestRandomizeAddressList(t *testing.T) {
17
- var ps []peer.AddrInfo
18
- sizeofSlice := 10
19
- for i := 0; i < sizeofSlice; i++ {
20
- pid, err := test.RandPeerID()
21
- if err != nil {
22
- t.Fatal(err)
23
- }
24
-
25
- ps = append(ps, peer.AddrInfo{ID: pid})
26
- }
27
- out := randomizeList(ps)
28
- if len(out) != len(ps) {
29
- t.Fail()
30
- }
31
-}
32
-
33
-func TestLoadAndSaveOptions(t *testing.T) {
34
- loadFunc := func(_ context.Context) []peer.AddrInfo { return nil }
35
- saveFunc := func(_ context.Context, _ []peer.AddrInfo) {}
36
-
37
- bootCfg := BootstrapConfigWithPeers(nil, WithBackupPeers(loadFunc, saveFunc))
38
- load, save := bootCfg.BackupPeers()
39
- if load == nil {
40
- t.Fatal("load function not assigned")
41
- }
42
- if reflect.ValueOf(load).Pointer() != reflect.ValueOf(loadFunc).Pointer() {
43
- t.Fatal("load not assigned correct function")
44
- }
45
- if save == nil {
46
- t.Fatal("save function not assigned")
47
- }
48
- if reflect.ValueOf(save).Pointer() != reflect.ValueOf(saveFunc).Pointer() {
49
- t.Fatal("save not assigned correct function")
50
- }
51
-
52
- assertPanics(t, "with only load func", func() {
53
- BootstrapConfigWithPeers(nil, WithBackupPeers(loadFunc, nil))
54
- })
55
-
56
- assertPanics(t, "with only save func", func() {
57
- BootstrapConfigWithPeers(nil, WithBackupPeers(nil, saveFunc))
58
- })
59
-
60
- bootCfg = BootstrapConfigWithPeers(nil, WithBackupPeers(nil, nil))
61
- load, save = bootCfg.BackupPeers()
62
- if load != nil || save != nil {
63
- t.Fatal("load and save functions should both be nil")
64
- }
65
-}
66
-
67
-func TestSetBackupPeers(t *testing.T) {
68
- loadFunc := func(_ context.Context) []peer.AddrInfo { return nil }
69
- saveFunc := func(_ context.Context, _ []peer.AddrInfo) {}
70
-
71
- bootCfg := DefaultBootstrapConfig
72
- bootCfg.SetBackupPeers(loadFunc, saveFunc)
73
- load, save := bootCfg.BackupPeers()
74
- if load == nil {
75
- t.Fatal("load function not assigned")
76
- }
77
- if reflect.ValueOf(load).Pointer() != reflect.ValueOf(loadFunc).Pointer() {
78
- t.Fatal("load not assigned correct function")
79
- }
80
- if save == nil {
81
- t.Fatal("save function not assigned")
82
- }
83
- if reflect.ValueOf(save).Pointer() != reflect.ValueOf(saveFunc).Pointer() {
84
- t.Fatal("save not assigned correct function")
85
- }
86
-
87
- assertPanics(t, "with only load func", func() {
88
- bootCfg.SetBackupPeers(loadFunc, nil)
89
- })
90
-
91
- assertPanics(t, "with only save func", func() {
92
- bootCfg.SetBackupPeers(nil, saveFunc)
93
- })
94
-
95
- bootCfg.SetBackupPeers(nil, nil)
96
- load, save = bootCfg.BackupPeers()
97
- if load != nil || save != nil {
98
- t.Fatal("load and save functions should both be nil")
99
- }
100
-}
101
-
102
-func TestNoTempPeersLoadAndSave(t *testing.T) {
103
- period := 500 * time.Millisecond
104
- bootCfg := BootstrapConfigWithPeers(nil)
105
- bootCfg.MinPeerThreshold = 2
106
- bootCfg.Period = period
107
-
108
- priv, pub, err := crypto.GenerateEd25519Key(rand.Reader)
109
- if err != nil {
110
- t.Fatal(err)
111
- }
112
- peerID, err := peer.IDFromPublicKey(pub)
113
- if err != nil {
114
- t.Fatal(err)
115
- }
116
- p2pHost, err := libp2p.New(libp2p.Identity(priv))
117
- if err != nil {
118
- t.Fatal(err)
119
- }
120
-
121
- bootstrapper, err := Bootstrap(peerID, p2pHost, nil, bootCfg)
122
- if err != nil {
123
- t.Fatal(err)
124
- }
125
-
126
- time.Sleep(4 * period)
127
- bootstrapper.Close()
128
-
129
-}
130
-
131
-func assertPanics(t *testing.T, name string, f func()) {
132
- defer func() {
133
- if r := recover(); r == nil {
134
- t.Errorf("%s: did not panic as expected", name)
135
- }
136
- }()
137
-
138
- f()
139
-}
core/builder.go
+1
-1
@@ -7,7 +7,7 @@ import (
7
"sync"
8
"time"
9
10
- "github.com/ipfs/kubo/core/bootstrap"
10
+ "github.com/ipfs/boxo/bootstrap"
11
"github.com/ipfs/kubo/core/node"
12
13
"github.com/ipfs/go-metrics-interface"
core/core.go
+1
-1
@@ -47,11 +47,11 @@ import (
47
ma "github.com/multiformats/go-multiaddr"
48
madns "github.com/multiformats/go-multiaddr-dns"
49
50
+ "github.com/ipfs/boxo/bootstrap"
51
"github.com/ipfs/boxo/namesys"
52
ipnsrp "github.com/ipfs/boxo/namesys/republisher"
53
"github.com/ipfs/boxo/peering"
54
"github.com/ipfs/kubo/config"
54
- "github.com/ipfs/kubo/core/bootstrap"
55
"github.com/ipfs/kubo/core/node"
56
"github.com/ipfs/kubo/core/node/libp2p"
57
"github.com/ipfs/kubo/fuse/mount"
core/coreapi/test/api_test.go
+1
-1
@@ -8,10 +8,10 @@ import (
8
"path/filepath"
9
"testing"
10
11
+ "github.com/ipfs/boxo/bootstrap"
12
"github.com/ipfs/boxo/filestore"
13
keystore "github.com/ipfs/boxo/keystore"
14
"github.com/ipfs/kubo/core"
14
- "github.com/ipfs/kubo/core/bootstrap"
15
"github.com/ipfs/kubo/core/coreapi"
16
mock "github.com/ipfs/kubo/core/mock"
17
"github.com/ipfs/kubo/core/node/libp2p"
docs/examples/kubo-as-a-library/go.mod
+1
-1
@@ -7,7 +7,7 @@ go 1.20
7
replace github.com/ipfs/kubo => ./../../..
8
9
require (
10
- github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc
10
+ github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e
11
github.com/ipfs/kubo v0.0.0-00010101000000-000000000000
12
github.com/libp2p/go-libp2p v0.31.0
13
github.com/multiformats/go-multiaddr v0.11.0
docs/examples/kubo-as-a-library/go.sum
+2
-2
@@ -305,8 +305,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
305
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
306
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
307
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
308
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc h1:jKrgzSr4RC04aG2LX8lA0emMOxSrckORZE4GKRZUt0Y=
309
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
308
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e h1:+A0lJ8vc6YtiMiq3UodN0BgZJTso/VJDrECdyHpsFDY=
309
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
310
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
311
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
312
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
go.mod
+1
-1
@@ -17,7 +17,7 @@ require (
17
github.com/hashicorp/go-multierror v1.1.1
18
github.com/ipfs-shipyard/nopfs v0.0.12-0.20231027223058-cde3b5ba964c
19
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c
20
- github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc
20
+ github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e
21
github.com/ipfs/go-block-format v0.2.0
22
github.com/ipfs/go-cid v0.4.1
23
github.com/ipfs/go-cidutil v0.1.0
go.sum
+2
-2
@@ -339,8 +339,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy
339
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
340
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
341
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
342
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc h1:jKrgzSr4RC04aG2LX8lA0emMOxSrckORZE4GKRZUt0Y=
343
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
342
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e h1:+A0lJ8vc6YtiMiq3UodN0BgZJTso/VJDrECdyHpsFDY=
343
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
344
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
345
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
346
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=
test/dependencies/go.mod
+1
-1
@@ -7,7 +7,7 @@ replace github.com/ipfs/kubo => ../../
7
require (
8
github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd
9
github.com/golangci/golangci-lint v1.54.1
10
- github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc
10
+ github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e
11
github.com/ipfs/go-cid v0.4.1
12
github.com/ipfs/go-cidutil v0.1.0
13
github.com/ipfs/go-datastore v0.6.0
test/dependencies/go.sum
+2
-2
@@ -398,8 +398,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
398
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
399
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
400
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
401
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc h1:jKrgzSr4RC04aG2LX8lA0emMOxSrckORZE4GKRZUt0Y=
402
-github.com/ipfs/boxo v0.13.2-0.20231031104528-b0a265b5cdcc/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
401
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e h1:+A0lJ8vc6YtiMiq3UodN0BgZJTso/VJDrECdyHpsFDY=
402
+github.com/ipfs/boxo v0.13.2-0.20231031170949-08b11e5df06e/go.mod h1:pu8HsZvuyYeYJsqtLDCoYSvy8rHj6vI3dlh8P0f83Zs=
403
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
404
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
405
github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs=
test/integration/addcat_test.go
+1
-1
@@ -11,10 +11,10 @@ import (
11
"testing"
12
"time"
13
14
+ "github.com/ipfs/boxo/bootstrap"
15
"github.com/ipfs/boxo/files"
16
logging "github.com/ipfs/go-log"
17
"github.com/ipfs/kubo/core"
17
- "github.com/ipfs/kubo/core/bootstrap"
18
"github.com/ipfs/kubo/core/coreapi"
19
mock "github.com/ipfs/kubo/core/mock"
20
"github.com/ipfs/kubo/thirdparty/unit"
test/integration/bench_cat_test.go
+1
-1
@@ -8,9 +8,9 @@ import (
8
"math"
9
"testing"
10
11
+ "github.com/ipfs/boxo/bootstrap"
12
"github.com/ipfs/boxo/files"
13
"github.com/ipfs/kubo/core"
13
- "github.com/ipfs/kubo/core/bootstrap"
14
"github.com/ipfs/kubo/core/coreapi"
15
mock "github.com/ipfs/kubo/core/mock"
16
"github.com/ipfs/kubo/thirdparty/unit"
test/integration/pubsub_msg_seen_cache_test.go
+1
-1
@@ -10,9 +10,9 @@ import (
10
11
"go.uber.org/fx"
12
13
+ "github.com/ipfs/boxo/bootstrap"
14
"github.com/ipfs/kubo/config"
15
"github.com/ipfs/kubo/core"
15
- "github.com/ipfs/kubo/core/bootstrap"
16
"github.com/ipfs/kubo/core/coreapi"
17
libp2p2 "github.com/ipfs/kubo/core/node/libp2p"
18
"github.com/ipfs/kubo/repo"
test/integration/three_legged_cat_test.go
+1
-1
@@ -9,7 +9,7 @@ import (
9
"testing"
10
"time"
11
12
- bootstrap2 "github.com/ipfs/kubo/core/bootstrap"
12
+ bootstrap2 "github.com/ipfs/boxo/bootstrap"
13
"github.com/ipfs/kubo/core/coreapi"
14
mock "github.com/ipfs/kubo/core/mock"
15
"github.com/ipfs/kubo/thirdparty/unit"