w3f_plonk_common/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2
3use ark_ff::{FftField, PrimeField};
4use ark_poly::univariate::DensePolynomial;
5use ark_poly::{EvaluationDomain, Evaluations, GeneralEvaluationDomain, Polynomial};
6use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
7use ark_std::{vec, vec::Vec};
8use w3f_pcs::pcs::{Commitment, PCS};
9
10pub mod domain;
11pub mod gadgets;
12pub mod piop;
13pub mod prover;
14pub mod test_helpers;
15pub mod transcript;
16pub mod verifier;
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
69pub trait ColumnsEvaluated<F: PrimeField>: CanonicalSerialize + CanonicalDeserialize {
70    fn to_vec(self) -> Vec<F>;
71}
72
73pub trait ColumnsCommited<F: PrimeField, C: Commitment<F>>:
74    CanonicalSerialize + CanonicalDeserialize
75{
76    fn to_vec(self) -> Vec<C>;
77}
78
79#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
80pub struct Proof<F, CS, Commitments, Evaluations>
81where
82    F: PrimeField,
83    CS: PCS<F>,
84    Commitments: ColumnsCommited<F, CS::C>,
85    Evaluations: ColumnsEvaluated<F>,
86{
87    pub column_commitments: Commitments,
88    pub columns_at_zeta: Evaluations,
89    pub quotient_commitment: CS::C,
90    pub lin_at_zeta_omega: F,
91    pub agg_at_zeta_proof: CS::Proof,
92    pub lin_at_zeta_omega_proof: CS::Proof,
93}