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