Skip to main content

SsaPartBuilder

Struct SsaPartBuilder 

Source
pub struct SsaPartBuilder<S: PixSpec> {
    commitment: SsaPartCommitment<S>,
    min_shares: usize,
    shares: Vec<DefaultShare<IdentifierPrimeField<PixScalar<S>>, IdentifierPrimeField<PixScalar<S>>>>,
    reconstructed: Option<PixScalar<S>>,
    failed: bool,
}
Expand description

Collects shares of a single polynomial and reconstructs its constant term.

§Where verification happens

Nothing is checked per share beyond what interpolation itself requires (a non-zero, distinct x-coordinate and a decodable y). The one cryptographic check is against SsaPartCommitment, run once, on the reconstructed constant term. See that type for why this is sufficient here and what it costs — briefly: PIX has a single shareholder, so “the recovered a₀ is the committed one” is the whole property, and it is exact.

Fields§

§commitment: SsaPartCommitment<S>§min_shares: usize

Shares needed to interpolate, i.e. the negotiated polynomial threshold.

Comes from SsaCommitmentBuilder::poly_threshold, never from the commitment: there is only one commitment per polynomial now, so its size says nothing about the degree.

§shares: Vec<DefaultShare<IdentifierPrimeField<PixScalar<S>>, IdentifierPrimeField<PixScalar<S>>>>§reconstructed: Option<PixScalar<S>>§failed: bool

Set when the part could not be reconstructed — either the interpolation itself failed, or the value it produced failed to open Self::commitment.

The failure is reported exactly once; every later share for this polynomial is absorbed silently. There is nothing to be gained from re-running the interpolation — the share set cannot be repaired without knowing which share is bad, and the cycle is already lost because SsaBuilder needs every polynomial. Both failure paths must therefore set this and release the share buffer, or the “exactly once” only holds for one of them.

Implementations§

Source§

impl<S: PixSpec> SsaPartBuilder<S>

Source

pub fn new(commitment: SsaPartCommitment<S>, min_shares: usize) -> Self

Source

pub(crate) fn spi(&self) -> SsaPolynomialId<S::Pseudonym>

SsaPolynomialId of the polynomial this builder reconstructs.

Remains valid after the collected shares have been released.

Source

pub(crate) fn min_shares(&self) -> usize

Shares needed to interpolate this polynomial — the negotiated threshold.

Source

fn release_verification_state(&mut self)

Frees the collected shares, which are only needed until the part is reconstructed.

After that point they cannot be read again — the early returns in add_share short-circuit every later call before it touches them.

At production dimensions this buffer is threshold × size_of::<CompletedShare>() held for every one of the polys polynomials until the cycle is retired. Since the Entry emits shares polynomial-major, releasing here means only the polynomials still in flight hold any.

Assigns a fresh empty Vec rather than clear(), so the backing allocation is actually returned instead of being retained at capacity.

Source

pub fn add_share( &mut self, msg: PixScalar<S>, share: PartialSsaShare<S>, ) -> Result<AddShareOutcome<S>, S::Pseudonym>

Auto Trait Implementations§

§

impl<S> Freeze for SsaPartBuilder<S>
where <<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: Freeze, <<S as PixSpec>::Curve as CurveArithmetic>::Scalar: Freeze, <S as PixSpec>::Pseudonym: Freeze,

§

impl<S> RefUnwindSafe for SsaPartBuilder<S>
where <<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: RefUnwindSafe, <<S as PixSpec>::Curve as CurveArithmetic>::Scalar: RefUnwindSafe, <S as PixSpec>::Pseudonym: RefUnwindSafe,

§

impl<S> Send for SsaPartBuilder<S>

§

impl<S> Sync for SsaPartBuilder<S>

§

impl<S> Unpin for SsaPartBuilder<S>
where <<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: Unpin, <<S as PixSpec>::Curve as CurveArithmetic>::Scalar: Unpin, <S as PixSpec>::Pseudonym: Unpin,

§

impl<S> UnsafeUnpin for SsaPartBuilder<S>
where <<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: UnsafeUnpin, <<S as PixSpec>::Curve as CurveArithmetic>::Scalar: UnsafeUnpin, <S as PixSpec>::Pseudonym: UnsafeUnpin,

§

impl<S> UnwindSafe for SsaPartBuilder<S>
where <<S as PixSpec>::Curve as CurveArithmetic>::ProjectivePoint: UnwindSafe, <<S as PixSpec>::Curve as CurveArithmetic>::Scalar: UnwindSafe, <S as PixSpec>::Pseudonym: UnwindSafe,

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<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
§

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

§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

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

§

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
§

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
§

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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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