Add block filter via BadBits#825
Conversation
Bitswap has a built-in mechanism for deny-lists that we could use.
I think that's a good idea - we expect the size of the list to grow in future so it would be good to avoid unnecessary downloads
I'd suggest we do use an on-disk cache. The size of the list is likely to increase in future. I'd suggest that on startup
That sounds right to me - I think it makes sense for the denylist to be best-effort
Merged ✅ |
3d438d7 to
2431c85
Compare
2431c85 to
b769069
Compare
|
PR updated:
|
dirkmc
left a comment
There was a problem hiding this comment.
I've approved this PR, with a few suggestions for minor improvements. Nice work! 🙌
|
My one concern here is what happens as the badbits list grows large. Is there a way we can put a reasonable bound on the amount of memory reserved for the badbits filter? Would it make sense to use something like leveldb to keep it on disk instead? |
|
@dirkmc yes, we can definitely do follow up experiments if the list grows large. One interesting thing to note: currently, the list is only about 1MB large, way smaller than I would have guessed given how long it's been in operation. |
Co-authored-by: dirkmc <dirkmdev@gmail.com>
* booster bitswap MVP executable (#707) * feat(booster-bitswap): booster bitswap MVP untested * refactor(booster-bitswap): use API for fetching blocks * fix(deps): update deps to compile * feat(booster-bitswap): makefile & fixes add commands to build booster-bitswap, and very a round tripped successful fetch from booster-bitswap * refactor: clean up unused vars etc * fix: booster-bitsawp - check error when creating libp2p key * refactor(node): avoid FreeAndUnsealed method Co-authored-by: Dirk McCormick <dirkmdev@gmail.com> Co-authored-by: Anton Evangelatov <anton.evangelatov@gmail.com> * booster-bitswap devnet and tracing (#796) * return ipld ErrNotFound from remote blockstore interface (#798) * fix: return ipld ErrNotFound from remote blockstore interface * test: add more tests for ipld ErrNotFound * test: comment out part of TestDummydealOnline that is flaky due to a bug in latest lotus (#802) * fix normaliseError nil ptr dereference (#803) * feat: shard selector (#807) * LoadBalancer for bitswap (and later, more of libp2p) (#786) * feat(loadbalancer): add message types * feat(messages): add utility functions * feat(loadbalancer): initial load balancer impl implementation of the load balancer node itself * feat(loadbalancer): add service node implements code for running a service node * feat(loadbalancer): integrate into boost and booster-bitswap * Update loadbalancer/loadbalancer.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/servicenode.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/servicenode.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/messages/messages.ipldsch Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/messages/messages.ipldsch Co-authored-by: Rod Vagg <rod@vagg.org> * refactor(loadbalancer): remove routing protocol remove the routing protocol, instead relying on a set config. also remove forwarding response for inbound requests * fix(loadbalancer): update tests * refactor(loadbalancer): integrate simplified load balancer removed pub keys to minimize network traffic, added api's to configure and update bitswap peer id, added auto config of bitswap peer id in booster-bitswap * docs(gen): regenerate api docs * chore(lint): fix lint errors * fix(loadbalancer): minor bridgestream fix * Update loadbalancer/servicenode.go Co-authored-by: dirkmc <dirkmdev@gmail.com> * refactor(protocolproxy): address PR comments renames, reconfigured architecture, etc * refactor(make init print out peer id): remove apis and transparent peer id setting. have init print Co-authored-by: Rod Vagg <rod@vagg.org> Co-authored-by: dirkmc <dirkmdev@gmail.com> * Add block filter via BadBits (#825) * feat(booster-bitswap): add block filter via BadBits * refactor(booster-bitswap): use bitswap blockfilter for filtering * feat(blockfilter): only update when list is modified * feat(blockFilter): add on disk caching * Update cmd/booster-bitswap/blockfilter/blockfilter.go Co-authored-by: dirkmc <dirkmdev@gmail.com> * fix(blockfilter): minor PR fixups Co-authored-by: dirkmc <dirkmdev@gmail.com> * Libp2p 0.22 upgrade (#837) * chore(deps): upgrade to Lotus RC & libp2p v0.22 * chore(deps): update go to 1.18 * ci(circle): update circle to go 1.18 * style(imports): fix imports * fix(build): update ffi * fix(lint): fix deprecated strings.Title method * fix(mod): mod tidy * Protocol Proxy cleanup (#836) * refactor(booster-bitswap): minor UI fixes for booster-bitswap UI * Update cmd/booster-bitswap/init.go Co-authored-by: dirkmc <dirkmdev@gmail.com> Co-authored-by: dirkmc <dirkmdev@gmail.com> * feat: update to dagstore v0.5.5 (#849) * add booster-bitswap to devnet (#866) * bump lotus-test version * add docker/booster-bitswap target in Makefile Co-authored-by: Hannah Howard <hannah@hannahhoward.net> Co-authored-by: Dirk McCormick <dirkmdev@gmail.com> Co-authored-by: Rod Vagg <rod@vagg.org>
* booster bitswap MVP executable (#707) * feat(booster-bitswap): booster bitswap MVP untested * refactor(booster-bitswap): use API for fetching blocks * fix(deps): update deps to compile * feat(booster-bitswap): makefile & fixes add commands to build booster-bitswap, and very a round tripped successful fetch from booster-bitswap * refactor: clean up unused vars etc * fix: booster-bitsawp - check error when creating libp2p key * refactor(node): avoid FreeAndUnsealed method Co-authored-by: Dirk McCormick <dirkmdev@gmail.com> Co-authored-by: Anton Evangelatov <anton.evangelatov@gmail.com> * booster-bitswap devnet and tracing (#796) * return ipld ErrNotFound from remote blockstore interface (#798) * fix: return ipld ErrNotFound from remote blockstore interface * test: add more tests for ipld ErrNotFound * test: comment out part of TestDummydealOnline that is flaky due to a bug in latest lotus (#802) * fix normaliseError nil ptr dereference (#803) * feat: shard selector (#807) * LoadBalancer for bitswap (and later, more of libp2p) (#786) * feat(loadbalancer): add message types * feat(messages): add utility functions * feat(loadbalancer): initial load balancer impl implementation of the load balancer node itself * feat(loadbalancer): add service node implements code for running a service node * feat(loadbalancer): integrate into boost and booster-bitswap * Update loadbalancer/loadbalancer.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/servicenode.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/servicenode.go Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/messages/messages.ipldsch Co-authored-by: Rod Vagg <rod@vagg.org> * Update loadbalancer/messages/messages.ipldsch Co-authored-by: Rod Vagg <rod@vagg.org> * refactor(loadbalancer): remove routing protocol remove the routing protocol, instead relying on a set config. also remove forwarding response for inbound requests * fix(loadbalancer): update tests * refactor(loadbalancer): integrate simplified load balancer removed pub keys to minimize network traffic, added api's to configure and update bitswap peer id, added auto config of bitswap peer id in booster-bitswap * docs(gen): regenerate api docs * chore(lint): fix lint errors * fix(loadbalancer): minor bridgestream fix * Update loadbalancer/servicenode.go Co-authored-by: dirkmc <dirkmdev@gmail.com> * refactor(protocolproxy): address PR comments renames, reconfigured architecture, etc * refactor(make init print out peer id): remove apis and transparent peer id setting. have init print Co-authored-by: Rod Vagg <rod@vagg.org> Co-authored-by: dirkmc <dirkmdev@gmail.com> * Add block filter via BadBits (#825) * feat(booster-bitswap): add block filter via BadBits * refactor(booster-bitswap): use bitswap blockfilter for filtering * feat(blockfilter): only update when list is modified * feat(blockFilter): add on disk caching * Update cmd/booster-bitswap/blockfilter/blockfilter.go Co-authored-by: dirkmc <dirkmdev@gmail.com> * fix(blockfilter): minor PR fixups Co-authored-by: dirkmc <dirkmdev@gmail.com> * Libp2p 0.22 upgrade (#837) * chore(deps): upgrade to Lotus RC & libp2p v0.22 * chore(deps): update go to 1.18 * ci(circle): update circle to go 1.18 * style(imports): fix imports * fix(build): update ffi * fix(lint): fix deprecated strings.Title method * fix(mod): mod tidy * Protocol Proxy cleanup (#836) * refactor(booster-bitswap): minor UI fixes for booster-bitswap UI * Update cmd/booster-bitswap/init.go Co-authored-by: dirkmc <dirkmdev@gmail.com> Co-authored-by: dirkmc <dirkmdev@gmail.com> * feat: update to dagstore v0.5.5 (#849) * feat: bitswap client * feat: bitswap client - output car file * refactor: bitswap client - remove tracing * feat: debug logs * fix: write blocks to blockstore * fix: duration output * fix: duration output for block received * feat: add pprof to bitswap client * feat: protocol proxy logging * feat: bitswap client - check host supports bitswap protocol * feat: listen for bitswap requests locally as well as through forwarding protocol Co-authored-by: Hannah Howard <hannah@hannahhoward.net> Co-authored-by: Anton Evangelatov <anton.evangelatov@gmail.com> Co-authored-by: Rod Vagg <rod@vagg.org>
Goals
Provide a mechanism for filtering out illegal CID requests in bitswap.
Implementation
For discusion (that's why it's a draft)
Currently, this lives inside of booster bitswap -- should it instead live inside of boost and possibly the block API calls?
I didn't put optimization around passing If-Not-Modified as request header and checking for a 304 Not Modified response -- this may be prudent as the list updates a lot but not every five minutes
There's no on disk cache -- this was done for simplicity but does mean you need to fetch at startup. Also, this is a blocking call currently -- maybe that's not ideal?
What is the right way to handle fetching/parsing errors? Right now it's just log.Errorf
blocked on LoadBalancer for bitswap (and later, more of libp2p) #786 (currently that branch is the base for this one)