Light client logs should include 'from_block' when querying logs (#9331)

* Fix PubSub for logs when using light client :
prior to this fix the pubsub process did send a
query for each new block header (and for each subs : there is something
to optimize here) by setting from and to of the filter at this block
number; but there was a bug in the code that fetch logs : it was non
inclusive for its start bound, meaning that with start bound = end bound
we never query any block (and attached logs).

* Option iter instead of once.
Use of bloom existing function to check if a bloom contains another.

* Makes from block header checking explicit
This commit is contained in:
cheme 2018-08-14 09:58:29 +02:00 committed by Marek Kotewicz
parent ff716e7799
commit fcb6cc1e76

View File

@ -321,9 +321,15 @@ impl LightFetch {
BlockId::Number(x) => Some(x), BlockId::Number(x) => Some(x),
}; };
match (block_number(filter.to_block), block_number(filter.from_block)) { let (from_block_number, from_block_header) = match self.client.block_header(filter.from_block) {
(Some(to), Some(from)) if to < from => return Either::A(future::ok(Vec::new())), Some(from) => (from.number(), from),
(Some(_), Some(_)) => {}, None => return Either::A(future::err(errors::unknown_block())),
};
match block_number(filter.to_block) {
Some(to) if to < from_block_number || from_block_number > best_number
=> return Either::A(future::ok(Vec::new())),
Some(_) => (),
_ => return Either::A(future::err(errors::unknown_block())), _ => return Either::A(future::err(errors::unknown_block())),
} }
@ -332,11 +338,11 @@ impl LightFetch {
// match them with their numbers for easy sorting later. // match them with their numbers for easy sorting later.
let bit_combos = filter.bloom_possibilities(); let bit_combos = filter.bloom_possibilities();
let receipts_futures: Vec<_> = self.client.ancestry_iter(filter.to_block) let receipts_futures: Vec<_> = self.client.ancestry_iter(filter.to_block)
.take_while(|ref hdr| BlockId::Number(hdr.number()) != filter.from_block) .take_while(|ref hdr| hdr.number() != from_block_number)
.take_while(|ref hdr| BlockId::Hash(hdr.hash()) != filter.from_block) .chain(Some(from_block_header))
.filter(|ref hdr| { .filter(|ref hdr| {
let hdr_bloom = hdr.log_bloom(); let hdr_bloom = hdr.log_bloom();
bit_combos.iter().find(|&bloom| hdr_bloom & *bloom == *bloom).is_some() bit_combos.iter().any(|bloom| hdr_bloom.contains_bloom(bloom))
}) })
.map(|hdr| (hdr.number(), request::BlockReceipts(hdr.into()))) .map(|hdr| (hdr.number(), request::BlockReceipts(hdr.into())))
.map(|(num, req)| self.on_demand.request(ctx, req).expect(NO_INVALID_BACK_REFS).map(move |x| (num, x))) .map(|(num, req)| self.on_demand.request(ctx, req).expect(NO_INVALID_BACK_REFS).map(move |x| (num, x)))