mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-03 06:13:07 +00:00
Hardcode verifier data in the circuit
This commit is contained in:
parent
39fc219324
commit
4ff6bbb3de
@ -185,12 +185,12 @@ mod tests {
|
||||
use plonky2::field::types::{Field, PrimeField64};
|
||||
use plonky2::iop::witness::PartialWitness;
|
||||
use plonky2::plonk::circuit_builder::CircuitBuilder;
|
||||
use plonky2::plonk::circuit_data::CircuitConfig;
|
||||
use plonky2::plonk::circuit_data::{CircuitConfig, VerifierCircuitData};
|
||||
use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig};
|
||||
use plonky2::util::timing::TimingTree;
|
||||
use rand::{thread_rng, Rng};
|
||||
|
||||
use crate::all_stark::AllStark;
|
||||
use crate::all_stark::{AllStark, NUM_TABLES};
|
||||
use crate::config::StarkConfig;
|
||||
use crate::cpu::cpu_stark::CpuStark;
|
||||
use crate::cpu::kernel::aggregator::KERNEL;
|
||||
@ -773,23 +773,19 @@ mod tests {
|
||||
&circuit_config,
|
||||
)?;
|
||||
|
||||
let verifier_data = all_verifier_data_recursive_stark_proof(
|
||||
&inner_all_stark,
|
||||
inner_proof.degree_bits(inner_config),
|
||||
inner_config,
|
||||
&circuit_config,
|
||||
);
|
||||
let verifier_data: [VerifierCircuitData<F, C, D>; NUM_TABLES] =
|
||||
all_verifier_data_recursive_stark_proof(
|
||||
&inner_all_stark,
|
||||
inner_proof.degree_bits(inner_config),
|
||||
inner_config,
|
||||
&circuit_config,
|
||||
);
|
||||
let circuit_config = CircuitConfig::standard_recursion_config();
|
||||
let mut builder = CircuitBuilder::<F, D>::new(circuit_config);
|
||||
let mut pw = PartialWitness::new();
|
||||
let recursive_all_proof_target =
|
||||
add_virtual_recursive_all_proof(&mut builder, &verifier_data);
|
||||
set_recursive_all_proof_target(
|
||||
&mut pw,
|
||||
&recursive_all_proof_target,
|
||||
&recursive_all_proof,
|
||||
&verifier_data,
|
||||
);
|
||||
set_recursive_all_proof_target(&mut pw, &recursive_all_proof_target, &recursive_all_proof);
|
||||
RecursiveAllProof::verify_circuit(
|
||||
&mut builder,
|
||||
recursive_all_proof_target,
|
||||
|
||||
@ -5,7 +5,7 @@ use itertools::Itertools;
|
||||
use plonky2::field::extension::Extendable;
|
||||
use plonky2::field::types::Field;
|
||||
use plonky2::fri::witness_util::set_fri_proof_target;
|
||||
use plonky2::hash::hash_types::RichField;
|
||||
use plonky2::hash::hash_types::{HashOut, RichField};
|
||||
use plonky2::hash::hashing::SPONGE_WIDTH;
|
||||
use plonky2::iop::challenger::{Challenger, RecursiveChallenger};
|
||||
use plonky2::iop::ext_target::ExtensionTarget;
|
||||
@ -567,14 +567,16 @@ pub fn add_virtual_all_proof<F: RichField + Extendable<D>, const D: usize>(
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_virtual_recursive_all_proof<
|
||||
F: RichField + Extendable<D>,
|
||||
C: GenericConfig<D, F = F>,
|
||||
const D: usize,
|
||||
>(
|
||||
/// Returns `RecursiveAllProofTargetWithData` where the proofs targets are virtual and the
|
||||
/// verifier data targets are constants.
|
||||
pub fn add_virtual_recursive_all_proof<F: RichField + Extendable<D>, H, C, const D: usize>(
|
||||
builder: &mut CircuitBuilder<F, D>,
|
||||
verifier_data: &[VerifierCircuitData<F, C, D>; NUM_TABLES],
|
||||
) -> RecursiveAllProofTargetWithData<D> {
|
||||
) -> RecursiveAllProofTargetWithData<D>
|
||||
where
|
||||
H: Hasher<F, Hash = HashOut<F>>,
|
||||
C: GenericConfig<D, F = F, Hasher = H>,
|
||||
{
|
||||
let recursive_proofs = std::array::from_fn(|i| {
|
||||
let verifier_data = &verifier_data[i];
|
||||
builder.add_virtual_proof_with_pis(&verifier_data.common)
|
||||
@ -583,7 +585,7 @@ pub fn add_virtual_recursive_all_proof<
|
||||
let verifier_data = &verifier_data[i];
|
||||
VerifierCircuitTarget {
|
||||
constants_sigmas_cap: builder
|
||||
.add_virtual_cap(verifier_data.common.config.fri_config.cap_height),
|
||||
.constant_merkle_cap(&verifier_data.verifier_only.constants_sigmas_cap),
|
||||
}
|
||||
});
|
||||
RecursiveAllProofTargetWithData {
|
||||
@ -690,7 +692,6 @@ pub fn set_recursive_all_proof_target<F, C: GenericConfig<D, F = F>, W, const D:
|
||||
witness: &mut W,
|
||||
recursive_all_proof_target: &RecursiveAllProofTargetWithData<D>,
|
||||
all_proof: &RecursiveAllProof<F, C, D>,
|
||||
verifier_data: &[VerifierCircuitData<F, C, D>; NUM_TABLES],
|
||||
) where
|
||||
F: RichField + Extendable<D>,
|
||||
C::Hasher: AlgebraicHasher<F>,
|
||||
@ -701,10 +702,6 @@ pub fn set_recursive_all_proof_target<F, C: GenericConfig<D, F = F>, W, const D:
|
||||
&recursive_all_proof_target.recursive_proofs[i],
|
||||
&all_proof.recursive_proofs[i],
|
||||
);
|
||||
witness.set_cap_target(
|
||||
&recursive_all_proof_target.verifier_data[i].constants_sigmas_cap,
|
||||
&verifier_data[i].verifier_only.constants_sigmas_cap,
|
||||
);
|
||||
}
|
||||
}
|
||||
pub fn set_all_proof_target<F, C: GenericConfig<D, F = F>, W, const D: usize>(
|
||||
|
||||
@ -23,8 +23,9 @@ use crate::gates::gate::{CurrentSlot, Gate, GateInstance, GateRef};
|
||||
use crate::gates::noop::NoopGate;
|
||||
use crate::gates::public_input::PublicInputGate;
|
||||
use crate::gates::selectors::selector_polynomials;
|
||||
use crate::hash::hash_types::{HashOutTarget, MerkleCapTarget, RichField};
|
||||
use crate::hash::hash_types::{HashOut, HashOutTarget, MerkleCapTarget, RichField};
|
||||
use crate::hash::merkle_proofs::MerkleProofTarget;
|
||||
use crate::hash::merkle_tree::MerkleCap;
|
||||
use crate::iop::ext_target::ExtensionTarget;
|
||||
use crate::iop::generator::{
|
||||
ConstantGenerator, CopyGenerator, RandomValueGenerator, SimpleGenerator, WitnessGenerator,
|
||||
@ -368,6 +369,19 @@ impl<F: RichField + Extendable<D>, const D: usize> CircuitBuilder<F, D> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn constant_hash(&mut self, h: HashOut<F>) -> HashOutTarget {
|
||||
HashOutTarget {
|
||||
elements: h.elements.map(|x| self.constant(x)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn constant_merkle_cap<H: Hasher<F, Hash = HashOut<F>>>(
|
||||
&mut self,
|
||||
cap: &MerkleCap<F, H>,
|
||||
) -> MerkleCapTarget {
|
||||
MerkleCapTarget(cap.0.iter().map(|h| self.constant_hash(*h)).collect())
|
||||
}
|
||||
|
||||
/// If the given target is a constant (i.e. it was created by the `constant(F)` method), returns
|
||||
/// its constant value. Otherwise, returns `None`.
|
||||
pub fn target_as_constant(&self, target: Target) -> Option<F> {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user