mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 08:14:42 +00:00
Migrate the v1 bloom filter subsystem into src/proto/bloom/, matching the discovery/routing/fmp/mmp/stp reference layout and completing the proto/ relocation series for the data/wire subsystems. - wire.rs: the FilterAnnounce (0x20) codec, moved from protocol/filter.rs - core.rs: the pure BloomFilter algorithm (hash/insert/contains/merge/ as_bytes/from_bytes/estimated_count), moved from bloom/filter.rs - state.rs: BloomState (per-peer inbound store, compute_outgoing_filter, the injected-clock send debounce), moved from bloom/state.rs - limits.rs: the v1 sizing constants - mod.rs: module wiring + the BloomError enum - tests/: the unit suite split by target (core/state/wire), no inline tests no_std+alloc hygiene: core::fmt over std::fmt, the tracing dependency dropped from the pure filter, and std collections replaced with BTreeMap/BTreeSet (NodeAddr: Ord) for deterministic iteration. The pure filter combination stays a BloomState method; the two irreducible shell gathers (peer_inbound_filters, build_filter_announce) remain in the async shell. Wire bytes and observable behavior are unchanged; full local CI green (36/36) including the bloom-storm chaos gate.
48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
//! Sans-IO bloom filter subsystem.
|
|
//!
|
|
//! 1KB Bloom filters for reachability in FIPS routing. Each node maintains
|
|
//! filters that summarize which destinations are reachable through each peer,
|
|
//! enabling efficient routing decisions without global network knowledge.
|
|
//!
|
|
//! ## v1 Parameters
|
|
//!
|
|
//! - Size: 1 KB (8,192 bits) - sized for actual ~400-800 entry occupancy
|
|
//! - Hash functions: k=5 - optimal at ~1,200 entries, good for 800-1,600
|
|
//! - Bandwidth: 1 KB/announce (75% reduction from original 4KB design)
|
|
//!
|
|
//! - `core.rs` — the pure `BloomFilter` data structure.
|
|
//! - `state.rs` — `BloomState` (per-peer inbound store + outgoing filter
|
|
//! computation + the send-debounce decision).
|
|
//! - `limits.rs` — the v1 sizing constants.
|
|
//! - `wire.rs` — `FilterAnnounce` + `encode`/`decode` (the std-tethered file).
|
|
//! It imports the shared `ProtocolError` and `LinkMessageType` downward from
|
|
//! `crate::protocol`.
|
|
|
|
mod core;
|
|
mod limits;
|
|
mod state;
|
|
mod wire;
|
|
|
|
#[cfg(test)]
|
|
mod tests;
|
|
|
|
use thiserror::Error;
|
|
|
|
pub use core::BloomFilter;
|
|
pub use limits::{DEFAULT_FILTER_SIZE_BITS, DEFAULT_HASH_COUNT, V1_SIZE_CLASS};
|
|
pub use state::BloomState;
|
|
pub use wire::FilterAnnounce;
|
|
|
|
/// Errors related to Bloom filter operations.
|
|
#[derive(Debug, Error)]
|
|
pub enum BloomError {
|
|
#[error("invalid filter size: expected {expected} bits, got {got}")]
|
|
InvalidSize { expected: usize, got: usize },
|
|
|
|
#[error("filter size must be a multiple of 8, got {0}")]
|
|
SizeNotByteAligned(usize),
|
|
|
|
#[error("hash count must be positive")]
|
|
ZeroHashCount,
|
|
}
|