o1vm/pickles/
proof.rs

1use kimchi::{curve::KimchiCurve, proof::PointEvaluations};
2use poly_commitment::{ipa::OpeningProof, PolyComm};
3
4use crate::interpreters::mips::column::{N_MIPS_SEL_COLS, SCRATCH_SIZE, SCRATCH_SIZE_INVERSE};
5
6pub struct WitnessColumns<G, S> {
7    pub scratch: [G; SCRATCH_SIZE],
8    pub scratch_inverse: [G; SCRATCH_SIZE_INVERSE],
9    pub lookup_state: Vec<G>,
10    pub instruction_counter: G,
11    pub error: G,
12    pub selector: S,
13}
14
15pub struct ProofInputs<G: KimchiCurve> {
16    pub evaluations: WitnessColumns<Vec<G::ScalarField>, Vec<G::ScalarField>>,
17}
18
19impl<G: KimchiCurve> ProofInputs<G> {
20    pub fn new(domain_size: usize) -> Self {
21        ProofInputs {
22            evaluations: WitnessColumns {
23                scratch: std::array::from_fn(|_| Vec::with_capacity(domain_size)),
24                scratch_inverse: std::array::from_fn(|_| Vec::with_capacity(domain_size)),
25                lookup_state: vec![],
26                instruction_counter: Vec::with_capacity(domain_size),
27                error: Vec::with_capacity(domain_size),
28                selector: Vec::with_capacity(domain_size),
29            },
30        }
31    }
32}
33
34// FIXME: should we blind the commitment?
35pub struct Proof<G: KimchiCurve> {
36    pub commitments: WitnessColumns<PolyComm<G>, [PolyComm<G>; N_MIPS_SEL_COLS]>,
37    pub zeta_evaluations: WitnessColumns<G::ScalarField, [G::ScalarField; N_MIPS_SEL_COLS]>,
38    pub zeta_omega_evaluations: WitnessColumns<G::ScalarField, [G::ScalarField; N_MIPS_SEL_COLS]>,
39    pub quotient_commitment: PolyComm<G>,
40    pub quotient_evaluations: PointEvaluations<Vec<G::ScalarField>>,
41    /// IPA opening proof
42    pub opening_proof: OpeningProof<G>,
43}