1use ark_ec::pairing::Pairing;
2use ark_ec::twisted_edwards::{Affine, TECurveConfig};
3use ark_ec::AffineRepr;
4use ark_ff::PrimeField;
5use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
6use ark_std::marker::PhantomData;
7use ark_std::{vec, vec::Vec};
8use w3f_pcs::pcs::kzg::commitment::KzgCommitment;
9use w3f_pcs::pcs::kzg::params::RawKzgVerifierKey;
10use w3f_pcs::pcs::kzg::KZG;
11use w3f_pcs::pcs::{Commitment, PcsParams, PCS};
12
13pub(crate) use prover::PiopProver;
14pub(crate) use verifier::PiopVerifier;
15use w3f_plonk_common::gadgets::ec::AffineColumn;
16use w3f_plonk_common::{Column, ColumnsCommited, ColumnsEvaluated, FieldColumn};
17
18use crate::ring::Ring;
19use crate::PiopParams;
20
21pub mod params;
22mod prover;
23mod verifier;
24
25#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
26pub struct RingCommitments<F: PrimeField, C: Commitment<F>> {
27 pub(crate) bits: C,
28 pub(crate) inn_prod_acc: C,
29 pub(crate) cond_add_acc: [C; 2],
30 pub(crate) phantom: PhantomData<F>,
31}
32
33impl<F: PrimeField, C: Commitment<F>> ColumnsCommited<F, C> for RingCommitments<F, C> {
34 fn to_vec(self) -> Vec<C> {
35 vec![
36 self.bits,
37 self.inn_prod_acc,
38 self.cond_add_acc[0].clone(),
39 self.cond_add_acc[1].clone(),
40 ]
41 }
42}
43
44#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
45pub struct RingEvaluations<F: PrimeField> {
46 pub(crate) points: [F; 2],
47 pub(crate) ring_selector: F,
48 pub(crate) bits: F,
49 pub(crate) inn_prod_acc: F,
50 pub(crate) cond_add_acc: [F; 2],
51}
52
53impl<F: PrimeField> ColumnsEvaluated<F> for RingEvaluations<F> {
54 fn to_vec(self) -> Vec<F> {
55 vec![
56 self.points[0],
57 self.points[1],
58 self.ring_selector,
59 self.bits,
60 self.inn_prod_acc,
61 self.cond_add_acc[0],
62 self.cond_add_acc[1],
63 ]
64 }
65}
66
67#[derive(Clone, CanonicalSerialize, CanonicalDeserialize)]
69pub struct FixedColumns<F: PrimeField, G: AffineRepr<BaseField = F>> {
70 points: AffineColumn<F, G>,
75 ring_selector: FieldColumn<F>,
79}
80
81#[derive(Clone, CanonicalSerialize, CanonicalDeserialize, PartialEq, Eq, Debug)]
83pub struct FixedColumnsCommitted<F: PrimeField, C: Commitment<F>> {
84 pub points: [C; 2],
85 pub ring_selector: C,
86 pub phantom: PhantomData<F>,
87}
88
89impl<F: PrimeField, C: Commitment<F>> FixedColumnsCommitted<F, C> {
90 fn as_vec(&self) -> Vec<C> {
91 vec![
92 self.points[0].clone(),
93 self.points[1].clone(),
94 self.ring_selector.clone(),
95 ]
96 }
97}
98
99impl<E: Pairing> FixedColumnsCommitted<E::ScalarField, KzgCommitment<E>> {
100 pub fn from_ring<G: TECurveConfig<BaseField = E::ScalarField>>(
101 ring: &Ring<E::ScalarField, E, G>,
102 ) -> Self {
103 let cx = KzgCommitment(ring.cx);
104 let cy = KzgCommitment(ring.cy);
105 Self {
106 points: [cx, cy],
107 ring_selector: KzgCommitment(ring.selector),
108 phantom: Default::default(),
109 }
110 }
111}
112
113impl<F: PrimeField, G: AffineRepr<BaseField = F>> FixedColumns<F, G> {
114 fn commit<CS: PCS<F>>(&self, ck: &CS::CK) -> FixedColumnsCommitted<F, CS::C> {
115 let points = [
116 CS::commit(ck, self.points.xs.as_poly()).unwrap(),
117 CS::commit(ck, self.points.ys.as_poly()).unwrap(),
118 ];
119 let ring_selector = CS::commit(ck, self.ring_selector.as_poly()).unwrap();
120 FixedColumnsCommitted {
121 points,
122 ring_selector,
123 phantom: Default::default(),
124 }
125 }
126}
127
128#[derive(CanonicalSerialize, CanonicalDeserialize)]
129pub struct ProverKey<F: PrimeField, CS: PCS<F>, G: AffineRepr<BaseField = F>> {
130 pub(crate) pcs_ck: CS::CK,
131 pub(crate) fixed_columns: FixedColumns<F, G>,
132 pub(crate) verifier_key: VerifierKey<F, CS>, }
134
135#[derive(Clone, Debug, Eq, PartialEq, CanonicalSerialize, CanonicalDeserialize)]
136pub struct VerifierKey<F: PrimeField, CS: PCS<F>> {
137 pub(crate) pcs_raw_vk: <CS::Params as PcsParams>::RVK,
138 pub(crate) fixed_columns_committed: FixedColumnsCommitted<F, CS::C>,
139 }
141
142impl<E: Pairing> VerifierKey<E::ScalarField, KZG<E>> {
143 pub fn from_ring_and_kzg_vk<G: TECurveConfig<BaseField = E::ScalarField>>(
144 ring: &Ring<E::ScalarField, E, G>,
145 kzg_vk: RawKzgVerifierKey<E>,
146 ) -> Self {
147 Self::from_commitment_and_kzg_vk(FixedColumnsCommitted::from_ring(ring), kzg_vk)
148 }
149
150 pub fn from_commitment_and_kzg_vk(
151 commitment: FixedColumnsCommitted<E::ScalarField, KzgCommitment<E>>,
152 kzg_vk: RawKzgVerifierKey<E>,
153 ) -> Self {
154 Self {
155 pcs_raw_vk: kzg_vk,
156 fixed_columns_committed: commitment,
157 }
158 }
159
160 pub fn commitment(&self) -> FixedColumnsCommitted<E::ScalarField, KzgCommitment<E>> {
161 self.fixed_columns_committed.clone()
162 }
163}
164
165pub fn index<F: PrimeField, CS: PCS<F>, Curve: TECurveConfig<BaseField = F>>(
166 pcs_params: &CS::Params,
167 piop_params: &PiopParams<F, Curve>,
168 keys: &[Affine<Curve>],
169) -> (ProverKey<F, CS, Affine<Curve>>, VerifierKey<F, CS>) {
170 let pcs_ck = pcs_params.ck();
171 let pcs_raw_vk = pcs_params.raw_vk();
172 let fixed_columns = piop_params.fixed_columns(&keys);
173 let fixed_columns_committed = fixed_columns.commit::<CS>(&pcs_ck);
174 let verifier_key = VerifierKey {
175 pcs_raw_vk: pcs_raw_vk.clone(),
176 fixed_columns_committed: fixed_columns_committed.clone(),
177 };
178 let prover_key = ProverKey {
179 pcs_ck,
180 fixed_columns,
181 verifier_key,
182 };
183 let verifier_key = VerifierKey {
184 pcs_raw_vk,
185 fixed_columns_committed,
186 };
187 (prover_key, verifier_key)
188}