staging_common/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2
3use ark_ff::{FftField, PrimeField};
4use ark_poly::{EvaluationDomain, Evaluations, GeneralEvaluationDomain, Polynomial};
5use ark_poly::univariate::DensePolynomial;
6use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
7use ark_std::{vec, vec::Vec};
8use fflonk::pcs::{Commitment, PCS};
9
10pub mod gadgets;
11pub mod test_helpers;
12pub mod piop;
13pub mod prover;
14pub mod verifier;
15pub mod transcript;
16pub mod domain;
17
18pub trait Column<F: FftField> {
19    fn domain(&self) -> GeneralEvaluationDomain<F>;
20    fn domain_4x(&self) -> GeneralEvaluationDomain<F>;
21    fn as_poly(&self) -> &DensePolynomial<F>;
22    fn size(&self) -> usize {
23        self.domain().size()
24    }
25    fn evaluate(&self, z: &F) -> F {
26        self.as_poly().evaluate(z)
27    }
28}
29
30#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
31pub struct FieldColumn<F: FftField> {
32    // actual (constrained) len of the input in evaluation form
33    len: usize,
34    poly: DensePolynomial<F>,
35    evals: Evaluations<F>,
36    evals_4x: Evaluations<F>,
37}
38
39impl<F: FftField> FieldColumn<F> {
40    pub fn shifted_4x(&self) -> Evaluations<F> {
41        let mut evals_4x = self.evals_4x.evals.clone();
42        evals_4x.rotate_left(4);
43        Evaluations::from_vec_and_domain(evals_4x, self.domain_4x())
44    }
45
46    pub fn vals(&self) -> &[F] {
47        &self.evals.evals[..self.len]
48    }
49}
50
51impl<F: FftField> Column<F> for FieldColumn<F> {
52    fn domain(&self) -> GeneralEvaluationDomain<F> {
53        self.evals.domain()
54    }
55
56    fn domain_4x(&self) -> GeneralEvaluationDomain<F> {
57        self.evals_4x.domain()
58    }
59
60    fn as_poly(&self) -> &DensePolynomial<F> {
61        &self.poly
62    }
63}
64
65pub fn const_evals<F: FftField>(c: F, domain: GeneralEvaluationDomain<F>) -> Evaluations<F> {
66    Evaluations::from_vec_and_domain(vec![c; domain.size()], domain)
67}
68
69
70pub trait ColumnsEvaluated<F: PrimeField>: CanonicalSerialize + CanonicalDeserialize {
71    fn to_vec(self) -> Vec<F>;
72}
73
74pub trait ColumnsCommited<F: PrimeField, C: Commitment<F>>: CanonicalSerialize + CanonicalDeserialize {
75    fn to_vec(self) -> Vec<C>;
76}
77
78#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
79pub struct Proof<F, CS, Commitments, Evaluations>
80    where
81        F: PrimeField,
82        CS: PCS<F>,
83        Commitments: ColumnsCommited<F, CS::C>,
84        Evaluations: ColumnsEvaluated<F>, {
85    pub column_commitments: Commitments,
86    pub columns_at_zeta: Evaluations,
87    pub quotient_commitment: CS::C,
88    pub lin_at_zeta_omega: F,
89    pub agg_at_zeta_proof: CS::Proof,
90    pub lin_at_zeta_omega_proof: CS::Proof,
91}