use serde::{Deserialize, Serialize}; use crate::field::extension_field::target::ExtensionTarget; use crate::field::extension_field::Extendable; use crate::field::field_types::Field; use crate::gadgets::polynomial::PolynomialCoeffsExtTarget; use crate::hash::hash_types::{HashOut, HashOutTarget}; use crate::hash::merkle_proofs::{MerkleProof, MerkleProofTarget}; use crate::iop::target::Target; use crate::plonk::plonk_common::PolynomialsIndexBlinding; use crate::polynomial::polynomial::PolynomialCoeffs; /// Evaluations and Merkle proof produced by the prover in a FRI query step. #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct FriQueryStep, const D: usize> { pub evals: Vec, pub merkle_proof: MerkleProof, } #[derive(Clone)] pub struct FriQueryStepTarget { pub evals: Vec>, pub merkle_proof: MerkleProofTarget, } /// Evaluations and Merkle proofs of the original set of polynomials, /// before they are combined into a composition polynomial. #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct FriInitialTreeProof { pub evals_proofs: Vec<(Vec, MerkleProof)>, } impl FriInitialTreeProof { pub(crate) fn unsalted_evals( &self, polynomials: PolynomialsIndexBlinding, zero_knowledge: bool, ) -> &[F] { let evals = &self.evals_proofs[polynomials.index].0; &evals[..evals.len() - polynomials.salt_size(zero_knowledge)] } } #[derive(Clone)] pub struct FriInitialTreeProofTarget { pub evals_proofs: Vec<(Vec, MerkleProofTarget)>, } impl FriInitialTreeProofTarget { pub(crate) fn unsalted_evals( &self, polynomials: PolynomialsIndexBlinding, zero_knowledge: bool, ) -> &[Target] { let evals = &self.evals_proofs[polynomials.index].0; &evals[..evals.len() - polynomials.salt_size(zero_knowledge)] } } /// Proof for a FRI query round. #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct FriQueryRound, const D: usize> { pub initial_trees_proof: FriInitialTreeProof, pub steps: Vec>, } #[derive(Clone)] pub struct FriQueryRoundTarget { pub initial_trees_proof: FriInitialTreeProofTarget, pub steps: Vec>, } #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(bound = "")] pub struct FriProof, const D: usize> { /// A Merkle root for each reduced polynomial in the commit phase. pub commit_phase_merkle_roots: Vec>, /// Query rounds proofs pub query_round_proofs: Vec>, /// The final polynomial in coefficient form. pub final_poly: PolynomialCoeffs, /// Witness showing that the prover did PoW. pub pow_witness: F, } pub struct FriProofTarget { pub commit_phase_merkle_roots: Vec, pub query_round_proofs: Vec>, pub final_poly: PolynomialCoeffsExtTarget, pub pow_witness: Target, }