pub struct Proof<F> {Show 15 fields
pub commitments: (ZipPlusCommitment, ZipPlusCommitment, ZipPlusCommitment),
pub zip: Vec<u8>,
pub ideal_check: Proof<F>,
pub cpr_proof: Proof<F>,
pub combined_sumcheck: MultiDegreeSumcheckProof<F>,
pub multipoint_eval: Proof<F>,
pub witness_lifted_evals: Vec<Vec<DynamicPolynomial<F>>>,
pub lookup_proof: Option<BatchedLookupProof<F>>,
pub booleanity_proof: Option<BooleanityProof<F>>,
pub affine_booleanity_proof: Option<BooleanityProof<F>>,
pub ideal_checks_fq: Vec<Proof<F>>,
pub cpr_proofs_fq: Vec<Proof<F>>,
pub combined_sumchecks_fq: Vec<MultiDegreeSumcheckProof<F>>,
pub multipoint_evals_fq: Vec<Proof<F>>,
pub witness_lifted_evals_pp: Option<Vec<DynamicPolynomial<F>>>,
}Expand description
Full proof produced by the Zinc+ PIOP for UCS.
§Lifted-eval families
Witness lifted evals are sent per family: for each of the $n + 2$
families (Q[X] / $q_0$, the declared $q_1, \dots, q_n$, and the
PCS-only $q’’$), the prover sends a vector of DynamicPolynomial<F>
carrying the per-family coefficient lift of each witness column. The
verifier reads each family’s lifts under that family’s field cfg, no
per-coefficient cfg.project projection is needed.
Fields§
§commitments: (ZipPlusCommitment, ZipPlusCommitment, ZipPlusCommitment)Zip+ commitments to the witness columns.
zip: Vec<u8>Serialized PCS proof data (Zip+ proving transcripts).
ideal_check: Proof<F>Randomized ideal check proof (Q[X] family).
cpr_proof: Proof<F>Combined polynomial resolver proof (up_evals + down_evals).
combined_sumcheck: MultiDegreeSumcheckProof<F>Multi-degree sumcheck proof (CPR group + lookup groups).
multipoint_eval: Proof<F>Multi-point evaluation sumcheck proof (combines up_evals and
down_evals at r* into a single evaluation point r_0).
witness_lifted_evals: Vec<Vec<DynamicPolynomial<F>>>Witness-only polynomial MLE evaluations at $r_0$, per constraint family.
Indexing follows the standard family convention used throughout the protocol:
witness_lifted_evals[0]— Q[X] family under $q_0$, $\bar u_j^{(0)}(X) = \sum_b \mathrm{eq}(b, r_0^{(0)}) \cdot u_j(b) \in F_{q_0}[X]$.witness_lifted_evals[i]for $i \in 1..=n$ — the $i$-th declared prime family fromzinc_uair::UairSignature::primes, lifted into $F_{q_i}[X]$ at $r_0$ projected mod $q_i$.
Length is n + 1 where n = primes().len(). Each inner Vec
orders columns as [wit_bin..., wit_arb..., wit_int...].
The verifier recomputes per-family public lifted-evals from public
data, interleaves them with these, evaluates at
projecting_elements[family_idx] for the per-family MP-eval
consistency check.
lookup_proof: Option<BatchedLookupProof<F>>Lookup argument proof. None when the UAIR has no lookup specs.
booleanity_proof: Option<BooleanityProof<F>>Binary-polynomial booleanity argument proof. None when the UAIR
has no witness binary-poly columns (the argument is omitted from
the multi-degree sumcheck in that case).
affine_booleanity_proof: Option<BooleanityProof<F>>Affine-virtual booleanity argument proof. None when the UAIR has no
affine virtual specs.
ideal_checks_fq: Vec<Proof<F>>Per-prime $F_{q_i}[X]$ ideal-check proofs, one per declared
prime in zinc_uair::UairSignature::primes, in the same order.
Empty for UAIRs with $Q[X]$-only constraints.
cpr_proofs_fq: Vec<Proof<F>>Per-prime CPR proofs, one per declared prime, produced by the lockstep sumcheck in step 5. Empty for UAIRs with $Q[X]$ only constraints.
combined_sumchecks_fq: Vec<MultiDegreeSumcheckProof<F>>Per-prime multi-degree sumcheck proofs, one per declared prime, produced by the lockstep sumcheck driver in step 5. Empty for UAIRs with $Q[X]$ only constraints.
multipoint_evals_fq: Vec<Proof<F>>Per-prime multipoint-eval proofs, one per declared prime, produced by the lockstep multipoint-eval in step 6. Empty for UAIRs with $Q[X]$ only constraints.
witness_lifted_evals_pp: Option<Vec<DynamicPolynomial<F>>>Witness-only lifted MLE evaluations under the PCS-only prime $q’‘$, sampled fresh at step 7 start. Length equals the number of witness columns. The verifier uses these directly for the PCS evaluation check at $r^\star = r_0 \bmod q’‘$ — no per-coefficient $\phi_{q’’}$ projection needed.
Kept separate from witness_lifted_evals because $q’‘$ plays a
distinct role (PCS-only; no MP-eval / constraint check happens
under $q’’$).
If no $F_q[X]$ constraints are present, this will be None to indicate
$q’’ := q_0$ and this is identical to witness_lifted_evals.
Trait Implementations§
Source§impl<F> GenTranscribable for Proof<F>where
F: ConstTranscribable,
impl<F> GenTranscribable for Proof<F>where
F: ConstTranscribable,
Source§fn read_transcription_bytes_exact(bytes: &[u8]) -> Self
fn read_transcription_bytes_exact(bytes: &[u8]) -> Self
Source§fn write_transcription_bytes_exact(&self, buf: &mut [u8])
fn write_transcription_bytes_exact(&self, buf: &mut [u8])
Source§impl<F> Transcribable for Proof<F>where
F: ConstTranscribable,
impl<F> Transcribable for Proof<F>where
F: ConstTranscribable,
Source§fn get_num_bytes(&self) -> usize
fn get_num_bytes(&self) -> usize
write_transcription_bytes should be exactly the
length returned by this function.Source§const LENGTH_NUM_BYTES: usize = u32::NUM_BYTES
const LENGTH_NUM_BYTES: usize = u32::NUM_BYTES
Source§fn read_num_bytes(bytes: &[u8]) -> usize
fn read_num_bytes(bytes: &[u8]) -> usize
LENGTH_NUM_BYTES long.
The buffer passed to read_transcription_bytes should be exactly the
length returned by this function.Source§fn read_transcription_bytes_subset(bytes: &[u8]) -> (Self, &[u8])
fn read_transcription_bytes_subset(bytes: &[u8]) -> (Self, &[u8])
impl<F: Eq> Eq for Proof<F>
impl<F> StructuralPartialEq for Proof<F>
Auto Trait Implementations§
impl<F> Freeze for Proof<F>
impl<F> RefUnwindSafe for Proof<F>where
F: RefUnwindSafe,
impl<F> Send for Proof<F>where
F: Send,
impl<F> Sync for Proof<F>where
F: Sync,
impl<F> Unpin for Proof<F>where
F: Unpin,
impl<F> UnsafeUnpin for Proof<F>
impl<F> UnwindSafe for Proof<F>where
F: UnwindSafe,
Blanket Implementations§
§impl<T> AsMaybeUninit for T
impl<T> AsMaybeUninit for T
§type Uninit = MaybeUninit<T>
type Uninit = MaybeUninit<T>
§fn as_ref_uninit(&self) -> &<T as AsMaybeUninit>::Uninit
fn as_ref_uninit(&self) -> &<T as AsMaybeUninit>::Uninit
&self to its maybe-initialized equivalent.§unsafe fn as_mut_uninit(&mut self) -> &mut <T as AsMaybeUninit>::Uninit
unsafe fn as_mut_uninit(&mut self) -> &mut <T as AsMaybeUninit>::Uninit
&mut T to its maybe-initialized equivalent. Read more§unsafe fn raw_as_uninit<'a>(raw: *const T) -> &'a <T as AsMaybeUninit>::Uninit
unsafe fn raw_as_uninit<'a>(raw: *const T) -> &'a <T as AsMaybeUninit>::Uninit
§unsafe fn raw_mut_as_uninit<'a>(
raw: *mut T,
) -> &'a mut <T as AsMaybeUninit>::Uninit
unsafe fn raw_mut_as_uninit<'a>( raw: *mut T, ) -> &'a mut <T as AsMaybeUninit>::Uninit
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> 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
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