w3f_ring_proof/
ring_prover.rs1use 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}