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 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
85fn 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}