diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go index 5c0d9616006..6b87ff44229 100644 --- a/cmd/ipfs/kubo/daemon.go +++ b/cmd/ipfs/kubo/daemon.go @@ -295,7 +295,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment if !domigrate { fmt.Println("Not running migrations of fs-repo now.") fmt.Println("Please get fs-repo-migrations from https://dist.ipfs.tech") - return fmt.Errorf("fs-repo requires migration") + return errors.New("fs-repo requires migration") } // Read Migration section of IPFS config @@ -436,7 +436,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment ncfg.Routing = libp2p.NilRouterOption case routingOptionCustomKwd: if cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient) { - return fmt.Errorf("Routing.AcceleratedDHTClient option is set even tho Routing.Type is custom, using custom .AcceleratedDHTClient needs to be set on DHT routers individually") + return errors.New("Routing.AcceleratedDHTClient option is set even tho Routing.Type is custom, using custom .AcceleratedDHTClient needs to be set on DHT routers individually") } ncfg.Routing = libp2p.ConstructDelegatedRouting( cfg.Routing.Routers, diff --git a/cmd/ipfs/kubo/init.go b/cmd/ipfs/kubo/init.go index 986fe90c8b1..06312014884 100644 --- a/cmd/ipfs/kubo/init.go +++ b/cmd/ipfs/kubo/init.go @@ -88,11 +88,11 @@ environment variable: if it.Err() != nil { return it.Err() } - return fmt.Errorf("file argument was nil") + return errors.New("file argument was nil") } file := files.FileFromEntry(it) if file == nil { - return fmt.Errorf("expected a regular file") + return errors.New("expected a regular file") } conf = &config.Config{} diff --git a/core/commands/add.go b/core/commands/add.go index 73491c03b44..8dcdd92171a 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -25,7 +25,7 @@ import ( ) // ErrDepthLimitExceeded indicates that the max depth has been exceeded. -var ErrDepthLimitExceeded = fmt.Errorf("depth limit exceeded") +var ErrDepthLimitExceeded = errors.New("depth limit exceeded") type TimeParts struct { t *time.Time diff --git a/core/commands/cat.go b/core/commands/cat.go index 6fa1f71b79d..38a3e8dfaf6 100644 --- a/core/commands/cat.go +++ b/core/commands/cat.go @@ -2,7 +2,7 @@ package commands import ( "context" - "fmt" + "errors" "io" "os" @@ -43,13 +43,13 @@ var CatCmd = &cmds.Command{ offset, _ := req.Options[offsetOptionName].(int64) if offset < 0 { - return fmt.Errorf("cannot specify negative offset") + return errors.New("cannot specify negative offset") } max, found := req.Options[lengthOptionName].(int64) if max < 0 { - return fmt.Errorf("cannot specify negative length") + return errors.New("cannot specify negative length") } if !found { max = -1 diff --git a/core/commands/cid.go b/core/commands/cid.go index b2e8f131d53..a3f3a5490f4 100644 --- a/core/commands/cid.go +++ b/core/commands/cid.go @@ -1,6 +1,7 @@ package commands import ( + "errors" "fmt" "io" "sort" @@ -85,10 +86,10 @@ The optional format string is a printf style format string: } case "0": if opts.newCodec != 0 && opts.newCodec != cid.DagProtobuf { - return fmt.Errorf("cannot convert to CIDv0 with any codec other than dag-pb") + return errors.New("cannot convert to CIDv0 with any codec other than dag-pb") } if baseStr != "" && baseStr != "base58btc" { - return fmt.Errorf("cannot convert to CIDv0 with any multibase other than the implicit base58btc") + return errors.New("cannot convert to CIDv0 with any multibase other than the implicit base58btc") } opts.verConv = toCidV0 case "1": diff --git a/core/commands/dht.go b/core/commands/dht.go index 1d46201819b..eaa8188e650 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -78,7 +78,7 @@ var queryDhtCmd = &cmds.Command{ } if d, ok := client.(kademlia); !ok { - return fmt.Errorf("dht client does not support GetClosestPeers") + return errors.New("dht client does not support GetClosestPeers") } else { errCh := make(chan error, 1) go func() { diff --git a/core/commands/files.go b/core/commands/files.go index d1a52cbfbbb..40e4f3d7aea 100644 --- a/core/commands/files.go +++ b/core/commands/files.go @@ -327,7 +327,7 @@ func statNode(nd ipld.Node, enc cidenc.Encoder) (*statOutput, error) { Type: "file", }, nil default: - return nil, fmt.Errorf("not unixfs node (proto or raw)") + return nil, errors.New("not unixfs node (proto or raw)") } } diff --git a/core/commands/id.go b/core/commands/id.go index 3446fc267cd..33ad0328698 100644 --- a/core/commands/id.go +++ b/core/commands/id.go @@ -81,7 +81,7 @@ EXAMPLE: var err error id, err = peer.Decode(req.Arguments[0]) if err != nil { - return fmt.Errorf("invalid peer id") + return errors.New("invalid peer id") } } else { id = n.Identity diff --git a/core/commands/keystore.go b/core/commands/keystore.go index a86fb281af3..0ffd141891e 100644 --- a/core/commands/keystore.go +++ b/core/commands/keystore.go @@ -5,6 +5,7 @@ import ( "crypto/ed25519" "crypto/x509" "encoding/pem" + "errors" "fmt" "io" "os" @@ -101,12 +102,12 @@ var keyGenCmd = &cmds.Command{ typ, f := req.Options[keyStoreTypeOptionName].(string) if !f { - return fmt.Errorf("please specify a key type with --type") + return errors.New("please specify a key type with --type") } name := req.Arguments[0] if name == "self" { - return fmt.Errorf("cannot create key with name 'self'") + return errors.New("cannot create key with name 'self'") } opts := []options.KeyGenerateOption{options.Key.Type(typ)} diff --git a/core/commands/p2p.go b/core/commands/p2p.go index 7b8b416e59c..1fbdc8a2861 100644 --- a/core/commands/p2p.go +++ b/core/commands/p2p.go @@ -250,7 +250,7 @@ func checkPort(target ma.Multiaddr) error { if sport != "" { return sport, nil } - return "", fmt.Errorf("address does not contain tcp or udp protocol") + return "", errors.New("address does not contain tcp or udp protocol") } sport, err := getPort() @@ -264,7 +264,7 @@ func checkPort(target ma.Multiaddr) error { } if port == 0 { - return fmt.Errorf("port can not be 0") + return errors.New("port can not be 0") } return nil diff --git a/core/commands/routing.go b/core/commands/routing.go index 3e503b014c9..c284166c8d1 100644 --- a/core/commands/routing.go +++ b/core/commands/routing.go @@ -70,7 +70,7 @@ var findProvidersRoutingCmd = &cmds.Command{ numProviders, _ := req.Options[numProvidersOptionName].(int) if numProviders < 1 { - return fmt.Errorf("number of providers must be greater than 0") + return errors.New("number of providers must be greater than 0") } c, err := cid.Parse(req.Arguments[0]) diff --git a/core/commands/stat.go b/core/commands/stat.go index 4ceb95f13d0..3f32a77a6cf 100644 --- a/core/commands/stat.go +++ b/core/commands/stat.go @@ -1,6 +1,7 @@ package commands import ( + "errors" "fmt" "io" "os" @@ -100,7 +101,7 @@ Example: } if nd.Reporter == nil { - return fmt.Errorf("bandwidth reporter disabled in config") + return errors.New("bandwidth reporter disabled in config") } pstr, pfound := req.Options[statPeerOptionName].(string) diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go index b757929a26c..2cf86e172ef 100644 --- a/core/coreapi/coreapi.go +++ b/core/coreapi/coreapi.go @@ -218,7 +218,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e cs = node.DefaultIpnsCacheSize } if cs < 0 { - return nil, fmt.Errorf("cannot specify negative resolve cache size") + return nil, errors.New("cannot specify negative resolve cache size") } nsOptions := []namesys.Option{ diff --git a/core/coreapi/key.go b/core/coreapi/key.go index a6101dae826..784045d26e3 100644 --- a/core/coreapi/key.go +++ b/core/coreapi/key.go @@ -65,7 +65,7 @@ func (api *KeyAPI) Generate(ctx context.Context, name string, opts ...caopts.Key } if name == "self" { - return nil, fmt.Errorf("cannot create key with name 'self'") + return nil, errors.New("cannot create key with name 'self'") } _, err = api.repo.Keystore().Get(name) @@ -168,11 +168,11 @@ func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName string, o ks := api.repo.Keystore() if oldName == "self" { - return nil, false, fmt.Errorf("cannot rename key with name 'self'") + return nil, false, errors.New("cannot rename key with name 'self'") } if newName == "self" { - return nil, false, fmt.Errorf("cannot overwrite key with name 'self'") + return nil, false, errors.New("cannot overwrite key with name 'self'") } oldKey, err := ks.Get(oldName) @@ -232,7 +232,7 @@ func (api *KeyAPI) Remove(ctx context.Context, name string) (coreiface.Key, erro ks := api.repo.Keystore() if name == "self" { - return nil, fmt.Errorf("cannot remove key with name 'self'") + return nil, errors.New("cannot remove key with name 'self'") } removed, err := ks.Get(name) diff --git a/core/coreapi/name.go b/core/coreapi/name.go index 3c4145ed501..305c19e43c6 100644 --- a/core/coreapi/name.go +++ b/core/coreapi/name.go @@ -2,6 +2,7 @@ package coreapi import ( "context" + "errors" "fmt" "strings" "time" @@ -214,5 +215,5 @@ func keylookup(self ci.PrivKey, kstore keystore.Keystore, k string) (ci.PrivKey, } } - return nil, fmt.Errorf("no key by the given name or PeerID was found") + return nil, errors.New("no key by the given name or PeerID was found") } diff --git a/core/coreapi/routing.go b/core/coreapi/routing.go index fe273158e1e..6d432d744dd 100644 --- a/core/coreapi/routing.go +++ b/core/coreapi/routing.go @@ -109,7 +109,7 @@ func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path, opts ...c numProviders := settings.NumProviders if numProviders < 1 { - return nil, fmt.Errorf("number of providers must be greater than 0") + return nil, errors.New("number of providers must be greater than 0") } pchan := api.routing.FindProvidersAsync(ctx, rp.RootCid(), numProviders) diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go index 9d91f09b6ef..6068c9b0596 100644 --- a/core/coreapi/unixfs.go +++ b/core/coreapi/unixfs.go @@ -72,7 +72,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options //} if settings.NoCopy && !(cfg.Experimental.FilestoreEnabled || cfg.Experimental.UrlstoreEnabled) { - return path.ImmutablePath{}, fmt.Errorf("either the filestore or the urlstore must be enabled to use nocopy, see: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore") + return path.ImmutablePath{}, errors.New("either the filestore or the urlstore must be enabled to use nocopy, see: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore") } addblockstore := api.blockstore diff --git a/core/node/groups.go b/core/node/groups.go index 519cbb47d6e..594bbe6256e 100644 --- a/core/node/groups.go +++ b/core/node/groups.go @@ -260,7 +260,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part ipnsCacheSize = DefaultIpnsCacheSize } if ipnsCacheSize < 0 { - return fx.Error(fmt.Errorf("cannot specify negative resolve cache size")) + return fx.Error(errors.New("cannot specify negative resolve cache size")) } // Republisher params diff --git a/core/node/libp2p/rcmgr.go b/core/node/libp2p/rcmgr.go index 977461e04bd..e08b7c5d5e0 100644 --- a/core/node/libp2p/rcmgr.go +++ b/core/node/libp2p/rcmgr.go @@ -3,6 +3,7 @@ package libp2p import ( "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -26,7 +27,7 @@ var rcmgrLogger = logging.Logger("rcmgr") const NetLimitTraceFilename = "rcmgr.json.gz" -var ErrNoResourceMgr = fmt.Errorf("missing ResourceMgr: make sure the daemon is running with Swarm.ResourceMgr.Enabled") +var ErrNoResourceMgr = errors.New("missing ResourceMgr: make sure the daemon is running with Swarm.ResourceMgr.Enabled") func ResourceManager(repoPath string, cfg config.SwarmConfig, userResourceOverrides rcmgr.PartialLimitConfig) interface{} { return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo) (network.ResourceManager, Libp2pOpts, error) { diff --git a/core/node/libp2p/smux.go b/core/node/libp2p/smux.go index d52b306d85b..5b87f7d0821 100644 --- a/core/node/libp2p/smux.go +++ b/core/node/libp2p/smux.go @@ -1,7 +1,7 @@ package libp2p import ( - "fmt" + "errors" "os" "github.com/ipfs/kubo/config" @@ -12,10 +12,10 @@ import ( func makeSmuxTransportOption(tptConfig config.Transports) (libp2p.Option, error) { if prefs := os.Getenv("LIBP2P_MUX_PREFS"); prefs != "" { - return nil, fmt.Errorf("configuring muxers with LIBP2P_MUX_PREFS is no longer supported, use Swarm.Transports.Multiplexers") + return nil, errors.New("configuring muxers with LIBP2P_MUX_PREFS is no longer supported, use Swarm.Transports.Multiplexers") } if tptConfig.Multiplexers.Yamux < 0 { - return nil, fmt.Errorf("running libp2p with Swarm.Transports.Multiplexers.Yamux disabled is not supported") + return nil, errors.New("running libp2p with Swarm.Transports.Multiplexers.Yamux disabled is not supported") } return libp2p.Muxer(yamux.ID, yamux.DefaultTransport), nil diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md index 1adf16dd0bb..4dd6ba8065d 100644 --- a/docs/changelogs/v0.33.md +++ b/docs/changelogs/v0.33.md @@ -33,7 +33,7 @@ Onboarding files and directories with `ipfs add --to-files` now requires non-emp #### 📦️ Dependency updates -- update `boxo` to [v0.24.TODO](https://github.com/ipfs/boxo/releases/tag/v0.24.TODO) +- update `boxo` to [v0.25.0](https://github.com/ipfs/boxo/releases/tag/v0.25.0) - update `go-libp2p` to [v0.37.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.1) + [v0.37.2](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.2) - update `p2p-forge/client` to [v0.1.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.1.0) - update `ipfs-webui` to [v4.4.1](https://github.com/ipfs/ipfs-webui/releases/tag/v4.4.1) diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod index 8cfb0a72752..1bd9a534a3c 100644 --- a/docs/examples/kubo-as-a-library/go.mod +++ b/docs/examples/kubo-as-a-library/go.mod @@ -7,7 +7,7 @@ go 1.23 replace github.com/ipfs/kubo => ./../../.. require ( - github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 + github.com/ipfs/boxo v0.25.0 github.com/ipfs/kubo v0.0.0-00010101000000-000000000000 github.com/libp2p/go-libp2p v0.37.2 github.com/multiformats/go-multiaddr v0.13.0 diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum index 5ee33c29cdb..ccb32f7519c 100644 --- a/docs/examples/kubo-as-a-library/go.sum +++ b/docs/examples/kubo-as-a-library/go.sum @@ -302,8 +302,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 h1:kiS5+H+6aJeNWWDynuYu/ijgzkBTrInl++VFcNDgq+g= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492/go.mod h1:lAoydO+oJhB1e7pUn4ju1Z1fuUIwy+zb0hQXRb/bu2g= +github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is= +github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= diff --git a/go.mod b/go.mod index b0051da870c..f9cefd5046f 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/hashicorp/go-version v1.7.0 github.com/ipfs-shipyard/nopfs v0.0.12 github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c - github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 + github.com/ipfs/boxo v0.25.0 github.com/ipfs/go-block-format v0.2.0 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-cidutil v0.1.0 diff --git a/go.sum b/go.sum index 9054a1f7033..35772a11e10 100644 --- a/go.sum +++ b/go.sum @@ -366,8 +366,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c h1:7Uy github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231027223058-cde3b5ba964c/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 h1:kiS5+H+6aJeNWWDynuYu/ijgzkBTrInl++VFcNDgq+g= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492/go.mod h1:lAoydO+oJhB1e7pUn4ju1Z1fuUIwy+zb0hQXRb/bu2g= +github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is= +github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ= diff --git a/test/dependencies/go.mod b/test/dependencies/go.mod index 05847e9e4f5..565e94fb85f 100644 --- a/test/dependencies/go.mod +++ b/test/dependencies/go.mod @@ -75,6 +75,7 @@ require ( github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/gammazero/deque v1.0.0 // indirect github.com/ghostiam/protogetter v0.3.6 // indirect github.com/go-critic/go-critic v0.11.4 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -119,7 +120,7 @@ require ( github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 // indirect + github.com/ipfs/boxo v0.25.0 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-datastore v0.6.0 // indirect diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum index e0f4abd3c91..c436e7acf47 100644 --- a/test/dependencies/go.sum +++ b/test/dependencies/go.sum @@ -322,8 +322,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492 h1:kiS5+H+6aJeNWWDynuYu/ijgzkBTrInl++VFcNDgq+g= -github.com/ipfs/boxo v0.24.4-0.20241203185533-3a3e8afa3492/go.mod h1:lAoydO+oJhB1e7pUn4ju1Z1fuUIwy+zb0hQXRb/bu2g= +github.com/ipfs/boxo v0.25.0 h1:FNZaKVirUDafGz3Y9sccztynAUazs9GfSapLk/5c7is= +github.com/ipfs/boxo v0.25.0/go.mod h1:MQVkL3V8RfuIsn+aajCR0MXLl8nRlz+5uGlHMWFVyuE= github.com/ipfs/go-block-format v0.2.0 h1:ZqrkxBA2ICbDRbK8KJs/u0O3dlp6gmAuuXUJNiW1Ycs= github.com/ipfs/go-block-format v0.2.0/go.mod h1:+jpL11nFx5A/SPpsoBn6Bzkra/zaArfSmsknbPMYgzM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s=