pub struct SsaRecoveryProgress<P> {
pub ssa_id: SsaId<P>,
pub useful_shares: u64,
pub shares_seen: u64,
pub target_useful_shares: u64,
pub recovered_polynomials: u16,
}Expand description
Absolute recovery progress for a single SSA cycle.
Carries running totals rather than per-batch deltas, so a consumer can detect a stall, a
completion, or a protocol violation without having received every snapshot. That matters because
acknowledgement batches are processed concurrently: snapshots can arrive out of order, and one
may be dropped under load. A consumer should keep the maximum it has seen and treat a lower or
repeated useful_shares as benign noise.
P is the pseudonym type.
Fields§
§ssa_id: SsaId<P>The SSA this snapshot describes.
Shares that advanced reconstruction — verified, distinct, and below their polynomial’s threshold when they arrived. Excludes duplicates and the surplus a conforming Entry sends.
The payment counter: what the Exit can eventually be paid for, and the right input to a
consumer’s accounting. It is the wrong input to a liveness check — see
shares_seen.
Shares accepted for this cycle whether or not they advanced it. Always at least
useful_shares.
The liveness counter: evidence that the Entry is still serving this cycle. The two differ
by more than a rounding error, and conflating them has a specific failure mode. A conforming
Entry emits threshold + surplus shares per polynomial across a window advancing in lockstep,
so every window ends with surplus × window consecutive shares that advance nothing —
4096 packets at the deployed dimensions. A consumer that treats “no useful share” as “the
Entry has gone quiet” will act on that run, and if the action is to withhold service it
removes the only thing that could have produced the next useful share.
So: bound service and idleness on this, and decide payment on useful_shares.
Useful shares that constitute full recovery: polynomials × threshold.
A consumer that negotiated the dimensions can compare this against its own expectation; a mismatch is a protocol violation rather than drift.
recovered_polynomials: u16Polynomial parts that have reconstructed and opened their commitment.
Trait Implementations§
Source§impl<P: Clone> Clone for SsaRecoveryProgress<P>
impl<P: Clone> Clone for SsaRecoveryProgress<P>
Source§fn clone(&self) -> SsaRecoveryProgress<P>
fn clone(&self) -> SsaRecoveryProgress<P>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<P: Copy> Copy for SsaRecoveryProgress<P>
Source§impl<P: Debug> Debug for SsaRecoveryProgress<P>
impl<P: Debug> Debug for SsaRecoveryProgress<P>
impl<P: Eq> Eq for SsaRecoveryProgress<P>
Source§impl<P: Hash> Hash for SsaRecoveryProgress<P>
impl<P: Hash> Hash for SsaRecoveryProgress<P>
Source§impl<P: PartialEq> PartialEq for SsaRecoveryProgress<P>
impl<P: PartialEq> PartialEq for SsaRecoveryProgress<P>
impl<P: PartialEq> StructuralPartialEq for SsaRecoveryProgress<P>
Auto Trait Implementations§
impl<P> Freeze for SsaRecoveryProgress<P>where
P: Freeze,
impl<P> RefUnwindSafe for SsaRecoveryProgress<P>where
P: RefUnwindSafe,
impl<P> Send for SsaRecoveryProgress<P>where
P: Send,
impl<P> Sync for SsaRecoveryProgress<P>where
P: Sync,
impl<P> Unpin for SsaRecoveryProgress<P>where
P: Unpin,
impl<P> UnsafeUnpin for SsaRecoveryProgress<P>where
P: UnsafeUnpin,
impl<P> UnwindSafe for SsaRecoveryProgress<P>where
P: UnwindSafe,
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more