pub struct ProverProof<G, OpeningProof, const FULL_ROUNDS: usize>where
G: CommitmentCurve,
OpeningProof: OpenProof<G, FULL_ROUNDS>,{
pub commitments: ProverCommitments<G>,
pub proof: OpeningProof,
pub evals: ProofEvaluations<PointEvaluations<Vec<G::ScalarField>>>,
pub ft_eval1: G::ScalarField,
pub prev_challenges: Vec<RecursionChallenge<G>>,
}Expand description
The proof that the prover creates from a
ProverIndex and a witness.
Fields§
§commitments: ProverCommitments<G>All the polynomial commitments required in the proof
proof: OpeningProofbatched commitment opening proof
evals: ProofEvaluations<PointEvaluations<Vec<G::ScalarField>>>Two evaluations over a number of committed polynomials
ft_eval1: G::ScalarFieldRequired evaluation for Maller’s optimization
prev_challenges: Vec<RecursionChallenge<G>>Accumulators from previously verified proofs in the recursion chain.
Each RecursionChallenge stores the IPA folding challenges and accumulated
commitment from verifying a previous proof. Instead of checking the IPA
immediately (which requires an expensive MSM <s, G> where s has 2^k
elements), we defer this check by storing the accumulator.
During verification, these accumulators are processed as follows:
- The commitments are absorbed into the Fiat-Shamir sponge
- The challenges are used to compute evaluations of
b(X)atzetaandzeta * omega(seeRecursionChallenge::evals) - These evaluations are paired with the commitments and included in the batched polynomial commitment check
The actual MSM verification happens in SRS::verify
(see poly-commitment/src/ipa.rs), where b_poly_coefficients computes
the 2^k coefficients and they are batched into a single large MSM with
all other verification checks.
This design enables efficient recursive proof composition as described in Section 3.2 of the Halo paper.
Implementations§
Source§impl<G, OpeningProof, const FULL_ROUNDS: usize> ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: KimchiCurve<FULL_ROUNDS>,
G::BaseField: PrimeField,
OpeningProof: OpenProof<G, FULL_ROUNDS>,
impl<G, OpeningProof, const FULL_ROUNDS: usize> ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: KimchiCurve<FULL_ROUNDS>,
G::BaseField: PrimeField,
OpeningProof: OpenProof<G, FULL_ROUNDS>,
Sourcepub fn create<EFqSponge, EFrSponge, RNG>(
groupmap: &G::Map,
witness: [Vec<G::ScalarField>; 15],
runtime_tables: &[RuntimeTable<G::ScalarField>],
index: &ProverIndex<FULL_ROUNDS, G, OpeningProof::SRS>,
rng: &mut RNG,
) -> Result<Self, ProverError>
pub fn create<EFqSponge, EFrSponge, RNG>( groupmap: &G::Map, witness: [Vec<G::ScalarField>; 15], runtime_tables: &[RuntimeTable<G::ScalarField>], index: &ProverIndex<FULL_ROUNDS, G, OpeningProof::SRS>, rng: &mut RNG, ) -> Result<Self, ProverError>
This function constructs prover’s zk-proof from the witness & the ProverIndex against SRS instance
§Errors
Will give error if create_recursive process fails.
Sourcepub fn create_recursive<EFqSponge, EFrSponge, RNG>(
group_map: &G::Map,
witness: [Vec<G::ScalarField>; 15],
runtime_tables: &[RuntimeTable<G::ScalarField>],
index: &ProverIndex<FULL_ROUNDS, G, OpeningProof::SRS>,
prev_challenges: Vec<RecursionChallenge<G>>,
blinders: Option<[Option<PolyComm<G::ScalarField>>; 15]>,
rng: &mut RNG,
) -> Result<Self, ProverError>
pub fn create_recursive<EFqSponge, EFrSponge, RNG>( group_map: &G::Map, witness: [Vec<G::ScalarField>; 15], runtime_tables: &[RuntimeTable<G::ScalarField>], index: &ProverIndex<FULL_ROUNDS, G, OpeningProof::SRS>, prev_challenges: Vec<RecursionChallenge<G>>, blinders: Option<[Option<PolyComm<G::ScalarField>>; 15]>, rng: &mut RNG, ) -> Result<Self, ProverError>
Source§impl<const FULL_ROUNDS: usize, G, OpeningProof> ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: KimchiCurve<FULL_ROUNDS>,
OpeningProof: OpenProof<G, FULL_ROUNDS>,
G::BaseField: PrimeField,
impl<const FULL_ROUNDS: usize, G, OpeningProof> ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: KimchiCurve<FULL_ROUNDS>,
OpeningProof: OpenProof<G, FULL_ROUNDS>,
G::BaseField: PrimeField,
Sourcepub fn oracles<EFqSponge, EFrSponge, Srs>(
&self,
index: &VerifierIndex<FULL_ROUNDS, G, Srs>,
public_comm: &PolyComm<G>,
public_input: Option<&[G::ScalarField]>,
) -> Result<OraclesResult<FULL_ROUNDS, G, EFqSponge>>
pub fn oracles<EFqSponge, EFrSponge, Srs>( &self, index: &VerifierIndex<FULL_ROUNDS, G, Srs>, public_comm: &PolyComm<G>, public_input: Option<&[G::ScalarField]>, ) -> Result<OraclesResult<FULL_ROUNDS, G, EFqSponge>>
Trait Implementations§
Source§impl<G, OpeningProof, const FULL_ROUNDS: usize> Clone for ProverProof<G, OpeningProof, FULL_ROUNDS>
impl<G, OpeningProof, const FULL_ROUNDS: usize> Clone for ProverProof<G, OpeningProof, FULL_ROUNDS>
Source§fn clone(&self) -> ProverProof<G, OpeningProof, FULL_ROUNDS>
fn clone(&self) -> ProverProof<G, OpeningProof, FULL_ROUNDS>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<G, OpeningProof, const FULL_ROUNDS: usize> Debug for ProverProof<G, OpeningProof, FULL_ROUNDS>
impl<G, OpeningProof, const FULL_ROUNDS: usize> Debug for ProverProof<G, OpeningProof, FULL_ROUNDS>
Source§impl<'de, G, OpeningProof, const FULL_ROUNDS: usize> Deserialize<'de> for ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: CommitmentCurve + CanonicalDeserialize + CanonicalSerialize,
OpeningProof: OpenProof<G, FULL_ROUNDS> + Deserialize<'de>,
impl<'de, G, OpeningProof, const FULL_ROUNDS: usize> Deserialize<'de> for ProverProof<G, OpeningProof, FULL_ROUNDS>where
G: CommitmentCurve + CanonicalDeserialize + CanonicalSerialize,
OpeningProof: OpenProof<G, FULL_ROUNDS> + Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<G, OpeningProof, const FULL_ROUNDS: usize> PartialEq for ProverProof<G, OpeningProof, FULL_ROUNDS>
impl<G, OpeningProof, const FULL_ROUNDS: usize> PartialEq for ProverProof<G, OpeningProof, FULL_ROUNDS>
Source§fn eq(&self, other: &ProverProof<G, OpeningProof, FULL_ROUNDS>) -> bool
fn eq(&self, other: &ProverProof<G, OpeningProof, FULL_ROUNDS>) -> bool
self and other values to be equal, and is used by ==.