pub struct CoinStateCache { /* private fields */ }Expand description
A light client’s local view of subscribed coin/puzzle-hash state plus the current peak.
Implementations§
Source§impl CoinStateCache
impl CoinStateCache
Sourcepub fn peak(&self) -> Option<(u32, Bytes32)>
pub fn peak(&self) -> Option<(u32, Bytes32)>
The current peak (height, header_hash), if one has been observed.
Sourcepub fn set_peak(&mut self, height: u32, header_hash: Bytes32)
pub fn set_peak(&mut self, height: u32, header_hash: Bytes32)
Records a new peak observed from a bare NewPeakWallet message. ADVANCE-ONLY: a stale,
out-of-order, or hostile lower peak never regresses a higher one.
Sourcepub fn get(&self, coin_id: Bytes32) -> Option<CoinState>
pub fn get(&self, coin_id: Bytes32) -> Option<CoinState>
The cached state of coin_id, if the client holds one.
Sourcepub fn seed(&mut self, states: impl IntoIterator<Item = CoinState>)
pub fn seed(&mut self, states: impl IntoIterator<Item = CoinState>)
Seeds the cache with the coin states returned by an initial subscribe response.
Routes through cache_coin, so a seeded coin created above the current
peak is refused (the invariant is enforced on this path too).
Sourcepub fn track_coins(&mut self, coin_ids: impl IntoIterator<Item = Bytes32>)
pub fn track_coins(&mut self, coin_ids: impl IntoIterator<Item = Bytes32>)
Records that coin_ids are now subscribed.
Sourcepub fn track_puzzle_hashes(
&mut self,
puzzle_hashes: impl IntoIterator<Item = Bytes32>,
)
pub fn track_puzzle_hashes( &mut self, puzzle_hashes: impl IntoIterator<Item = Bytes32>, )
Records that puzzle_hashes are now subscribed.
Sourcepub fn untrack_coins(&mut self, coin_ids: &[Bytes32])
pub fn untrack_coins(&mut self, coin_ids: &[Bytes32])
Drops coin_ids from the subscription set (their cached state is retained until overwritten).
Sourcepub fn is_subscribed_coin(&self, coin_id: Bytes32) -> bool
pub fn is_subscribed_coin(&self, coin_id: Bytes32) -> bool
Whether coin_id is currently subscribed.
Sourcepub fn subscribed_coins(&self) -> Vec<Bytes32> ⓘ
pub fn subscribed_coins(&self) -> Vec<Bytes32> ⓘ
The set of currently-subscribed coin ids (used to re-arm subscriptions after a reconnect).
Sourcepub fn subscribed_puzzle_hashes(&self) -> Vec<Bytes32> ⓘ
pub fn subscribed_puzzle_hashes(&self) -> Vec<Bytes32> ⓘ
The set of currently-subscribed puzzle hashes (used to re-arm after a reconnect).
Sourcepub fn apply_update(
&mut self,
items: &[CoinState],
height: u32,
fork_height: u32,
peak_hash: Bytes32,
)
pub fn apply_update( &mut self, items: &[CoinState], height: u32, fork_height: u32, peak_hash: Bytes32, )
Applies a CoinStateUpdate from an UNTRUSTED peer: rolls the cache back across the reported
fork_height, then inserts the update’s items that belong to the subscribed set (bounded),
and advances the peak.
Only items in the subscribed set are accepted: an item whose coin id is a subscribed coin OR
whose puzzle hash is a subscribed puzzle hash (the latter preserves puzzle-hash-subscription
DISCOVERY — a new coin under a watched puzzle hash is legitimate). An unsolicited item
matching neither is DROPPED, so a hostile peer cannot inject coins that later answer a
cache-first read. Inserts are further bounded by max_cached_coins
so a puzzle-hash subscription cannot be used to exhaust memory.
The peak ADVANCES on a normal update, and is set DOWN ONLY for a GENUINE authoritative reorg —
one where the rollback actually changed subscribed state, fork_height is below the current
peak, and the update is well-formed (height >= fork_height). An empty/garbage update that
rolls back nothing, or one with height < fork_height, cannot lower the peak.
The invariant — no cached coin has created_height > peak_height — is enforced BY
CONSTRUCTION, not per-call-site: every add routes through cache_coin
(which refuses an above-peak coin), and every peak change runs a sweep via
update_peak (which drops any coin now above the peak). So the property
holds on all paths — forward, reorg, and seed — regardless of ordering.
See the module docs for the reorg-rollback rules.
Trait Implementations§
Source§impl Debug for CoinStateCache
impl Debug for CoinStateCache
Source§impl Default for CoinStateCache
impl Default for CoinStateCache
Source§fn default() -> CoinStateCache
fn default() -> CoinStateCache
Auto Trait Implementations§
impl Freeze for CoinStateCache
impl RefUnwindSafe for CoinStateCache
impl Send for CoinStateCache
impl Sync for CoinStateCache
impl Unpin for CoinStateCache
impl UnsafeUnpin for CoinStateCache
impl UnwindSafe for CoinStateCache
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
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> 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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt 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.