w3f_ring_proof/
ring_prover.rs

1use ark_ec::twisted_edwards::{Affine, TECurveConfig};
2use ark_ff::PrimeField;
3use w3f_pcs::pcs::PCS;
4
5use w3f_plonk_common::prover::PlonkProver;
6use w3f_plonk_common::transcript::PlonkTranscript;
7
8use crate::piop::params::PiopParams;
9use crate::piop::{FixedColumns, PiopProver, ProverKey};
10use crate::{ArkTranscript, RingProof};
11
12pub struct RingProver<F, CS, Curve, T = ArkTranscript>
13where
14    F: PrimeField,
15    CS: PCS<F>,
16    Curve: TECurveConfig<BaseField = F>,
17    T: PlonkTranscript<F, CS>,
18{
19    piop_params: PiopParams<F, Curve>,
20    fixed_columns: FixedColumns<F, Affine<Curve>>,
21    k: usize,
22    plonk_prover: PlonkProver<F, CS, T>,
23}
24
25impl<F, CS, Curve, T> RingProver<F, CS, Curve, T>
26where
27    F: PrimeField,
28    CS: PCS<F>,
29    Curve: TECurveConfig<BaseField = F>,
30    T: PlonkTranscript<F, CS>,
31{
32    pub fn init(
33        prover_key: ProverKey<F, CS, Affine<Curve>>,
34        piop_params: PiopParams<F, Curve>,
35        k: usize,
36        empty_transcript: T,
37    ) -> Self {
38        let ProverKey {
39            pcs_ck,
40            fixed_columns,
41            verifier_key,
42        } = prover_key;
43
44        let plonk_prover = PlonkProver::init(pcs_ck, verifier_key, empty_transcript);
45
46        Self {
47            piop_params,
48            fixed_columns,
49            k,
50            plonk_prover,
51        }
52    }
53
54    pub fn prove(&self, t: Curve::ScalarField) -> RingProof<F, CS> {
55        let piop = PiopProver::build(&self.piop_params, self.fixed_columns.clone(), self.k, t);
56        self.plonk_prover.prove(piop)
57    }
58
59    pub fn piop_params(&self) -> &PiopParams<F, Curve> {
60        &self.piop_params
61    }
62}