use serde::{Deserialize, Serialize}; use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::fri::commitment::{OpeningProof, OpeningProofTarget, PolynomialBatchCommitment}; use crate::hash::hash_types::{HashOut, HashOutTarget}; use crate::iop::target::Target; use crate::plonk::circuit_data::CommonCircuitData; #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct Proof, const D: usize> { /// Merkle root of LDEs of wire values. pub wires_root: HashOut, /// Merkle root of LDEs of Z, in the context of Plonk's permutation argument. pub plonk_zs_partial_products_root: HashOut, /// Merkle root of LDEs of the quotient polynomial components. pub quotient_polys_root: HashOut, /// Purported values of each polynomial at the challenge point. pub openings: OpeningSet, /// A FRI argument for each FRI query. pub opening_proof: OpeningProof, } #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct ProofWithPublicInputs, const D: usize> { pub proof: Proof, pub public_inputs: Vec, } pub struct ProofTarget { pub wires_root: HashOutTarget, pub plonk_zs_partial_products_root: HashOutTarget, pub quotient_polys_root: HashOutTarget, pub openings: OpeningSetTarget, pub opening_proof: OpeningProofTarget, } pub struct ProofWithPublicInputsTarget { pub proof: ProofTarget, pub public_inputs: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] /// The purported values of each polynomial at a single point. pub struct OpeningSet, const D: usize> { pub constants: Vec, pub plonk_sigmas: Vec, pub wires: Vec, pub plonk_zs: Vec, pub plonk_zs_right: Vec, pub partial_products: Vec, pub quotient_polys: Vec, } impl, const D: usize> OpeningSet { pub fn new( z: F::Extension, g: F::Extension, constants_sigmas_commitment: &PolynomialBatchCommitment, wires_commitment: &PolynomialBatchCommitment, zs_partial_products_commitment: &PolynomialBatchCommitment, quotient_polys_commitment: &PolynomialBatchCommitment, common_data: &CommonCircuitData, ) -> Self { let eval_commitment = |z: F::Extension, c: &PolynomialBatchCommitment| { c.polynomials .iter() .map(|p| p.to_extension().eval(z)) .collect::>() }; let constants_sigmas_eval = eval_commitment(z, constants_sigmas_commitment); let zs_partial_products_eval = eval_commitment(z, zs_partial_products_commitment); Self { constants: constants_sigmas_eval[common_data.constants_range()].to_vec(), plonk_sigmas: constants_sigmas_eval[common_data.sigmas_range()].to_vec(), wires: eval_commitment(z, wires_commitment), plonk_zs: zs_partial_products_eval[common_data.zs_range()].to_vec(), plonk_zs_right: eval_commitment(g * z, zs_partial_products_commitment) [common_data.zs_range()] .to_vec(), partial_products: zs_partial_products_eval[common_data.partial_products_range()] .to_vec(), quotient_polys: eval_commitment(z, quotient_polys_commitment), } } } /// The purported values of each polynomial at a single point. #[derive(Clone, Debug)] pub struct OpeningSetTarget { pub constants: Vec>, pub plonk_sigmas: Vec>, pub wires: Vec>, pub plonk_zs: Vec>, pub plonk_zs_right: Vec>, pub partial_products: Vec>, pub quotient_polys: Vec>, }