From bde6114428b3107d304fb54f6e7afb3bba4acc94 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Sun, 9 Jan 2022 08:33:12 -0800 Subject: [PATCH] Replace `AlgebraicConfig` with `GenericConfig` (#425) It works fine if we bound recursion methods with `C::Hasher: AlgebraicHasher`. This bound feels natural to me - it's like saying "the recursion methods assume the inner hasher has a circuit implementation". --- plonky2/src/fri/recursive_verifier.rs | 14 +++++++++----- plonky2/src/plonk/config.rs | 23 ++--------------------- plonky2/src/plonk/recursive_verifier.rs | 25 ++++++++++++++----------- 3 files changed, 25 insertions(+), 37 deletions(-) diff --git a/plonky2/src/fri/recursive_verifier.rs b/plonky2/src/fri/recursive_verifier.rs index ba6ebcba..526456b6 100644 --- a/plonky2/src/fri/recursive_verifier.rs +++ b/plonky2/src/fri/recursive_verifier.rs @@ -16,7 +16,7 @@ use crate::iop::challenger::RecursiveChallenger; use crate::iop::ext_target::{flatten_target, ExtensionTarget}; use crate::iop::target::{BoolTarget, Target}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::config::{AlgebraicConfig, AlgebraicHasher, GenericConfig}; +use crate::plonk::config::{AlgebraicHasher, GenericConfig}; use crate::plonk::proof::OpeningSetTarget; use crate::util::reducing::ReducingFactorTarget; use crate::with_context; @@ -119,7 +119,7 @@ impl, const D: usize> CircuitBuilder { ); } - pub fn verify_fri_proof>( + pub fn verify_fri_proof>( &mut self, instance: &FriInstanceInfoTarget, // Openings of the PLONK polynomials. @@ -128,7 +128,9 @@ impl, const D: usize> CircuitBuilder { proof: &FriProofTarget, challenger: &mut RecursiveChallenger, params: &FriParams, - ) { + ) where + C::Hasher: AlgebraicHasher, + { if let Some(max_arity_bits) = params.max_arity_bits() { self.check_recursion_config::(max_arity_bits); } @@ -282,7 +284,7 @@ impl, const D: usize> CircuitBuilder { sum } - fn fri_verifier_query_round>( + fn fri_verifier_query_round>( &mut self, instance: &FriInstanceInfoTarget, alpha: ExtensionTarget, @@ -294,7 +296,9 @@ impl, const D: usize> CircuitBuilder { betas: &[ExtensionTarget], round_proof: &FriQueryRoundTarget, params: &FriParams, - ) { + ) where + C::Hasher: AlgebraicHasher, + { let n_log = log2_strict(n); // Note that this `low_bits` decomposition permits non-canonical binary encodings. Here we diff --git a/plonky2/src/plonk/config.rs b/plonky2/src/plonk/config.rs index 34f92f58..461a9573 100644 --- a/plonky2/src/plonk/config.rs +++ b/plonky2/src/plonk/config.rs @@ -66,29 +66,10 @@ pub trait GenericConfig: type InnerHasher: AlgebraicHasher; } -/// Configuration trait for "algebraic" configurations, i.e., those using an algebraic hash function -/// in Merkle trees. -/// Same as `GenericConfig` trait but with `InnerHasher: AlgebraicHasher`. -pub trait AlgebraicConfig: - Debug + Clone + Sync + Sized + Send + Eq + PartialEq -{ - type F: RichField + Extendable; - type FE: FieldExtension; - type Hasher: AlgebraicHasher; - type InnerHasher: AlgebraicHasher; -} - -impl, const D: usize> GenericConfig for A { - type F = >::F; - type FE = >::FE; - type Hasher = >::Hasher; - type InnerHasher = >::InnerHasher; -} - /// Configuration using Poseidon over the Goldilocks field. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct PoseidonGoldilocksConfig; -impl AlgebraicConfig<2> for PoseidonGoldilocksConfig { +impl GenericConfig<2> for PoseidonGoldilocksConfig { type F = GoldilocksField; type FE = QuadraticExtension; type Hasher = PoseidonHash; @@ -98,7 +79,7 @@ impl AlgebraicConfig<2> for PoseidonGoldilocksConfig { /// Configuration using GMiMC over the Goldilocks field. #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub struct GMiMCGoldilocksConfig; -impl AlgebraicConfig<2> for GMiMCGoldilocksConfig { +impl GenericConfig<2> for GMiMCGoldilocksConfig { type F = GoldilocksField; type FE = QuadraticExtension; type Hasher = GMiMCHash; diff --git a/plonky2/src/plonk/recursive_verifier.rs b/plonky2/src/plonk/recursive_verifier.rs index 4e8583d3..38024eea 100644 --- a/plonky2/src/plonk/recursive_verifier.rs +++ b/plonky2/src/plonk/recursive_verifier.rs @@ -4,7 +4,7 @@ use crate::hash::hash_types::{HashOutTarget, RichField}; use crate::iop::challenger::RecursiveChallenger; use crate::plonk::circuit_builder::CircuitBuilder; use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData, VerifierCircuitTarget}; -use crate::plonk::config::AlgebraicConfig; +use crate::plonk::config::{AlgebraicHasher, GenericConfig}; use crate::plonk::proof::ProofWithPublicInputsTarget; use crate::plonk::vanishing_poly::eval_vanishing_poly_recursively; use crate::plonk::vars::EvaluationTargets; @@ -13,13 +13,15 @@ use crate::with_context; impl, const D: usize> CircuitBuilder { /// Recursively verifies an inner proof. - pub fn add_recursive_verifier>( + pub fn add_recursive_verifier>( &mut self, proof_with_pis: ProofWithPublicInputsTarget, inner_config: &CircuitConfig, inner_verifier_data: &VerifierCircuitTarget, inner_common_data: &CommonCircuitData, - ) { + ) where + C::Hasher: AlgebraicHasher, + { let ProofWithPublicInputsTarget { proof, public_inputs, @@ -253,15 +255,13 @@ mod tests { } // Set the targets in a `ProofTarget` to their corresponding values in a `Proof`. - fn set_proof_target< - F: RichField + Extendable, - C: AlgebraicConfig, - const D: usize, - >( + fn set_proof_target, C: GenericConfig, const D: usize>( proof: &ProofWithPublicInputs, pt: &ProofWithPublicInputsTarget, pw: &mut PartialWitness, - ) { + ) where + C::Hasher: AlgebraicHasher, + { let ProofWithPublicInputs { proof, public_inputs, @@ -561,7 +561,7 @@ mod tests { fn recursive_proof< F: RichField + Extendable, C: GenericConfig, - InnerC: AlgebraicConfig, + InnerC: GenericConfig, const D: usize, >( inner_proof: ProofWithPublicInputs, @@ -576,7 +576,10 @@ mod tests { ProofWithPublicInputs, VerifierOnlyCircuitData, CommonCircuitData, - )> { + )> + where + InnerC::Hasher: AlgebraicHasher, + { let mut builder = CircuitBuilder::::new(config.clone()); let mut pw = PartialWitness::new(); let pt = proof_to_proof_target(&inner_proof, &mut builder);