jf_plonk/circuit/plonk_verifier/
structs.rs1use ark_ff::PrimeField;
8use ark_std::vec::Vec;
9use jf_relation::{
10 gadgets::{
11 ecc::PointVariable,
12 ultraplonk::mod_arith::{FpElem, FpElemVar},
13 },
14 CircuitError, PlonkCircuit, Variable,
15};
16
17#[derive(Debug, Default)]
19pub(crate) struct ChallengesVar {
20 pub(crate) alpha: Variable,
21 pub(crate) beta: Variable,
22 pub(crate) gamma: Variable,
23 pub(crate) zeta: Variable,
24 pub(crate) v: Variable,
25 pub(crate) u: Variable,
26}
27
28#[derive(Debug, Default)]
30pub(crate) struct ChallengesFpElemVar<F: PrimeField> {
31 pub(crate) alphas: [FpElemVar<F>; 3],
32 pub(crate) beta: FpElemVar<F>,
33 pub(crate) gamma: FpElemVar<F>,
34 pub(crate) zeta: FpElemVar<F>,
35 pub(crate) v: FpElemVar<F>,
36 pub(crate) u: FpElemVar<F>,
37}
38
39pub(crate) fn challenge_var_to_fp_elem_var<F: PrimeField>(
40 circuit: &mut PlonkCircuit<F>,
41 challenge_var: &ChallengesVar,
42 non_native_field_info: &NonNativeFieldInfo<F>,
43) -> Result<ChallengesFpElemVar<F>, CircuitError> {
44 let alpha_fp_elem_var = FpElemVar::new_unchecked(
45 circuit,
46 challenge_var.alpha,
47 non_native_field_info.m,
48 non_native_field_info.two_power_m,
49 )?;
50 let alpha_2_fp_elem_var = circuit.mod_mul(
51 &alpha_fp_elem_var,
52 &alpha_fp_elem_var,
53 &non_native_field_info.modulus_fp_elem,
54 )?;
55 let alpha_3_fp_elem_var = circuit.mod_mul(
56 &alpha_2_fp_elem_var,
57 &alpha_fp_elem_var,
58 &non_native_field_info.modulus_fp_elem,
59 )?;
60
61 Ok(ChallengesFpElemVar {
62 alphas: [alpha_fp_elem_var, alpha_2_fp_elem_var, alpha_3_fp_elem_var],
63 beta: FpElemVar::new_unchecked(
64 circuit,
65 challenge_var.beta,
66 non_native_field_info.m,
67 non_native_field_info.two_power_m,
68 )?,
69 gamma: FpElemVar::new_unchecked(
70 circuit,
71 challenge_var.gamma,
72 non_native_field_info.m,
73 non_native_field_info.two_power_m,
74 )?,
75 zeta: FpElemVar::new_unchecked(
76 circuit,
77 challenge_var.zeta,
78 non_native_field_info.m,
79 non_native_field_info.two_power_m,
80 )?,
81 u: FpElemVar::new_unchecked(
82 circuit,
83 challenge_var.u,
84 non_native_field_info.m,
85 non_native_field_info.two_power_m,
86 )?,
87 v: FpElemVar::new_unchecked(
88 circuit,
89 challenge_var.v,
90 non_native_field_info.m,
91 non_native_field_info.two_power_m,
92 )?,
93 })
94}
95
96#[derive(Debug)]
98pub(crate) struct ScalarsAndBasesVar<F: PrimeField> {
99 pub(crate) scalars: Vec<FpElemVar<F>>,
100 pub(crate) bases: Vec<PointVariable>,
101}
102
103impl<F: PrimeField> ScalarsAndBasesVar<F> {
104 pub(crate) fn new() -> Self {
105 Self {
106 scalars: Vec::new(),
107 bases: Vec::new(),
108 }
109 }
110}
111
112#[derive(Debug)]
124pub(crate) struct PcsInfoVar<F: PrimeField> {
125 pub(crate) u: FpElemVar<F>,
126 pub(crate) eval_point: FpElemVar<F>,
127 pub(crate) next_eval_point: FpElemVar<F>,
128 pub(crate) eval: FpElemVar<F>,
129 pub(crate) comm_scalars_and_bases: ScalarsAndBasesVar<F>,
130 pub(crate) opening_proof: PointVariable,
131 pub(crate) shifted_opening_proof: PointVariable,
132}
133
134#[derive(Debug, Clone, Eq, PartialEq)]
135pub struct BatchProofVar<F: PrimeField> {
138 pub(crate) wires_poly_comms_vec: Vec<Vec<PointVariable>>,
140
141 pub(crate) prod_perm_poly_comms_vec: Vec<PointVariable>,
143
144 pub(crate) poly_evals_vec: Vec<ProofEvaluationsVar<F>>,
146
147 pub(crate) split_quot_poly_comms: Vec<PointVariable>,
152
153 pub(crate) opening_proof: PointVariable,
155
156 pub(crate) shifted_opening_proof: PointVariable,
159}
160
161impl<F: PrimeField> BatchProofVar<F> {
162 pub(crate) fn len(&self) -> usize {
164 self.prod_perm_poly_comms_vec.len()
165 }
166}
167
168#[derive(Debug, Clone, PartialEq, Eq)]
171pub(crate) struct ProofEvaluationsVar<F: PrimeField> {
172 pub(crate) wires_evals: Vec<FpElemVar<F>>,
174
175 pub(crate) wire_sigma_evals: Vec<FpElemVar<F>>,
178
179 pub(crate) perm_next_eval: FpElemVar<F>,
181}
182
183#[derive(Debug, Copy, Clone, PartialEq)]
185pub(crate) struct NonNativeFieldInfo<F: PrimeField> {
186 pub(crate) m: usize,
187 pub(crate) two_power_m: Option<F>,
188 pub(crate) modulus_in_f: F,
189 pub(crate) modulus_fp_elem: FpElem<F>,
190}