Add Bloom filter network messages

Co-authored-by: jrawsthorne <jake@jakerawsthorne.co.uk>
This commit is contained in:
Ben Carman 2021-05-21 12:46:01 -05:00 committed by benthecarman
parent 9710728d89
commit 894f0f09b6
No known key found for this signature in database
GPG Key ID: D7CC770B81FD22A8
3 changed files with 97 additions and 2 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
//!
//! BIP37 Connection Bloom filtering network messages
//!
use consensus::encode;
use consensus::{Decodable, Encodable, ReadExt};
use std::io;
/// `filterload` message sets the current bloom filter
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct FilterLoad {
/// The filter itself
pub filter: Vec<u8>,
/// The number of hash functions to use
pub hash_funcs: u32,
/// A random value
pub tweak: u32,
/// Controls how matched items are added to the filter
pub flags: BloomFlags,
}
impl_consensus_encoding!(FilterLoad, filter, hash_funcs, tweak, flags);
/// Bloom filter update flags
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum BloomFlags {
/// Never update the filter with outpoints.
None,
/// Always update the filter with outpoints.
All,
/// Only update the filter with outpoints if it is P2PK or P2MS
PubkeyOnly,
}
impl Encodable for BloomFlags {
fn consensus_encode<W: io::Write>(&self, mut e: W) -> Result<usize, io::Error> {
e.write_all(&[match self {
BloomFlags::None => 0,
BloomFlags::All => 1,
BloomFlags::PubkeyOnly => 2,
}])?;
Ok(1)
}
}
impl Decodable for BloomFlags {
fn consensus_decode<D: io::Read>(mut d: D) -> Result<Self, encode::Error> {
Ok(match d.read_u8()? {
0 => BloomFlags::None,
1 => BloomFlags::All,
2 => BloomFlags::PubkeyOnly,
_ => return Err(encode::Error::ParseFailed("unknown bloom flag")),
})
}
}
/// `filteradd` message updates the current filter with new data
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct FilterAdd {
/// The data element to add to the current filter.
pub data: Vec<u8>,
}
impl_consensus_encoding!(FilterAdd, data);

View File

@ -28,6 +28,7 @@ pub mod constants;
#[cfg(feature = "std")] pub use self::address::Address;
#[cfg(feature = "std")] pub mod message;
#[cfg(feature = "std")] pub mod message_blockdata;
#[cfg(feature = "std")] pub mod message_bloom;
#[cfg(feature = "std")] pub mod message_network;
#[cfg(feature = "std")] pub mod message_filter;
#[cfg(feature = "std")] pub mod stream_reader;