diff --git a/client/rpc/apifile.go b/client/rpc/apifile.go index 8c28d8dd9e69..84a9a106f042 100644 --- a/client/rpc/apifile.go +++ b/client/rpc/apifile.go @@ -17,7 +17,7 @@ const forwardSeekLimit = 1 << 14 // 16k func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Node, error) { if p.Namespace().Mutable() { // use resolved path in case we are dealing with IPNS / MFS var err error - p, err = api.core().ResolvePath(ctx, p) + p, _, err = api.core().ResolvePath(ctx, p) if err != nil { return nil, err } diff --git a/client/rpc/dht.go b/client/rpc/dht.go index d5cca37d796e..8b9cc2c3335d 100644 --- a/client/rpc/dht.go +++ b/client/rpc/dht.go @@ -42,7 +42,7 @@ func (api *DhtAPI) FindProviders(ctx context.Context, p path.Path, opts ...caopt return nil, err } - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return nil, err } @@ -98,7 +98,7 @@ func (api *DhtAPI) Provide(ctx context.Context, p path.Path, opts ...caopts.DhtP return err } - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return err } diff --git a/client/rpc/path.go b/client/rpc/path.go index 57ba242bf911..6a06a08fde20 100644 --- a/client/rpc/path.go +++ b/client/rpc/path.go @@ -8,35 +8,38 @@ import ( ipld "github.com/ipfs/go-ipld-format" ) -func (api *HttpApi) ResolvePath(ctx context.Context, p path.Path) (path.ImmutablePath, error) { +func (api *HttpApi) ResolvePath(ctx context.Context, p path.Path) (path.ImmutablePath, []string, error) { var out struct { Cid cid.Cid RemPath string } - // TODO: this is hacky, fixing https://github.com/ipfs/go-ipfs/issues/5703 would help - var err error if p.Namespace() == path.IPNSNamespace { if p, err = api.Name().Resolve(ctx, p.String()); err != nil { - return nil, err + return nil, nil, err } } if err := api.Request("dag/resolve", p.String()).Exec(ctx, &out); err != nil { - return nil, err + return nil, nil, err } p, err = path.NewPathFromSegments(p.Namespace().String(), out.Cid.String(), out.RemPath) if err != nil { - return nil, err + return nil, nil, err + } + + imPath, err := path.NewImmutablePath(p) + if err != nil { + return nil, nil, err } - return path.NewImmutablePath(p) + return imPath, path.StringToSegments(out.RemPath), nil } func (api *HttpApi) ResolveNode(ctx context.Context, p path.Path) (ipld.Node, error) { - rp, err := api.ResolvePath(ctx, p) + rp, _, err := api.ResolvePath(ctx, p) if err != nil { return nil, err } diff --git a/core/commands/block.go b/core/commands/block.go index 4d0c1742af61..eecc4368cd34 100644 --- a/core/commands/block.go +++ b/core/commands/block.go @@ -270,7 +270,7 @@ It takes a list of CIDs to remove from the local datastore.. return err } - rp, err := api.ResolvePath(req.Context, p) + rp, _, err := api.ResolvePath(req.Context, p) if err != nil { return err } diff --git a/core/commands/dag/get.go b/core/commands/dag/get.go index b03cfa9e86d1..3add3f6b6fbc 100644 --- a/core/commands/dag/get.go +++ b/core/commands/dag/get.go @@ -4,6 +4,7 @@ import ( "fmt" "io" + "github.com/ipfs/boxo/path" ipldlegacy "github.com/ipfs/go-ipld-legacy" "github.com/ipfs/kubo/core/commands/cmdenv" "github.com/ipfs/kubo/core/commands/cmdutils" @@ -33,7 +34,7 @@ func dagGet(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) e return err } - rp, err := api.ResolvePath(req.Context, p) + rp, remainder, err := api.ResolvePath(req.Context, p) if err != nil { return err } @@ -50,8 +51,8 @@ func dagGet(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) e finalNode := universal.(ipld.Node) - if len(rp.Remainder()) > 0 { - remainderPath := ipld.ParsePath(rp.Remainder()) + if len(remainder) > 0 { + remainderPath := ipld.ParsePath(path.SegmentsToString(remainder...)) finalNode, err = traversal.Get(finalNode, remainderPath) if err != nil { diff --git a/core/commands/dag/resolve.go b/core/commands/dag/resolve.go index 88bff3fcc92f..8d5c9be71352 100644 --- a/core/commands/dag/resolve.go +++ b/core/commands/dag/resolve.go @@ -1,6 +1,7 @@ package dagcmd import ( + "github.com/ipfs/boxo/path" "github.com/ipfs/kubo/core/commands/cmdenv" "github.com/ipfs/kubo/core/commands/cmdutils" @@ -18,13 +19,13 @@ func dagResolve(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environmen return err } - rp, err := api.ResolvePath(req.Context, p) + rp, remainder, err := api.ResolvePath(req.Context, p) if err != nil { return err } return cmds.EmitOnce(res, &ResolveOutput{ Cid: rp.Cid(), - RemPath: rp.Remainder(), + RemPath: path.SegmentsToString(remainder...), }) } diff --git a/core/commands/dag/stat.go b/core/commands/dag/stat.go index 57473c0550b1..9e0b2747416c 100644 --- a/core/commands/dag/stat.go +++ b/core/commands/dag/stat.go @@ -33,11 +33,11 @@ func dagStat(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) if err != nil { return err } - rp, err := api.ResolvePath(req.Context, p) + rp, remainder, err := api.ResolvePath(req.Context, p) if err != nil { return err } - if len(rp.Remainder()) > 0 { + if len(remainder) > 0 { return fmt.Errorf("cannot return size for anything other than a DAG with a root CID") } diff --git a/core/commands/object/object.go b/core/commands/object/object.go index 0459d44ad722..28a37aaf9f4d 100644 --- a/core/commands/object/object.go +++ b/core/commands/object/object.go @@ -143,7 +143,7 @@ multihash. Provided for legacy reasons. Use 'ipfs dag get' instead. return err } - rp, err := api.ResolvePath(req.Context, path) + rp, _, err := api.ResolvePath(req.Context, path) if err != nil { return err } diff --git a/core/commands/pin/pin.go b/core/commands/pin/pin.go index dfed08533059..8696584ade52 100644 --- a/core/commands/pin/pin.go +++ b/core/commands/pin/pin.go @@ -189,7 +189,7 @@ func pinAddMany(ctx context.Context, api coreiface.CoreAPI, enc cidenc.Encoder, return nil, err } - rp, err := api.ResolvePath(ctx, p) + rp, _, err := api.ResolvePath(ctx, p) if err != nil { return nil, err } @@ -252,7 +252,7 @@ ipfs pin ls -t indirect return err } - rp, err := api.ResolvePath(req.Context, p) + rp, _, err := api.ResolvePath(req.Context, p) if err != nil { return err } @@ -468,7 +468,7 @@ func pinLsKeys(req *cmds.Request, typeStr string, api coreiface.CoreAPI, emit fu return err } - rp, err := api.ResolvePath(req.Context, p) + rp, _, err := api.ResolvePath(req.Context, p) if err != nil { return err } @@ -594,11 +594,11 @@ pin. } // Resolve the paths ahead of time so we can return the actual CIDs - from, err := api.ResolvePath(req.Context, fromPath) + from, _, err := api.ResolvePath(req.Context, fromPath) if err != nil { return err } - to, err := api.ResolvePath(req.Context, toPath) + to, _, err := api.ResolvePath(req.Context, toPath) if err != nil { return err } diff --git a/core/commands/pin/remotepin.go b/core/commands/pin/remotepin.go index 7af040304d23..59c064e6c6f1 100644 --- a/core/commands/pin/remotepin.go +++ b/core/commands/pin/remotepin.go @@ -162,7 +162,7 @@ NOTE: a comma-separated notation is supported in CLI for convenience: return err } - rp, err := api.ResolvePath(ctx, p) + rp, _, err := api.ResolvePath(ctx, p) if err != nil { return err } diff --git a/core/commands/refs.go b/core/commands/refs.go index 62c7639ff392..99da47fd46c0 100644 --- a/core/commands/refs.go +++ b/core/commands/refs.go @@ -175,7 +175,7 @@ func objectsForPaths(ctx context.Context, n iface.CoreAPI, paths []string) ([]ci if err != nil { return nil, err } - o, err := n.ResolvePath(ctx, p) + o, _, err := n.ResolvePath(ctx, p) if err != nil { return nil, err } diff --git a/core/commands/resolve.go b/core/commands/resolve.go index 7c589b5b206e..a69b21564bad 100644 --- a/core/commands/resolve.go +++ b/core/commands/resolve.go @@ -134,15 +134,15 @@ Resolve the value of an IPFS DAG path: } // else, ipfs path or ipns with recursive flag - rp, err := api.ResolvePath(req.Context, p) + rp, remainder, err := api.ResolvePath(req.Context, p) if err != nil { return err } // Trick to encode path with correct encoding. encodedPath := "/" + rp.Namespace().String() + "/" + enc.Encode(rp.Cid()) - if remainder := rp.Remainder(); remainder != "" { - encodedPath += "/" + remainder + if len(remainder) != 0 { + encodedPath += path.SegmentsToString(remainder...) } // Ensure valid and sanitized. diff --git a/core/coreapi/block.go b/core/coreapi/block.go index 45095e619143..4da01224f056 100644 --- a/core/coreapi/block.go +++ b/core/coreapi/block.go @@ -74,7 +74,7 @@ func (api *BlockAPI) Put(ctx context.Context, src io.Reader, opts ...caopts.Bloc func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader, error) { ctx, span := tracing.Span(ctx, "CoreAPI.BlockAPI", "Get", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return nil, err } @@ -91,7 +91,7 @@ func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caopts.BlockRm ctx, span := tracing.Span(ctx, "CoreAPI.BlockAPI", "Rm", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return err } @@ -132,7 +132,7 @@ func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (coreiface.BlockStat ctx, span := tracing.Span(ctx, "CoreAPI.BlockAPI", "Stat", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return nil, err } diff --git a/core/coreapi/dht.go b/core/coreapi/dht.go index ded762e4a5b5..78a95b6c48f6 100644 --- a/core/coreapi/dht.go +++ b/core/coreapi/dht.go @@ -53,7 +53,7 @@ func (api *DhtAPI) FindProviders(ctx context.Context, p path.Path, opts ...caopt return nil, err } - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return nil, err } @@ -82,7 +82,7 @@ func (api *DhtAPI) Provide(ctx context.Context, path path.Path, opts ...caopts.D return err } - rp, err := api.core().ResolvePath(ctx, path) + rp, _, err := api.core().ResolvePath(ctx, path) if err != nil { return err } diff --git a/core/coreapi/path.go b/core/coreapi/path.go index 0ed565723fe0..e0782a111883 100644 --- a/core/coreapi/path.go +++ b/core/coreapi/path.go @@ -22,7 +22,7 @@ func (api *CoreAPI) ResolveNode(ctx context.Context, p path.Path) (ipld.Node, er ctx, span := tracing.Span(ctx, "CoreAPI", "ResolveNode", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - rp, err := api.ResolvePath(ctx, p) + rp, _, err := api.ResolvePath(ctx, p) if err != nil { return nil, err } @@ -36,19 +36,19 @@ func (api *CoreAPI) ResolveNode(ctx context.Context, p path.Path) (ipld.Node, er // ResolvePath resolves the path `p` using Unixfs resolver, returns the // resolved path. -func (api *CoreAPI) ResolvePath(ctx context.Context, p path.Path) (path.ImmutablePath, error) { +func (api *CoreAPI) ResolvePath(ctx context.Context, p path.Path) (path.ImmutablePath, []string, error) { ctx, span := tracing.Span(ctx, "CoreAPI", "ResolvePath", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() p, err := resolve.ResolveIPNS(ctx, api.namesys, p) if err == resolve.ErrNoNamesys { - return nil, coreiface.ErrOffline + return nil, nil, coreiface.ErrOffline } else if err != nil { - return nil, err + return nil, nil, err } if p.Namespace() != path.IPFSNamespace && p.Namespace() != path.IPLDNamespace { - return nil, fmt.Errorf("unsupported path namespace: %s", p.Namespace().String()) + return nil, nil, fmt.Errorf("unsupported path namespace: %s", p.Namespace().String()) } var resolver ipfspathresolver.Resolver @@ -58,18 +58,23 @@ func (api *CoreAPI) ResolvePath(ctx context.Context, p path.Path) (path.Immutabl resolver = api.unixFSPathResolver } - node, rest, err := resolver.ResolveToLastNode(ctx, p) + node, remainder, err := resolver.ResolveToLastNode(ctx, p) if err != nil { - return nil, err + return nil, nil, err } segments := []string{p.Namespace().String(), node.String()} - segments = append(segments, rest...) + segments = append(segments, remainder...) p, err = path.NewPathFromSegments(segments...) if err != nil { - return nil, err + return nil, nil, err + } + + imPath, err := path.NewImmutablePath(p) + if err != nil { + return nil, nil, err } - return path.NewImmutablePath(p) + return imPath, remainder, nil } diff --git a/core/coreapi/pin.go b/core/coreapi/pin.go index 64e311a7a766..d087a8252a44 100644 --- a/core/coreapi/pin.go +++ b/core/coreapi/pin.go @@ -74,7 +74,7 @@ func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ...caopts.Pin ctx, span := tracing.Span(ctx, "CoreAPI.PinAPI", "IsPinned", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - resolved, err := api.core().ResolvePath(ctx, p) + resolved, _, err := api.core().ResolvePath(ctx, p) if err != nil { return "", false, fmt.Errorf("error resolving path: %s", err) } @@ -99,7 +99,7 @@ func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts.PinRmOpti ctx, span := tracing.Span(ctx, "CoreAPI.PinAPI", "Rm", trace.WithAttributes(attribute.String("path", p.String()))) defer span.End() - rp, err := api.core().ResolvePath(ctx, p) + rp, _, err := api.core().ResolvePath(ctx, p) if err != nil { return err } @@ -136,12 +136,12 @@ func (api *PinAPI) Update(ctx context.Context, from path.Path, to path.Path, opt span.SetAttributes(attribute.Bool("unpin", settings.Unpin)) - fp, err := api.core().ResolvePath(ctx, from) + fp, _, err := api.core().ResolvePath(ctx, from) if err != nil { return err } - tp, err := api.core().ResolvePath(ctx, to) + tp, _, err := api.core().ResolvePath(ctx, to) if err != nil { return err } diff --git a/docs/examples/kubo-as-a-library/go.mod b/docs/examples/kubo-as-a-library/go.mod index d6e5e700e6e7..c67a2bb1d718 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.20 replace github.com/ipfs/kubo => ./../../.. require ( - github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581 + github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 github.com/ipfs/kubo v0.0.0-00010101000000-000000000000 github.com/libp2p/go-libp2p v0.30.0 github.com/multiformats/go-multiaddr v0.11.0 diff --git a/docs/examples/kubo-as-a-library/go.sum b/docs/examples/kubo-as-a-library/go.sum index ab4e7ef20d0d..974b455284b8 100644 --- a/docs/examples/kubo-as-a-library/go.sum +++ b/docs/examples/kubo-as-a-library/go.sum @@ -300,8 +300,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 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.12.1-0.20230906083417-32140848b581 h1:kJbzfNofJ8r36W8QFVp9lw+A7bUjF5D8XN+lxIff7sc= -github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 h1:XFUhiibJrvMinJRE+gja1OIGdP1kIWvAyHpA0t3DzFg= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= 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-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= diff --git a/go.mod b/go.mod index 437ed9c8e910..1327a4785d07 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/fsnotify/fsnotify v1.6.0 github.com/google/uuid v1.3.0 github.com/hashicorp/go-multierror v1.1.1 - github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581 + github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 github.com/ipfs/go-block-format v0.1.2 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 96fb5a5e9ec6..27df133455c4 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 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.12.1-0.20230906083417-32140848b581 h1:kJbzfNofJ8r36W8QFVp9lw+A7bUjF5D8XN+lxIff7sc= -github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 h1:XFUhiibJrvMinJRE+gja1OIGdP1kIWvAyHpA0t3DzFg= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= 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 c8ac59e848b1..ca5f8423c026 100644 --- a/test/dependencies/go.mod +++ b/test/dependencies/go.mod @@ -7,7 +7,7 @@ replace github.com/ipfs/kubo => ../../ require ( github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd github.com/golangci/golangci-lint v1.54.1 - github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581 + github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-cidutil v0.1.0 github.com/ipfs/go-datastore v0.6.0 diff --git a/test/dependencies/go.sum b/test/dependencies/go.sum index 1d92464fa37a..d8c44eadb5a8 100644 --- a/test/dependencies/go.sum +++ b/test/dependencies/go.sum @@ -396,8 +396,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.12.1-0.20230906083417-32140848b581 h1:kJbzfNofJ8r36W8QFVp9lw+A7bUjF5D8XN+lxIff7sc= -github.com/ipfs/boxo v0.12.1-0.20230906083417-32140848b581/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4 h1:XFUhiibJrvMinJRE+gja1OIGdP1kIWvAyHpA0t3DzFg= +github.com/ipfs/boxo v0.12.1-0.20230907083618-c4cf7d4b34d4/go.mod h1:btrtHy0lmO1ODMECbbEY1pxNtrLilvKSYLoGQt1yYCk= 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-block-format v0.1.2 h1:GAjkfhVx1f4YTODS6Esrj1wt2HhrtwTnhEr+DyPUaJo=