Skip to main content

GeyserCompressedAccountFilterSet

Struct GeyserCompressedAccountFilterSet 

Source
pub struct GeyserCompressedAccountFilterSet { /* private fields */ }
Expand description

A HashMap-like wrapper around CuckooFilter for safe filter construction.

Maintains two parallel collections:

  • A HashSet as the source of truth for exact membership
  • A CuckooFilter as 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

Source

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());
Source

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.

Source

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.

Source

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.

Source

pub fn len(&self) -> usize

Returns the number of items in the map.

Source

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);
Source

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);
Source

pub fn is_empty(&self) -> bool

Returns true if the map contains no items.

Source

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.

Source

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 effect
Source

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.

Source

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());
Source

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());
Source

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());
Source

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 filter
Source

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");
Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more