Skip to main content

w3f_plonk_common/
lib.rs

1#![cfg_attr(not(feature = "std"), no_std)]
2
3use ark_ec::pairing::Pairing;
4use ark_ec::AffineRepr;
5use ark_ff::{FftField, Field, PrimeField, Zero};
6use ark_poly::univariate::DensePolynomial;
7use ark_poly::{EvaluationDomain, Evaluations, GeneralEvaluationDomain, Polynomial};
8use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
9use ark_std::{vec, vec::Vec};
10use w3f_pcs::pcs::{Commitment, PCS};
11
12pub mod domain;
13pub mod gadgets;
14pub mod kzg_acc;
15pub mod piop;
16pub mod prover;
17pub mod test_helpers;
18pub mod transcript;
19pub mod verifier;
20
21pub trait Column<F: FftField, V> {
22    fn domain(&self) -> GeneralEvaluationDomain<F>;
23    fn domain_4x(&self) -> GeneralEvaluationDomain<F>;
24    fn payload(&self) -> &[V];
25    fn payload_len(&self) -> usize {
26        self.payload().len()
27    }
28}
29
30#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
31pub struct FieldColumn<F: FftField> {
32    pub poly: DensePolynomial<F>,
33    pub evals: Evaluations<F>,
34    pub evals_4x: Evaluations<F>,
35    // We require all the evaluations padded to the domain size
36    // (as we need to add blinding cells aka zk_rows) at the end of the vector.
37    // `payload_len` keeps the original length of the data.
38    payload_len: usize,
39}
40
41impl<F: FftField> FieldColumn<F> {
42    pub fn shifted_4x(&self) -> Evaluations<F> {
43        let mut evals_4x = self.evals_4x.evals.clone();
44        evals_4x.rotate_left(4);
45        Evaluations::from_vec_and_domain(evals_4x, self.domain_4x())
46    }
47
48    pub fn as_poly(&self) -> &DensePolynomial<F> {
49        &self.poly
50    }
51
52    pub fn evaluate(&self, z: &F) -> F {
53        self.as_poly().evaluate(z)
54    }
55}
56
57impl<F: FftField> Column<F, F> for FieldColumn<F> {
58    fn domain(&self) -> GeneralEvaluationDomain<F> {
59        self.evals.domain()
60    }
61
62    fn domain_4x(&self) -> GeneralEvaluationDomain<F> {
63        self.evals_4x.domain()
64    }
65
66    fn payload(&self) -> &[F] {
67        &self.evals.evals[..self.payload_len]
68    }
69}
70
71pub fn const_evals<F: FftField>(c: F, domain: GeneralEvaluationDomain<F>) -> Evaluations<F> {
72    Evaluations::from_vec_and_domain(vec![c; domain.size()], domain)
73}
74
75pub trait ColumnsEvaluated<F: PrimeField>: CanonicalSerialize + CanonicalDeserialize {
76    fn to_vec(self) -> Vec<F>;
77}
78
79pub trait ColumnsCommited<F: PrimeField, C: Commitment<F>>:
80    CanonicalSerialize + CanonicalDeserialize
81{
82    fn to_vec(self) -> Vec<C>;
83}
84
85// suboptimal for BLS12-381
86fn is_in_correct_subgroup_assuming_on_curve<E: Pairing>(p: &E::G1Affine) -> bool {
87    let r = E::ScalarField::characteristic();
88    p.mul_bigint(r).is_zero()
89}
90
91#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
92pub struct Proof<F, CS, Commitments, Evaluations>
93where
94    F: PrimeField,
95    CS: PCS<F>,
96    Commitments: ColumnsCommited<F, CS::C>,
97    Evaluations: ColumnsEvaluated<F>,
98{
99    pub column_commitments: Commitments,
100    pub columns_at_zeta: Evaluations,
101    pub quotient_commitment: CS::C,
102    pub lin_at_zeta_omega: F,
103    pub agg_at_zeta_proof: CS::Proof,
104    pub lin_at_zeta_omega_proof: CS::Proof,
105}