jf_plonk/circuit/plonk_verifier/
structs.rsuse ark_ff::PrimeField;
use ark_std::vec::Vec;
use jf_relation::{
gadgets::{
ecc::PointVariable,
ultraplonk::mod_arith::{FpElem, FpElemVar},
},
CircuitError, PlonkCircuit, Variable,
};
#[derive(Debug, Default)]
pub(crate) struct ChallengesVar {
pub(crate) alpha: Variable,
pub(crate) beta: Variable,
pub(crate) gamma: Variable,
pub(crate) zeta: Variable,
pub(crate) v: Variable,
pub(crate) u: Variable,
}
#[derive(Debug, Default)]
pub(crate) struct ChallengesFpElemVar<F: PrimeField> {
pub(crate) alphas: [FpElemVar<F>; 3],
pub(crate) beta: FpElemVar<F>,
pub(crate) gamma: FpElemVar<F>,
pub(crate) zeta: FpElemVar<F>,
pub(crate) v: FpElemVar<F>,
pub(crate) u: FpElemVar<F>,
}
pub(crate) fn challenge_var_to_fp_elem_var<F: PrimeField>(
circuit: &mut PlonkCircuit<F>,
challenge_var: &ChallengesVar,
non_native_field_info: &NonNativeFieldInfo<F>,
) -> Result<ChallengesFpElemVar<F>, CircuitError> {
let alpha_fp_elem_var = FpElemVar::new_unchecked(
circuit,
challenge_var.alpha,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?;
let alpha_2_fp_elem_var = circuit.mod_mul(
&alpha_fp_elem_var,
&alpha_fp_elem_var,
&non_native_field_info.modulus_fp_elem,
)?;
let alpha_3_fp_elem_var = circuit.mod_mul(
&alpha_2_fp_elem_var,
&alpha_fp_elem_var,
&non_native_field_info.modulus_fp_elem,
)?;
Ok(ChallengesFpElemVar {
alphas: [alpha_fp_elem_var, alpha_2_fp_elem_var, alpha_3_fp_elem_var],
beta: FpElemVar::new_unchecked(
circuit,
challenge_var.beta,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?,
gamma: FpElemVar::new_unchecked(
circuit,
challenge_var.gamma,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?,
zeta: FpElemVar::new_unchecked(
circuit,
challenge_var.zeta,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?,
u: FpElemVar::new_unchecked(
circuit,
challenge_var.u,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?,
v: FpElemVar::new_unchecked(
circuit,
challenge_var.v,
non_native_field_info.m,
non_native_field_info.two_power_m,
)?,
})
}
#[derive(Debug)]
pub(crate) struct ScalarsAndBasesVar<F: PrimeField> {
pub(crate) scalars: Vec<FpElemVar<F>>,
pub(crate) bases: Vec<PointVariable>,
}
impl<F: PrimeField> ScalarsAndBasesVar<F> {
pub(crate) fn new() -> Self {
Self {
scalars: Vec::new(),
bases: Vec::new(),
}
}
}
#[derive(Debug)]
pub(crate) struct PcsInfoVar<F: PrimeField> {
pub(crate) u: FpElemVar<F>,
pub(crate) eval_point: FpElemVar<F>,
pub(crate) next_eval_point: FpElemVar<F>,
pub(crate) eval: FpElemVar<F>,
pub(crate) comm_scalars_and_bases: ScalarsAndBasesVar<F>,
pub(crate) opening_proof: PointVariable,
pub(crate) shifted_opening_proof: PointVariable,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct BatchProofVar<F: PrimeField> {
pub(crate) wires_poly_comms_vec: Vec<Vec<PointVariable>>,
pub(crate) prod_perm_poly_comms_vec: Vec<PointVariable>,
pub(crate) poly_evals_vec: Vec<ProofEvaluationsVar<F>>,
pub(crate) split_quot_poly_comms: Vec<PointVariable>,
pub(crate) opening_proof: PointVariable,
pub(crate) shifted_opening_proof: PointVariable,
}
impl<F: PrimeField> BatchProofVar<F> {
pub(crate) fn len(&self) -> usize {
self.prod_perm_poly_comms_vec.len()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct ProofEvaluationsVar<F: PrimeField> {
pub(crate) wires_evals: Vec<FpElemVar<F>>,
pub(crate) wire_sigma_evals: Vec<FpElemVar<F>>,
pub(crate) perm_next_eval: FpElemVar<F>,
}
#[derive(Debug, Copy, Clone, PartialEq)]
pub(crate) struct NonNativeFieldInfo<F: PrimeField> {
pub(crate) m: usize,
pub(crate) two_power_m: Option<F>,
pub(crate) modulus_in_f: F,
pub(crate) modulus_fp_elem: FpElem<F>,
}