docs for chainfilter
This commit is contained in:
parent
b0c38cb6ec
commit
8c0e063f6b
@ -1,4 +1,43 @@
|
|||||||
//! Multilevel blockchain bloom filter.
|
//! Multilevel blockchain bloom filter.
|
||||||
|
//!
|
||||||
|
//! ```
|
||||||
|
//! extern crate ethcore_util as util;
|
||||||
|
//! use std::str::FromStr;
|
||||||
|
//! use util::chainfilter::*;
|
||||||
|
//! use util::sha3::*;
|
||||||
|
//! use util::hash::*;
|
||||||
|
//!
|
||||||
|
//! fn main() {
|
||||||
|
//! let (index_size, bloom_levels) = (16, 3);
|
||||||
|
//! let mut cache = MemoryCache::new();
|
||||||
|
//!
|
||||||
|
//! let address = Address::from_str("ef2d6d194084c2de36e0dabfce45d046b37d1106").unwrap();
|
||||||
|
//!
|
||||||
|
//! // borrow cache for reading inside the scope
|
||||||
|
//! let modified_blooms = {
|
||||||
|
//! let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
|
//! let block_number = 39;
|
||||||
|
//! let mut bloom = H2048::new();
|
||||||
|
//! bloom.shift_bloom(&address.sha3());
|
||||||
|
//! filter.add_bloom(&bloom, block_number)
|
||||||
|
//! };
|
||||||
|
//!
|
||||||
|
//! // number of updated blooms is equal number of levels
|
||||||
|
//! assert_eq!(modified_blooms.len(), bloom_levels as usize);
|
||||||
|
//!
|
||||||
|
//! // lets inserts modified blooms into the cache
|
||||||
|
//! cache.insert_blooms(modified_blooms);
|
||||||
|
//!
|
||||||
|
//! // borrow cache for another reading operations
|
||||||
|
//! {
|
||||||
|
//! let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
|
//! let blocks = filter.blocks_with_address(&address, 10, 40);
|
||||||
|
//! assert_eq!(blocks.len(), 1);
|
||||||
|
//! assert_eq!(blocks[0], 39);
|
||||||
|
//! }
|
||||||
|
//! }
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
use std::collections::{HashMap};
|
use std::collections::{HashMap};
|
||||||
use hash::*;
|
use hash::*;
|
||||||
use sha3::*;
|
use sha3::*;
|
||||||
@ -255,7 +294,7 @@ impl<'a, D> ChainFilter<'a, D> where D: FilterDataSource
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns numbers of blocks that may contain Topic.
|
/// Returns numbers of blocks that may contain Topic.
|
||||||
pub fn blocks_with_topics(&self, topic: &H256, from_block: usize, to_block: usize) -> Vec<usize> {
|
pub fn blocks_with_topic(&self, topic: &H256, from_block: usize, to_block: usize) -> Vec<usize> {
|
||||||
let mut bloom = H2048::new();
|
let mut bloom = H2048::new();
|
||||||
bloom.shift_bloom(&topic.sha3());
|
bloom.shift_bloom(&topic.sha3());
|
||||||
self.blocks_with_bloom(&bloom, from_block, to_block)
|
self.blocks_with_bloom(&bloom, from_block, to_block)
|
||||||
@ -379,27 +418,27 @@ mod tests {
|
|||||||
|
|
||||||
{
|
{
|
||||||
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
let blocks = filter.blocks_with_topics(&topic, 0, 100);
|
let blocks = filter.blocks_with_topic(&topic, 0, 100);
|
||||||
assert_eq!(blocks.len(), 1);
|
assert_eq!(blocks.len(), 1);
|
||||||
assert_eq!(blocks[0], 23);
|
assert_eq!(blocks[0], 23);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
let blocks = filter.blocks_with_topics(&topic, 0, 23);
|
let blocks = filter.blocks_with_topic(&topic, 0, 23);
|
||||||
assert_eq!(blocks.len(), 0);
|
assert_eq!(blocks.len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
let blocks = filter.blocks_with_topics(&topic, 23, 24);
|
let blocks = filter.blocks_with_topic(&topic, 23, 24);
|
||||||
assert_eq!(blocks.len(), 1);
|
assert_eq!(blocks.len(), 1);
|
||||||
assert_eq!(blocks[0], 23);
|
assert_eq!(blocks[0], 23);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
let filter = ChainFilter::new(&cache, index_size, bloom_levels);
|
||||||
let blocks = filter.blocks_with_topics(&topic, 24, 100);
|
let blocks = filter.blocks_with_topic(&topic, 24, 100);
|
||||||
assert_eq!(blocks.len(), 0);
|
assert_eq!(blocks.len(), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user