diff --git a/src/bloom.rs b/src/bloom.rs new file mode 100644 index 000000000..fe619fae6 --- /dev/null +++ b/src/bloom.rs @@ -0,0 +1,7 @@ +use bytes::BytesConvertable; +// use hash::FixedHash; + +pub trait Bloomable { + fn shift_bloom(&mut self, bytes: &T) where T: BytesConvertable; + fn contains_bloom(&self, bytes: &T) -> bool where T: BytesConvertable; +} diff --git a/src/hash.rs b/src/hash.rs index 044153e0c..fc89b4ab9 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -8,27 +8,22 @@ use rand::Rng; use rand::os::OsRng; use bytes::BytesConvertable; +/// types implementing FixedHash must be also BytesConvertable +pub trait FixedHash: BytesConvertable { + fn random() -> Self; + fn randomize(&mut self); + fn mut_bytes(&mut self) -> &mut [u8]; +} + macro_rules! impl_hash { ($from: ident, $size: expr) => { #[derive(Eq)] pub struct $from (pub [u8; $size]); - impl $from { - pub fn new() -> $from { - $from([0; $size]) - } - pub fn random() -> $from { - let mut hash = $from::new(); - hash.randomize(); - hash - } - pub fn randomize(&mut self) { - let mut rng = OsRng::new().unwrap(); - rng.fill_bytes(&mut self.0); - } - pub fn mut_bytes(&mut self) -> &mut [u8; $size] { - &mut self.0 + impl $from { + fn new() -> $from { + $from([0; $size]) } } @@ -38,6 +33,23 @@ macro_rules! impl_hash { } } + impl FixedHash for $from { + fn random() -> $from { + let mut hash = $from::new(); + hash.randomize(); + hash + } + + fn randomize(&mut self) { + let mut rng = OsRng::new().unwrap(); + rng.fill_bytes(&mut self.0); + } + + fn mut_bytes(&mut self) -> &mut [u8] { + &mut self.0 + } + } + impl FromStr for $from { type Err = EthcoreError; diff --git a/src/lib.rs b/src/lib.rs index 7c480c02b..a52e35925 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ pub mod rlp; pub mod vector; pub mod db; pub mod sha3; +pub mod bloom; //pub mod network; diff --git a/src/sha3.rs b/src/sha3.rs index e2866d288..b7eec2a5f 100644 --- a/src/sha3.rs +++ b/src/sha3.rs @@ -1,7 +1,7 @@ use std::mem::uninitialized; use tiny_keccak::keccak_256; use bytes::BytesConvertable; -use hash::H256; +use hash::{FixedHash, H256}; trait Hashable { fn sha3(&self) -> H256;