pub struct GeyserCompressedAccountFilterSet { /* private fields */ }Expand description
A HashMap-like wrapper around CuckooFilter for safe filter construction.
Maintains two parallel collections:
- A
HashSetas the source of truth for exact membership - A
CuckooFilteras the compact wire representation
Writes go to both; reads (contains, len) answer from the HashSet;
serialization reads from the CuckooFilter. This gives users exact local
semantics while producing a compact probabilistic filter for the server.
§When to Use
Use CompressedAccountFilterSet whenever you need to build a cuckoo filter to send in a
subscribe request. It is strictly safer than constructing a CuckooFilter
directly — the filter’s remove method has a footgun (it can silently remove
the wrong item when fingerprints collide), and CompressedAccountFilterSet guards against it.
§Example
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::cuckoo::CompressedAccountFilterSet,
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([42u8; 32])).unwrap();
map.insert(Pubkey::new_from_array([100u8; 32])).unwrap();
assert!(map.contains(Pubkey::new_from_array([42u8; 32])));
assert_eq!(map.len(), 2);
map.remove(Pubkey::new_from_array([42u8; 32]));
assert!(!map.contains(Pubkey::new_from_array([42u8; 32])));Implementations§
Source§impl CompressedAccountFilterSet
impl CompressedAccountFilterSet
Sourcepub fn with_capacity(
max_capacity: usize,
) -> Result<CompressedAccountFilterSet, CuckooBuildError>
pub fn with_capacity( max_capacity: usize, ) -> Result<CompressedAccountFilterSet, CuckooBuildError>
Creates an empty map pre-sized for up to max_capacity items.
Both the internal HashSet and CuckooFilter are allocated up front
to avoid rehashing or reallocation during inserts.
§Errors
Returns CuckooBuildError::CapacityOverflow if max_capacity exceeds
what the system can allocate, or if the underlying cuckoo filter cannot
be built at the requested size.
§Example
use yellowstone_grpc_proto::cuckoo::CompressedAccountFilterSet;
let map = CompressedAccountFilterSet::with_capacity(10_000).unwrap();
assert!(map.is_empty());Sourcepub fn insert(&mut self, key: Address) -> Result<bool, TableFullError>
pub fn insert(&mut self, key: Address) -> Result<bool, TableFullError>
Inserts an item into the map.
Returns Ok(true) if the item was newly inserted, Ok(false) if it was
already present (idempotent).
§Errors
Returns TableFullError if the underlying cuckoo filter is saturated and
cannot accommodate the item. This typically means the map was under-sized
for the workload; rebuild with a larger max_capacity.
On error, the map’s state is unchanged — neither the HashSet nor the
CuckooFilter is mutated.
Sourcepub fn remove(&mut self, key: Address) -> bool
pub fn remove(&mut self, key: Address) -> bool
Removes an item from the map.
Returns true if the item was present and removed, false if it was not
in the map.
§Safety over CuckooFilter::remove
The underlying CuckooFilter has a known footgun: removing an item that
was never inserted can silently remove a different item that shares the
same fingerprint. CompressedAccountFilterSet prevents this by checking its internal
HashSet first and only touching the filter when the item is genuinely
present.
Sourcepub fn contains(&self, key: Address) -> bool
pub fn contains(&self, key: Address) -> bool
Checks if an item is in the map.
Unlike CuckooFilter::contains, this returns an exact answer — the
HashSet guarantees no false positives.
Sourcepub fn capacity(&self) -> usize
pub fn capacity(&self) -> usize
Returns the number of items the map can hold without reallocating.
Typically larger than the max_capacity passed to with_capacity,
the underlying HashSet rounds allocation up to its own sizing
policy. Use this to check remaining headroom before a batch of inserts
or to report occupancy alongside len.
use yellowstone_grpc_proto::cuckoo::CompressedAccountFilterSet;
let map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
assert!(map.capacity() >= 1000);Sourcepub fn iter(&self) -> impl Iterator<Item = &[u8; 32]>
pub fn iter(&self) -> impl Iterator<Item = &[u8; 32]>
Returns an iterator over the items in the map in arbitrary order.
Reads from the internal HashSet, so iteration order matches
HashSet semantics; no ordering guarantee, and two calls on the
same map may yield items in different orders.
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::cuckoo::CompressedAccountFilterSet,
};
let mut map = CompressedAccountFilterSet::with_capacity(100).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
map.insert(Pubkey::new_from_array([2u8; 32])).unwrap();
map.insert(Pubkey::new_from_array([3u8; 32])).unwrap();
let count = map.iter().count();
assert_eq!(count, 3);Sourcepub const fn is_dirty(&self) -> bool
pub const fn is_dirty(&self) -> bool
Returns true if the map has been mutated since the last call to
[take_dirty] (or since construction).
Use this to check whether the filter needs to be re-sent without clearing the flag.
Sourcepub const fn take_dirty(&mut self) -> bool
pub const fn take_dirty(&mut self) -> bool
Returns the dirty flag and clears it.
Call this when transmitting the filter: if it returns true, rebuild
and send; if false, skip the send. Clearing means subsequent
mutations will flip the flag back to true for the next cycle.
§Example
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::cuckoo::CompressedAccountFilterSet,
};
let mut map = CompressedAccountFilterSet::with_capacity(100).unwrap();
assert!(!map.take_dirty()); // fresh map is clean
map.insert(Pubkey::new_from_array([42u8; 32])).unwrap();
assert!(map.take_dirty()); // mutation flipped it
assert!(!map.take_dirty()); // and clearing it takes effectSourcepub fn to_proto(&self) -> CuckooFilter
pub fn to_proto(&self) -> CuckooFilter
Serializes the underlying cuckoo filter to its proto wire format.
The returned proto carries all parameters needed for deserialization on the server side or in cross-language clients: bucket count, entries per bucket, fingerprint bits, and the hash seed.
Sourcepub fn to_account_filter(&self) -> SubscribeRequestFilterAccounts
pub fn to_account_filter(&self) -> SubscribeRequestFilterAccounts
Returns a SubscribeRequestFilterAccounts that carries only this cuckoo
filter in essence no explicit account list, no owner, no predicates.
Use this when you want to add the cuckoo filter to a subscribe request yourself, under a name of your choosing, alongside other account filters or other subscription types:
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
req.accounts.insert("my_cuckoo".to_string(), map.to_account_filter());Sourcepub fn to_block_filter(&self) -> SubscribeRequestFilterBlocks
pub fn to_block_filter(&self) -> SubscribeRequestFilterBlocks
Returns a SubscribeRequestFilterBlocks that carries only this cuckoo
filter, no explicit account include list, no transaction or entry options set.
Use this when you want to subscribe to full blocks but filter the transactions and accounts inside them by the cuckoo set:
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
req.blocks.insert("blocks".to_string(), map.to_block_filter());Sourcepub fn to_transaction_filter(&self) -> SubscribeRequestFilterTransactions
pub fn to_transaction_filter(&self) -> SubscribeRequestFilterTransactions
Returns a SubscribeRequestFilterTransactions that carries only this
cuckoo filter, no explicit account include list, no vote/failed/signature
predicates, no token account expansion.
Use this when you want full transaction details for a large address set
without sending every pubkey on the wire. The same filter works for
transactions and transactions_status:
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
req.transactions.insert("txs".to_string(), map.to_transaction_filter());Sourcepub fn insert_into_subscribe_request(
&mut self,
req: &mut SubscribeRequest,
name: &str,
)
pub fn insert_into_subscribe_request( &mut self, req: &mut SubscribeRequest, name: &str, )
Inserts this cuckoo filter into req.accounts under the given name.
Existing entries in req.accounts are preserved. If an entry already
exists under name, it is replaced. Other fields of req (transactions,
blocks, slots, etc.) are untouched.
Marks the map as clean — subsequent mutations will flip the dirty flag
back to true for the next transmission cycle.
§Example
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
map.insert_into_subscribe_request(&mut req, "tracked_accounts");
// req.accounts["tracked_accounts"] now carries the cuckoo filterSourcepub fn insert_into_block_subscribe_request(
&mut self,
req: &mut SubscribeRequest,
name: &str,
)
pub fn insert_into_block_subscribe_request( &mut self, req: &mut SubscribeRequest, name: &str, )
Inserts this cuckoo filter into req.blocks under the given name.
Existing entries in req.blocks are preserved. If an entry already
exists under name, it is replaced. Other fields of req are untouched.
Marks the map as clean, subsequent mutations will flip the dirty flag
back to true for the next transmission cycle.
§Example
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
map.insert_into_block_subscribe_request(&mut req, "tracked_blocks");Sourcepub fn insert_into_transaction_subscribe_request(
&mut self,
req: &mut SubscribeRequest,
name: &str,
)
pub fn insert_into_transaction_subscribe_request( &mut self, req: &mut SubscribeRequest, name: &str, )
Inserts this cuckoo filter into req.transactions under the given name.
Existing entries in req.transactions are preserved. If an entry already
exists under name, it is replaced. Other fields of req are untouched.
Marks the map as clean, subsequent mutations will flip the dirty flag
back to true for the next transmission cycle.
§Example
use {
solana_pubkey::Pubkey,
yellowstone_grpc_proto::{cuckoo::CompressedAccountFilterSet, geyser::SubscribeRequest},
};
let mut map = CompressedAccountFilterSet::with_capacity(1000).unwrap();
map.insert(Pubkey::new_from_array([1u8; 32])).unwrap();
let mut req = SubscribeRequest::default();
map.insert_into_transaction_subscribe_request(&mut req, "tracked_txs");Auto Trait Implementations§
impl Freeze for CompressedAccountFilterSet
impl RefUnwindSafe for CompressedAccountFilterSet
impl Send for CompressedAccountFilterSet
impl Sync for CompressedAccountFilterSet
impl Unpin for CompressedAccountFilterSet
impl UnsafeUnpin for CompressedAccountFilterSet
impl UnwindSafe for CompressedAccountFilterSet
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.