pub struct SsaServerCommitmentMessage<I, G, D> {
pub session_id: I,
pub params: u32,
pub deposit_data: HashMap<SsaIndex, D>,
pub commitments: BTreeMap<SsaIndex, G>,
pub missing: BTreeMap<SsaIndex, Vec<PolynomialRun>>,
}Expand description
Sent by the Server either to deliver the commitment to new Session Stealth Addresses (SSAs), or to ask for the parts of an earlier commitment it never received.
The first kind is typically sent right after the StartEstablished message if PIX capabilities
are indicated in the StartInitiation message and the Server accepts it, and then again every
time the Server needs the next batch of SSAs (with indices strictly greater than in the last
batch) to be committed to.
The second kind exists because the Client’s answer to the first is not one message but hundreds,
and the Server can use none of it until every one of them has landed. It names the gaps in
missing and asks for nothing new; see there.
Exactly one of commitments and missing is populated,
which is what makes the two kinds impossible to confuse — Self::new and Self::recommit
each build one of them, and both encoding and decoding refuse a message that is neither.
Fields§
§session_id: ISession ID.
params: u32Parameters of the PIX protocol the server requires, packed by
PixParams::to_u32.
deposit_data: HashMap<SsaIndex, D>Per-SSA deposit/payment data, carried in CBOR as a single map keyed by the same
SsaIndex as commitments.
Empty on a retransmission request: it asks for no new SSA, and the deposit data of the cycles it names was delivered when they were first requested.
commitments: BTreeMap<SsaIndex, G>Server’s serialized commitments to the SSAs, ordered by the SSA index.
Empty on a retransmission request — see the type-level documentation.
missing: BTreeMap<SsaIndex, Vec<PolynomialRun>>Polynomial-index runs whose commitments the Server never received, per SSA.
Empty on a request for new SSAs. Non-empty makes this a retransmission request: the Server is asking the Client to re-send the commitments it names for cycles it has already committed to, and nothing else. Nothing new is requested, no deposit follows, and the Client must not announce one — the deposit address of a cycle is fixed when it is first committed.
The runs of one SSA are ascending and disjoint, which the decoder enforces: it makes the scope canonical, bounds the indices one request can name at the cycle’s polynomial count, and lets the answer be assembled without deduplicating.
Implementations§
Source§impl<I, G, D> SsaServerCommitmentMessage<I, G, D>
impl<I, G, D> SsaServerCommitmentMessage<I, G, D>
Sourcepub fn new(
session_id: I,
params: PixParams,
commitments: impl IntoIterator<Item = (SsaIndex, G)>,
deposit_data: impl IntoIterator<Item = (SsaIndex, D)>,
) -> Self
pub fn new( session_id: I, params: PixParams, commitments: impl IntoIterator<Item = (SsaIndex, G)>, deposit_data: impl IntoIterator<Item = (SsaIndex, D)>, ) -> Self
Convenience constructor for creating a new SsaServerCommitmentMessage.
Sourcepub fn recommit(
session_id: I,
params: PixParams,
missing: impl IntoIterator<Item = (SsaIndex, Vec<PolynomialRun>)>,
) -> Self
pub fn recommit( session_id: I, params: PixParams, missing: impl IntoIterator<Item = (SsaIndex, Vec<PolynomialRun>)>, ) -> Self
Asks the Client to re-send the commitments of polynomial runs the Server never received.
A constructor of its own rather than a field to fill in, so the two request kinds cannot be
mixed: this one carries no commitments and no deposit data, which is the invariant the codec
enforces. params is echoed so the recipient can check the request against what was
negotiated, exactly as it does for a request for new SSAs.
The caller is responsible for keeping the runs of each SSA ascending and disjoint, and for
naming no more of them than StartProtocol::max_missing_runs allows.
Sourcepub fn missing_run_count(&self) -> usize
pub fn missing_run_count(&self) -> usize
Total number of polynomial runs this request names, across every SSA.
The wire form is a flat table, so this — not the number of SSAs — is what has to fit a packet.
Sourcepub fn dimensions(&self) -> Result<PixParams>
pub fn dimensions(&self) -> Result<PixParams>
The PIX dimensions this request was made under, and the curve suite they are dimensions of.
Fails if the peer packed values outside the protocol ranges, or named a curve suite that does not exist. The name predates the suite and is kept because the callers read it for the dimensions; the suite rides along because both sides must agree on it too.
Trait Implementations§
Source§impl<I: Clone, G: Clone, D: Clone> Clone for SsaServerCommitmentMessage<I, G, D>
impl<I: Clone, G: Clone, D: Clone> Clone for SsaServerCommitmentMessage<I, G, D>
Source§fn clone(&self) -> SsaServerCommitmentMessage<I, G, D>
fn clone(&self) -> SsaServerCommitmentMessage<I, G, D>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<I: Eq, G: Eq, D: Eq> Eq for SsaServerCommitmentMessage<I, G, D>
Source§impl<I: PartialEq, G: PartialEq, D: PartialEq> PartialEq for SsaServerCommitmentMessage<I, G, D>
impl<I: PartialEq, G: PartialEq, D: PartialEq> PartialEq for SsaServerCommitmentMessage<I, G, D>
impl<I: PartialEq, G: PartialEq, D: PartialEq> StructuralPartialEq for SsaServerCommitmentMessage<I, G, D>
Auto Trait Implementations§
impl<I, G, D> Freeze for SsaServerCommitmentMessage<I, G, D>where
I: Freeze,
impl<I, G, D> RefUnwindSafe for SsaServerCommitmentMessage<I, G, D>
impl<I, G, D> Send for SsaServerCommitmentMessage<I, G, D>
impl<I, G, D> Sync for SsaServerCommitmentMessage<I, G, D>
impl<I, G, D> Unpin for SsaServerCommitmentMessage<I, G, D>
impl<I, G, D> UnsafeUnpin for SsaServerCommitmentMessage<I, G, D>where
I: UnsafeUnpin,
impl<I, G, D> UnwindSafe for SsaServerCommitmentMessage<I, G, D>
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