diff --git a/CHANGELOG.md b/CHANGELOG.md index fb652a7bab..8b966c07b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The following emojis are used to highlight certain changes: - `bitswap` & `bitswap/client` now have a `WithContentSearch` option, this pickup the content routing job from `bitswap/network`. It used to be a commun pattern for consumers which do not need external content routing to pass a [`routinghelpers.Null`](https://pkg.go.dev/github.com/libp2p/go-libp2p-routing-helpers#Null), now this can be ommited completely which is more efficient. +- `blockservice` now have a `WithProvider` option, this allows to recreate the behavior of advertising added blocks the bitswap server used to do. ### Changed diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 37c4b35da1..fb4b493b01 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -13,6 +13,7 @@ import ( "github.com/ipfs/boxo/blockstore" "github.com/ipfs/boxo/exchange" + "github.com/ipfs/boxo/provider" "github.com/ipfs/boxo/verifcid" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" @@ -75,6 +76,7 @@ type blockService struct { allowlist verifcid.Allowlist blockstore blockstore.Blockstore exchange exchange.Interface + provider provider.Provider // If checkFirst is true then first check that a block doesn't // already exist to avoid republishing the block on the exchange. checkFirst bool @@ -97,6 +99,13 @@ func WithAllowlist(allowlist verifcid.Allowlist) Option { } } +// WithProvider allows to advertise anything that is added through the blockservice. +func WithProvider(prov provider.Provider) Option { + return func(bs *blockService) { + bs.provider = prov + } +} + // New creates a BlockService with given datastore instance. func New(bs blockstore.Blockstore, exchange exchange.Interface, opts ...Option) BlockService { if exchange == nil { @@ -196,6 +205,11 @@ func (s *blockService) AddBlock(ctx context.Context, o blocks.Block) error { logger.Errorf("NotifyNewBlocks: %s", err.Error()) } } + if s.provider != nil { + if err := s.provider.Provide(o.Cid()); err != nil { + logger.Errorf("Provide: %s", err.Error()) + } + } return nil } @@ -242,6 +256,14 @@ func (s *blockService) AddBlocks(ctx context.Context, bs []blocks.Block) error { logger.Errorf("NotifyNewBlocks: %s", err.Error()) } } + if s.provider != nil { + for _, o := range toput { + if err := s.provider.Provide(o.Cid()); err != nil { + logger.Errorf("Provide: %s", err.Error()) + } + } + } + return nil } diff --git a/blockservice/blockservice_test.go b/blockservice/blockservice_test.go index e360580407..b863dfd7e7 100644 --- a/blockservice/blockservice_test.go +++ b/blockservice/blockservice_test.go @@ -288,3 +288,31 @@ func TestAllowlist(t *testing.T) { check(blockservice.GetBlock) check(NewSession(ctx, blockservice).GetBlock) } + +type mockProvider []cid.Cid + +func (p *mockProvider) Provide(c cid.Cid) error { + *p = append(*p, c) + return nil +} + +func TestProviding(t *testing.T) { + t.Parallel() + a := assert.New(t) + + bgen := butil.NewBlockGenerator() + blocks := bgen.Blocks(3) + + prov := mockProvider{} + blockservice := New(blockstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())), nil, WithProvider(&prov)) + var added []cid.Cid + + a.NoError(blockservice.AddBlock(context.Background(), blocks[0])) + added = append(added, blocks[0].Cid()) + + a.NoError(blockservice.AddBlocks(context.Background(), blocks[1:])) + added = append(added, blocks[1].Cid()) + added = append(added, blocks[2].Cid()) + + a.ElementsMatch(added, []cid.Cid(prov)) +} diff --git a/examples/go.mod b/examples/go.mod index 1b8cb1ba04..c6c1fb49c2 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -58,6 +58,7 @@ require ( github.com/huin/goupnp v1.3.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-bitfield v1.1.0 // indirect + github.com/ipfs/go-cidutil v0.1.0 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect github.com/ipfs/go-ipfs-redirects-file v0.1.1 // indirect diff --git a/examples/go.sum b/examples/go.sum index 6784e7c88d..5dd3450fc9 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -251,6 +251,8 @@ github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUP github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= +github.com/ipfs/go-cidutil v0.1.0 h1:RW5hO7Vcf16dplUU60Hs0AKDkQAVPVplr7lk97CFL+Q= +github.com/ipfs/go-cidutil v0.1.0/go.mod h1:e7OEVBMIv9JaOxt9zaGEmAoSlXW9jdFZ5lP/0PwcfpA= github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=