pub struct Store { /* private fields */ }Expand description
Statement store.
Implementations§
Source§impl Store
impl Store
Create a new shared store instance. There should only be one per process.
path will be used to open a statement database or create a new one if it does not exist.
Sourcepub fn maintain(&self)
pub fn maintain(&self)
Perform periodic store maintenance: permanently delete statements whose purge period has elapsed and refresh store metrics.
Expired and evicted statements are not removed from the database immediately; they are kept
in the EXPIRED column for DEFAULT_PURGE_AFTER_SEC (default 48h) to prevent
re-acceptance while they may still be propagating over gossip. This method removes those
whose purge period has passed.
Runs in a background task on a fixed interval (MAINTENANCE_PERIOD, 29s). Enforcing
per-account and global limits — expiring over-quota statements — is handled separately by
enforce_limits on its own interval (ENFORCE_LIMITS_PERIOD, 31s), kept distinct to avoid
holding the index lock for too long during maintenance.
Sourcepub fn as_statement_store_ext(self: Arc<Self>) -> StatementStoreExt
pub fn as_statement_store_ext(self: Arc<Self>) -> StatementStoreExt
Returns self as StatementStoreExt.
Trait Implementations§
Source§impl StatementStore for Store
impl StatementStore for Store
Source§fn statements(&self) -> Result<Vec<(Hash, Statement)>>
fn statements(&self) -> Result<Vec<(Hash, Statement)>>
Return every statement currently in the store.
Takes a read lock on the query index, iterates all indexed hashes, reads and SCALE-decodes
each statement from the STATEMENTS database column, and skips any entry that fails to
decode.
Source§fn statement(&self, hash: &Hash) -> Result<Option<Statement>>
fn statement(&self, hash: &Hash) -> Result<Option<Statement>>
Read a single statement directly from the STATEMENTS database column by hash and decode
it. Returns Ok(None) if no statement with that hash is stored.
Source§fn broadcasts(&self, match_all_topics: &[Topic]) -> Result<Vec<Vec<u8>>>
fn broadcasts(&self, match_all_topics: &[Topic]) -> Result<Vec<Vec<u8>>>
Return the data of all statements matching all of match_all_topics that have no
decryption key (i.e. public broadcasts).
Filters the query index by topic (intersection; an empty list matches every broadcast),
reads and decodes each match from the STATEMENTS column, and returns the plaintext data,
skipping any inconsistent entries.
Source§fn posted(
&self,
match_all_topics: &[Topic],
dest: [u8; 32],
) -> Result<Vec<Vec<u8>>>
fn posted( &self, match_all_topics: &[Topic], dest: [u8; 32], ) -> Result<Vec<Vec<u8>>>
Return the (encrypted) data of all statements matching all of match_all_topics whose
decryption key equals dest.
Same filtering and DB read as broadcasts, but keyed on dest rather
than the absence of a decryption key.
Source§fn posted_clear(
&self,
match_all_topics: &[Topic],
dest: [u8; 32],
) -> Result<Vec<Vec<u8>>>
fn posted_clear( &self, match_all_topics: &[Topic], dest: [u8; 32], ) -> Result<Vec<Vec<u8>>>
Like posted but returns the decrypted data.
For each match, looks up the ed25519 key identified by dest in the keystore and decrypts
the statement data; statements are skipped when the key is unavailable or decryption fails.
Source§fn broadcasts_stmt(&self, match_all_topics: &[Topic]) -> Result<Vec<Vec<u8>>>
fn broadcasts_stmt(&self, match_all_topics: &[Topic]) -> Result<Vec<Vec<u8>>>
Return the full SCALE-encoded statements matching all of match_all_topics that have no
decryption key (i.e. public broadcasts).
Takes a read lock on the query index and filters by the absence of a decryption key and
topics (intersection / AND — an empty topic list matches every broadcast), then reads,
decodes and re-encodes each match from the STATEMENTS column, skipping inconsistent
entries. Unlike broadcasts, which returns only the data, this returns
the whole statement.
Source§fn posted_stmt(
&self,
match_all_topics: &[Topic],
dest: [u8; 32],
) -> Result<Vec<Vec<u8>>>
fn posted_stmt( &self, match_all_topics: &[Topic], dest: [u8; 32], ) -> Result<Vec<Vec<u8>>>
Return the full SCALE-encoded statements matching all of match_all_topics whose decryption
key equals dest.
Takes a read lock on the query index and filters by decryption key (dest) and topics
(intersection / AND — an empty topic list matches every statement keyed to dest), then
reads, decodes and re-encodes each match from the STATEMENTS column, skipping inconsistent
entries. Unlike posted, which returns only the (still-encrypted) data,
this returns the whole statement.
Source§fn posted_clear_stmt(
&self,
match_all_topics: &[Topic],
dest: [u8; 32],
) -> Result<Vec<Vec<u8>>>
fn posted_clear_stmt( &self, match_all_topics: &[Topic], dest: [u8; 32], ) -> Result<Vec<Vec<u8>>>
Return, for each statement matching all of match_all_topics whose decryption key equals
dest, the SCALE-encoded statement concatenated with its decrypted data.
Filters as posted_stmt, then for each match looks up the ed25519 key
identified by dest in the keystore and decrypts the statement data, appending the
plaintext to the encoded statement. Statements are skipped when the key is unavailable or
decryption fails.
Source§fn submit(&self, statement: Statement, source: StatementSource) -> SubmitResult
fn submit(&self, statement: Statement, source: StatementSource) -> SubmitResult
Submit a statement to the store, validating it and enforcing constraints.
Runs the following pipeline, short-circuiting on the first failure:
- Expiry check — reject if the statement’s expiration timestamp is already in the past
(
SubmitResult::Invalid(InvalidReason::AlreadyExpired)). - Encoding size check — reject if the encoded statement exceeds
MAX_STATEMENT_SIZE(InvalidReason::EncodingTooLarge). - Duplicate check — a statement already in the store is reported
Known: the hash covers the whole content, so a duplicate carries nothing to renew. A recently evicted statement may be resubmitted (renewed) byChainandLocalsources but not byNetwork(SubmitResult::KnownExpired). - Proof & signature — extract the account from the proof and verify the signature
(
InvalidReason::NoProof/InvalidReason::BadProof). - Allowance — read the account’s allowance (
StatementAllowance: max count and size) directly from chain state at the best block (via thestatement_allowance_keystorage key — not a runtime call); reject withSubmitResult::Rejected(NoAllowance)if none is set. The best block is used for responsiveness; a statement accepted here may later be evicted when limits are enforced against the finalized block. - Constraint check & eviction — check the account’s record, enforcing per-account
limits (count, size, one statement per channel, higher priority replaces lower) and
global limits (
DEFAULT_MAX_TOTAL_STATEMENTS,DEFAULT_MAX_TOTAL_SIZE), evicting lower-priority statements of the same account as needed (SubmitResult::Rejectedif it still does not fit). - Persist — commit the statement, its index rows, any evictions and the refreshed counters atomically, then update the caches and the in-memory query index.
Returns SubmitResult::New on success.
Source§fn remove(&self, hash: &Hash) -> Result<()>
fn remove(&self, hash: &Hash) -> Result<()>
Soft-delete a statement by hash: drop it and its index rows from the database, and record
it in the EXPIRED column so it cannot be re-accepted until its purge period elapses (see
maintain). No-op if the statement is unknown.
Source§fn remove_by(&self, who: [u8; 32]) -> Result<()>
fn remove_by(&self, who: [u8; 32]) -> Result<()>
Remove every statement authored by who, applying the same soft-delete as
remove to each, in a single atomic commit.
Source§fn take_recent_statements(&self) -> Result<Vec<(u64, Hash, Statement)>>
fn take_recent_statements(&self) -> Result<Vec<(u64, Hash, Statement)>>
Source§fn admission_watermark(&self) -> Result<u64>
fn admission_watermark(&self) -> Result<u64>
Source§fn admitted_statements(
&self,
cursor: u64,
watermark: u64,
scan_limit: usize,
filter: &mut dyn FnMut(&Hash, &[u8], &Statement) -> FilterDecision,
) -> Result<AdmittedBatch>
fn admitted_statements( &self, cursor: u64, watermark: u64, scan_limit: usize, filter: &mut dyn FnMut(&Hash, &[u8], &Statement) -> FilterDecision, ) -> Result<AdmittedBatch>
cursor (inclusive) towards watermark
(exclusive), collecting statements through a filter callback. Read moreSource§impl StatementStoreSubscriptionApi for Store
impl StatementStoreSubscriptionApi for Store
Source§fn subscribe_statement(
&self,
topic_filter: OptimizedTopicFilter,
) -> Result<(Vec<Vec<u8>>, Sender<StatementEvent>, SubscriptionStatementsStream)>
fn subscribe_statement( &self, topic_filter: OptimizedTopicFilter, ) -> Result<(Vec<Vec<u8>>, Sender<StatementEvent>, SubscriptionStatementsStream)>
Auto Trait Implementations§
impl !Freeze for Store
impl !RefUnwindSafe for Store
impl !UnwindSafe for Store
impl Send for Store
impl Sync for Store
impl Unpin for Store
impl UnsafeUnpin for Store
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> CheckedConversion for T
impl<T> CheckedConversion for T
Source§impl<T, U> DefensiveTruncateInto<U> for Twhere
U: DefensiveTruncateFrom<T>,
impl<T, U> DefensiveTruncateInto<U> for Twhere
U: DefensiveTruncateFrom<T>,
Source§fn defensive_truncate_into(self) -> U
fn defensive_truncate_into(self) -> U
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<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
impl<T> JsonSchemaMaybe for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
Source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
Source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T. Read moreSource§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
type Error = <U as TryFromKey<T>>::Error
fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>
Source§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
Source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.Source§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
Source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T.