From 905c5eb5a0de6091219e6abd4eb8bbc0f90f95b1 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Wed, 12 Apr 2023 09:34:53 -0700 Subject: [PATCH] deterministic build function --- plonky2/examples/fibonacci.rs | 2 +- plonky2/src/plonk/circuit_builder.rs | 26 ++++++++++++++++++++++++-- plonky2/src/plonk/get_challenges.rs | 2 +- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/plonky2/examples/fibonacci.rs b/plonky2/examples/fibonacci.rs index aa20c0ff..6766c2b2 100644 --- a/plonky2/examples/fibonacci.rs +++ b/plonky2/examples/fibonacci.rs @@ -42,7 +42,7 @@ fn main() -> Result<()> { pw.set_target(initial_a, F::ZERO); pw.set_target(initial_b, F::ONE); - let data = builder.build::(); + let data = builder.build_deterministic::(); let common_circuit_data_serialized = serde_json::to_string(&data.common).unwrap(); fs::write("common_circuit_data.json", common_circuit_data_serialized).expect("Unable to write file"); diff --git a/plonky2/src/plonk/circuit_builder.rs b/plonky2/src/plonk/circuit_builder.rs index 29a38047..a0f43602 100644 --- a/plonky2/src/plonk/circuit_builder.rs +++ b/plonky2/src/plonk/circuit_builder.rs @@ -737,8 +737,10 @@ impl, const D: usize> CircuitBuilder { } } + /// Standard build. + /// Builds a "full circuit", with both prover and verifier data. - pub fn build>(mut self) -> CircuitData + fn build_inner>(mut self, deterministic: bool) -> CircuitData where [(); C::HCO::WIDTH]:, [(); C::HCI::WIDTH]:, @@ -762,7 +764,9 @@ impl, const D: usize> CircuitBuilder { { self.connect(hash_part, Target::wire(pi_gate, wire)) } - // self.randomize_unused_pi_wires(pi_gate); + if !deterministic { + self.randomize_unused_pi_wires(pi_gate); + } // Make sure we have enough constant generators. If not, add a `ConstantGate`. while self.constants_to_targets.len() > self.constant_generators.len() { @@ -945,6 +949,24 @@ impl, const D: usize> CircuitBuilder { } } + /// Standard build. + pub fn build>(self) -> CircuitData + where + [(); C::HCO::WIDTH]:, + [(); C::HCI::WIDTH]:, + { + self.build_inner(false) + } + + /// Build without randomizing PI wires + pub fn build_deterministic>(self) -> CircuitData + where + [(); C::HCO::WIDTH]:, + [(); C::HCI::WIDTH]:, + { + self.build_inner(true) + } + /// Builds a "prover circuit", with data needed to generate proofs but not verify them. pub fn build_prover>(self) -> ProverCircuitData where diff --git a/plonky2/src/plonk/get_challenges.rs b/plonky2/src/plonk/get_challenges.rs index 0e90b398..d0682572 100644 --- a/plonky2/src/plonk/get_challenges.rs +++ b/plonky2/src/plonk/get_challenges.rs @@ -94,7 +94,7 @@ impl, C: GenericConfig, const D: usize> } /// Computes all Fiat-Shamir challenges used in the Plonk proof. - pub fn get_challenges( + pub(crate) fn get_challenges( &self, public_inputs_hash: <>::InnerHasher as Hasher>::Hash, circuit_digest: &<>::Hasher as Hasher>::Hash,