From d684ee2d8de04f047818c6b8064819d2c50cc815 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 07:59:07 -0400 Subject: [PATCH 1/9] Switch Field type of generators to be F: RichField + Extendable --- plonky2/examples/square_root.rs | 2 +- plonky2/src/gadgets/arithmetic.rs | 2 +- plonky2/src/gadgets/arithmetic_extension.rs | 2 +- plonky2/src/gadgets/range_check.rs | 2 +- plonky2/src/gadgets/split_base.rs | 5 ++- plonky2/src/gadgets/split_join.rs | 4 +- plonky2/src/gates/arithmetic_base.rs | 4 +- plonky2/src/gates/arithmetic_extension.rs | 4 +- plonky2/src/gates/base_sum.rs | 6 ++- plonky2/src/gates/constant.rs | 2 +- plonky2/src/gates/coset_interpolation.rs | 4 +- plonky2/src/gates/exponentiation.rs | 4 +- plonky2/src/gates/gate.rs | 2 +- plonky2/src/gates/lookup.rs | 4 +- plonky2/src/gates/lookup_table.rs | 4 +- plonky2/src/gates/multiplication_extension.rs | 4 +- plonky2/src/gates/noop.rs | 2 +- plonky2/src/gates/poseidon.rs | 4 +- plonky2/src/gates/poseidon_mds.rs | 4 +- plonky2/src/gates/public_input.rs | 2 +- plonky2/src/gates/random_access.rs | 4 +- plonky2/src/gates/reducing.rs | 4 +- plonky2/src/gates/reducing_extension.rs | 4 +- plonky2/src/iop/generator.rs | 42 ++++++++++++------- plonky2/src/plonk/circuit_builder.rs | 6 +-- plonky2/src/plonk/circuit_data.rs | 2 +- plonky2/src/recursion/dummy_circuit.rs | 2 +- .../serialization/generator_serialization.rs | 23 +++++----- plonky2/src/util/serialization/mod.rs | 8 ++-- 29 files changed, 89 insertions(+), 73 deletions(-) diff --git a/plonky2/examples/square_root.rs b/plonky2/examples/square_root.rs index 019d2c14..f27c46d1 100644 --- a/plonky2/examples/square_root.rs +++ b/plonky2/examples/square_root.rs @@ -32,7 +32,7 @@ struct SquareRootGenerator, const D: usize> { _phantom: PhantomData, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for SquareRootGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gadgets/arithmetic.rs b/plonky2/src/gadgets/arithmetic.rs index ed9e7c4a..aaf12a40 100644 --- a/plonky2/src/gadgets/arithmetic.rs +++ b/plonky2/src/gadgets/arithmetic.rs @@ -379,7 +379,7 @@ pub struct EqualityGenerator { inv: Target, } -impl SimpleGenerator for EqualityGenerator { +impl, const D: usize> SimpleGenerator for EqualityGenerator { fn id(&self) -> String { "EqualityGenerator".to_string() } diff --git a/plonky2/src/gadgets/arithmetic_extension.rs b/plonky2/src/gadgets/arithmetic_extension.rs index ccb84a40..d201b523 100644 --- a/plonky2/src/gadgets/arithmetic_extension.rs +++ b/plonky2/src/gadgets/arithmetic_extension.rs @@ -501,7 +501,7 @@ pub struct QuotientGeneratorExtension { quotient: ExtensionTarget, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for QuotientGeneratorExtension { fn id(&self) -> String { diff --git a/plonky2/src/gadgets/range_check.rs b/plonky2/src/gadgets/range_check.rs index bdd1942c..4a4617b6 100644 --- a/plonky2/src/gadgets/range_check.rs +++ b/plonky2/src/gadgets/range_check.rs @@ -60,7 +60,7 @@ pub struct LowHighGenerator { high: Target, } -impl SimpleGenerator for LowHighGenerator { +impl, const D: usize> SimpleGenerator for LowHighGenerator { fn id(&self) -> String { "LowHighGenerator".to_string() } diff --git a/plonky2/src/gadgets/split_base.rs b/plonky2/src/gadgets/split_base.rs index c2919315..1b375138 100644 --- a/plonky2/src/gadgets/split_base.rs +++ b/plonky2/src/gadgets/split_base.rs @@ -5,7 +5,6 @@ use core::borrow::Borrow; use itertools::Itertools; use crate::field::extension::Extendable; -use crate::field::types::Field; use crate::gates::base_sum::BaseSumGate; use crate::hash::hash_types::RichField; use crate::iop::generator::{GeneratedValues, SimpleGenerator}; @@ -86,7 +85,9 @@ pub struct BaseSumGenerator { limbs: Vec, } -impl SimpleGenerator for BaseSumGenerator { +impl, const B: usize, const D: usize> SimpleGenerator + for BaseSumGenerator +{ fn id(&self) -> String { "BaseSumGenerator".to_string() } diff --git a/plonky2/src/gadgets/split_join.rs b/plonky2/src/gadgets/split_join.rs index e3eda241..919cba95 100644 --- a/plonky2/src/gadgets/split_join.rs +++ b/plonky2/src/gadgets/split_join.rs @@ -62,7 +62,7 @@ pub struct SplitGenerator { bits: Vec, } -impl SimpleGenerator for SplitGenerator { +impl, const D: usize> SimpleGenerator for SplitGenerator { fn id(&self) -> String { "SplitGenerator".to_string() } @@ -105,7 +105,7 @@ pub struct WireSplitGenerator { num_limbs: usize, } -impl SimpleGenerator for WireSplitGenerator { +impl, const D: usize> SimpleGenerator for WireSplitGenerator { fn id(&self) -> String { "WireSplitGenerator".to_string() } diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index 7ed25328..62d5ebac 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -126,7 +126,7 @@ impl, const D: usize> Gate for ArithmeticGate constraints } - fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { (0..self.num_ops) .map(|i| { WitnessGeneratorRef::new( @@ -188,7 +188,7 @@ pub struct ArithmeticBaseGenerator, const D: usize> i: usize, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for ArithmeticBaseGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index ebe7a650..d1f789ac 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -131,7 +131,7 @@ impl, const D: usize> Gate for ArithmeticExte constraints } - fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { (0..self.num_ops) .map(|i| { WitnessGeneratorRef::new( @@ -172,7 +172,7 @@ pub struct ArithmeticExtensionGenerator, const D: u i: usize, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for ArithmeticExtensionGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index fee50c66..66cff0d5 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -118,7 +118,7 @@ impl, const D: usize, const B: usize> Gate fo constraints } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { let gen = BaseSplitGenerator:: { row, num_limbs: self.num_limbs, @@ -175,7 +175,9 @@ pub struct BaseSplitGenerator { num_limbs: usize, } -impl SimpleGenerator for BaseSplitGenerator { +impl, const B: usize, const D: usize> SimpleGenerator + for BaseSplitGenerator +{ fn id(&self) -> String { "BaseSplitGenerator".to_string() } diff --git a/plonky2/src/gates/constant.rs b/plonky2/src/gates/constant.rs index 5fac1f00..d6be45a9 100644 --- a/plonky2/src/gates/constant.rs +++ b/plonky2/src/gates/constant.rs @@ -86,7 +86,7 @@ impl, const D: usize> Gate for ConstantGate { .collect() } - fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { vec![] } diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index ff6d9918..a1409626 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -362,7 +362,7 @@ impl, const D: usize> Gate for CosetInterpola constraints } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { let gen = InterpolationGenerator::::new(row, self.clone()); vec![WitnessGeneratorRef::new(gen.adapter())] } @@ -406,7 +406,7 @@ impl, const D: usize> InterpolationGenerator } } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for InterpolationGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index eefc7ba7..d7ba936b 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -173,7 +173,7 @@ impl, const D: usize> Gate for Exponentiation constraints } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { let gen = ExponentiationGenerator:: { row, gate: self.clone(), @@ -243,7 +243,7 @@ pub struct ExponentiationGenerator, const D: usize> gate: ExponentiationGate, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for ExponentiationGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index dd0779de..78552588 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -175,7 +175,7 @@ pub trait Gate, const D: usize>: 'static + Send + S /// The generators used to populate the witness. /// Note: This should return exactly 1 generator per operation in the gate. - fn generators(&self, row: usize, local_constants: &[F]) -> Vec>; + fn generators(&self, row: usize, local_constants: &[F]) -> Vec>; /// The number of wires used by this gate. fn num_wires(&self) -> usize; diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 0ecac501..61db77fc 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -101,7 +101,7 @@ impl, const D: usize> Gate for LookupGate { vec![] } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { (0..self.num_slots) .map(|i| { WitnessGeneratorRef::new( @@ -149,7 +149,7 @@ pub struct LookupGenerator { slot_nb: usize, } -impl SimpleGenerator for LookupGenerator { +impl, const D: usize> SimpleGenerator for LookupGenerator { fn id(&self) -> String { "LookupGenerator".to_string() } diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index b4ad902a..6796dc0a 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -116,7 +116,7 @@ impl, const D: usize> Gate for LookupTableGat vec![] } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { (0..self.num_slots) .map(|i| { WitnessGeneratorRef::new( @@ -168,7 +168,7 @@ pub struct LookupTableGenerator { last_lut_row: usize, } -impl SimpleGenerator for LookupTableGenerator { +impl, const D: usize> SimpleGenerator for LookupTableGenerator { fn id(&self) -> String { "LookupTableGenerator".to_string() } diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index 7e1c1924..3aa69a5f 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -119,7 +119,7 @@ impl, const D: usize> Gate for MulExtensionGa constraints } - fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, local_constants: &[F]) -> Vec> { (0..self.num_ops) .map(|i| { WitnessGeneratorRef::new( @@ -158,7 +158,7 @@ pub struct MulExtensionGenerator, const D: usize> { i: usize, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for MulExtensionGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/noop.rs b/plonky2/src/gates/noop.rs index cfcfb912..332dd3a8 100644 --- a/plonky2/src/gates/noop.rs +++ b/plonky2/src/gates/noop.rs @@ -42,7 +42,7 @@ impl, const D: usize> Gate for NoopGate { Vec::new() } - fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { Vec::new() } diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index caab7faf..ff2ecf2e 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -380,7 +380,7 @@ impl, const D: usize> Gate for PoseidonGate Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { let gen = PoseidonGenerator:: { row, _phantom: PhantomData, @@ -415,7 +415,7 @@ pub struct PoseidonGenerator + Poseidon, const D: u _phantom: PhantomData, } -impl + Poseidon, const D: usize> SimpleGenerator +impl + Poseidon, const D: usize> SimpleGenerator for PoseidonGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index a3b4c927..ee5665de 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -187,7 +187,7 @@ impl + Poseidon, const D: usize> Gate for Pos .collect() } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { let gen = PoseidonMdsGenerator:: { row }; vec![WitnessGeneratorRef::new(gen.adapter())] } @@ -214,7 +214,7 @@ pub struct PoseidonMdsGenerator { row: usize, } -impl + Poseidon, const D: usize> SimpleGenerator +impl + Poseidon, const D: usize> SimpleGenerator for PoseidonMdsGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/public_input.rs b/plonky2/src/gates/public_input.rs index 2c3e2428..4d3f6982 100644 --- a/plonky2/src/gates/public_input.rs +++ b/plonky2/src/gates/public_input.rs @@ -72,7 +72,7 @@ impl, const D: usize> Gate for PublicInputGat .collect() } - fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, _row: usize, _local_constants: &[F]) -> Vec> { Vec::new() } diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index 7f651bab..d5ae5b9d 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -252,7 +252,7 @@ impl, const D: usize> Gate for RandomAccessGa constraints } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { (0..self.num_copies) .map(|copy| { WitnessGeneratorRef::new( @@ -345,7 +345,7 @@ pub struct RandomAccessGenerator, const D: usize> { copy: usize, } -impl, const D: usize> SimpleGenerator +impl, const D: usize> SimpleGenerator for RandomAccessGenerator { fn id(&self) -> String { diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index b9bd025a..2f02a747 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -150,7 +150,7 @@ impl, const D: usize> Gate for ReducingGate Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { vec![WitnessGeneratorRef::new( ReducingGenerator { row, @@ -183,7 +183,7 @@ pub struct ReducingGenerator { gate: ReducingGate, } -impl, const D: usize> SimpleGenerator for ReducingGenerator { +impl, const D: usize> SimpleGenerator for ReducingGenerator { fn id(&self) -> String { "ReducingGenerator".to_string() } diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 11541ec2..5b36aad0 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -150,7 +150,7 @@ impl, const D: usize> Gate for ReducingExtens .collect() } - fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { + fn generators(&self, row: usize, _local_constants: &[F]) -> Vec> { vec![WitnessGeneratorRef::new( ReducingGenerator { row, @@ -183,7 +183,7 @@ pub struct ReducingGenerator { gate: ReducingExtensionGate, } -impl, const D: usize> SimpleGenerator for ReducingGenerator { +impl, const D: usize> SimpleGenerator for ReducingGenerator { fn id(&self) -> String { "ReducingExtensionGenerator".to_string() } diff --git a/plonky2/src/iop/generator.rs b/plonky2/src/iop/generator.rs index 16a23e26..c5f6074e 100644 --- a/plonky2/src/iop/generator.rs +++ b/plonky2/src/iop/generator.rs @@ -98,7 +98,9 @@ pub(crate) fn generate_partial_witness< } /// A generator participates in the generation of the witness. -pub trait WitnessGenerator: 'static + Send + Sync + Debug { +pub trait WitnessGenerator, const D: usize>: + 'static + Send + Sync + Debug +{ fn id(&self) -> String; /// Targets to be "watched" by this generator. Whenever a target in the watch list is populated, @@ -119,23 +121,25 @@ pub trait WitnessGenerator: 'static + Send + Sync + Debug { /// A wrapper around an `Box` which implements `PartialEq` /// and `Eq` based on generator IDs. -pub struct WitnessGeneratorRef(pub Box>); +pub struct WitnessGeneratorRef, const D: usize>( + pub Box>, +); -impl WitnessGeneratorRef { - pub fn new>(generator: G) -> WitnessGeneratorRef { +impl, const D: usize> WitnessGeneratorRef { + pub fn new>(generator: G) -> WitnessGeneratorRef { WitnessGeneratorRef(Box::new(generator)) } } -impl PartialEq for WitnessGeneratorRef { +impl, const D: usize> PartialEq for WitnessGeneratorRef { fn eq(&self, other: &Self) -> bool { self.0.id() == other.0.id() } } -impl Eq for WitnessGeneratorRef {} +impl, const D: usize> Eq for WitnessGeneratorRef {} -impl Debug for WitnessGeneratorRef { +impl, const D: usize> Debug for WitnessGeneratorRef { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{}", self.0.id()) } @@ -190,14 +194,16 @@ impl GeneratedValues { } /// A generator which runs once after a list of dependencies is present in the witness. -pub trait SimpleGenerator: 'static + Send + Sync + Debug { +pub trait SimpleGenerator, const D: usize>: + 'static + Send + Sync + Debug +{ fn id(&self) -> String; fn dependencies(&self) -> Vec; fn run_once(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues); - fn adapter(self) -> SimpleGeneratorAdapter + fn adapter(self) -> SimpleGeneratorAdapter where Self: Sized, { @@ -215,12 +221,18 @@ pub trait SimpleGenerator: 'static + Send + Sync + Debug { } #[derive(Debug)] -pub struct SimpleGeneratorAdapter + ?Sized> { +pub struct SimpleGeneratorAdapter< + F: RichField + Extendable, + SG: SimpleGenerator + ?Sized, + const D: usize, +> { _phantom: PhantomData, inner: SG, } -impl> WitnessGenerator for SimpleGeneratorAdapter { +impl, SG: SimpleGenerator, const D: usize> WitnessGenerator + for SimpleGeneratorAdapter +{ fn id(&self) -> String { self.inner.id() } @@ -257,7 +269,7 @@ pub struct CopyGenerator { pub(crate) dst: Target, } -impl SimpleGenerator for CopyGenerator { +impl, const D: usize> SimpleGenerator for CopyGenerator { fn id(&self) -> String { "CopyGenerator".to_string() } @@ -289,7 +301,7 @@ pub struct RandomValueGenerator { pub(crate) target: Target, } -impl SimpleGenerator for RandomValueGenerator { +impl, const D: usize> SimpleGenerator for RandomValueGenerator { fn id(&self) -> String { "RandomValueGenerator".to_string() } @@ -320,7 +332,7 @@ pub struct NonzeroTestGenerator { pub(crate) dummy: Target, } -impl SimpleGenerator for NonzeroTestGenerator { +impl, const D: usize> SimpleGenerator for NonzeroTestGenerator { fn id(&self) -> String { "NonzeroTestGenerator".to_string() } @@ -368,7 +380,7 @@ impl ConstantGenerator { } } -impl SimpleGenerator for ConstantGenerator { +impl, const D: usize> SimpleGenerator for ConstantGenerator { fn id(&self) -> String { "ConstantGenerator".to_string() } diff --git a/plonky2/src/plonk/circuit_builder.rs b/plonky2/src/plonk/circuit_builder.rs index 8955a2bd..d8f9e32c 100644 --- a/plonky2/src/plonk/circuit_builder.rs +++ b/plonky2/src/plonk/circuit_builder.rs @@ -109,7 +109,7 @@ pub struct CircuitBuilder, const D: usize> { context_log: ContextTree, /// Generators used to generate the witness. - generators: Vec>, + generators: Vec>, constants_to_targets: HashMap, targets_to_constants: HashMap, @@ -444,11 +444,11 @@ impl, const D: usize> CircuitBuilder { self.connect(x, one); } - pub fn add_generators(&mut self, generators: Vec>) { + pub fn add_generators(&mut self, generators: Vec>) { self.generators.extend(generators); } - pub fn add_simple_generator>(&mut self, generator: G) { + pub fn add_simple_generator>(&mut self, generator: G) { self.generators .push(WitnessGeneratorRef::new(generator.adapter())); } diff --git a/plonky2/src/plonk/circuit_data.rs b/plonky2/src/plonk/circuit_data.rs index a2fd48df..edf28ba5 100644 --- a/plonky2/src/plonk/circuit_data.rs +++ b/plonky2/src/plonk/circuit_data.rs @@ -295,7 +295,7 @@ pub struct ProverOnlyCircuitData< C: GenericConfig, const D: usize, > { - pub generators: Vec>, + pub generators: Vec>, /// Generator indices (within the `Vec` above), indexed by the representative of each target /// they watch. pub generator_indices_by_watches: BTreeMap>, diff --git a/plonky2/src/recursion/dummy_circuit.rs b/plonky2/src/recursion/dummy_circuit.rs index daf9319a..2d9c48e4 100644 --- a/plonky2/src/recursion/dummy_circuit.rs +++ b/plonky2/src/recursion/dummy_circuit.rs @@ -238,7 +238,7 @@ where } } -impl SimpleGenerator for DummyProofGenerator +impl SimpleGenerator for DummyProofGenerator where F: RichField + Extendable, C: GenericConfig + 'static, diff --git a/plonky2/src/util/serialization/generator_serialization.rs b/plonky2/src/util/serialization/generator_serialization.rs index cbc6d6ba..4f35510e 100644 --- a/plonky2/src/util/serialization/generator_serialization.rs +++ b/plonky2/src/util/serialization/generator_serialization.rs @@ -11,12 +11,13 @@ pub trait WitnessGeneratorSerializer, const D: usiz fn read_generator( &self, buf: &mut Buffer, - common: &CommonCircuitData, - ) -> IoResult>; + cd: &CommonCircuitData, + ) -> IoResult>; + fn write_generator( &self, buf: &mut Vec, - generator: &WitnessGeneratorRef, + generator: &WitnessGeneratorRef, ) -> IoResult<()>; } @@ -30,16 +31,16 @@ macro_rules! read_generator_impl { if tag == 0 { let generator: $crate::recursion::dummy_circuit::DummyProofGenerator = $crate::recursion::dummy_circuit::DummyProofGenerator::deserialize_with_circuit_data(buf, $common)?; - return Ok($crate::iop::generator::WitnessGeneratorRef::::new( - $crate::iop::generator::SimpleGenerator::::adapter(generator), + return Ok($crate::iop::generator::WitnessGeneratorRef::::new( + $crate::iop::generator::SimpleGenerator::::adapter(generator), )); } $(if tag == i.next().unwrap() { let generator = - <$generator_types as $crate::iop::generator::SimpleGenerator>::deserialize(buf)?; - Ok($crate::iop::generator::WitnessGeneratorRef::::new( - $crate::iop::generator::SimpleGenerator::::adapter(generator), + <$generator_types as $crate::iop::generator::SimpleGenerator>::deserialize(buf)?; + Ok($crate::iop::generator::WitnessGeneratorRef::::new( + $crate::iop::generator::SimpleGenerator::::adapter(generator), )) } else)* { @@ -52,7 +53,7 @@ macro_rules! read_generator_impl { macro_rules! get_generator_tag_impl { ($generator:expr, $($generator_types:ty),+) => {{ let mut i = 0..; - $(if let (tag, true) = (i.next().unwrap(), $generator.0.id() == $crate::iop::generator::SimpleGenerator::::id(&<$generator_types>::default())) { + $(if let (tag, true) = (i.next().unwrap(), $generator.0.id() == $crate::iop::generator::SimpleGenerator::::id(&<$generator_types>::default())) { Ok(tag) } else)* { @@ -77,7 +78,7 @@ macro_rules! impl_generator_serializer { &self, buf: &mut $crate::util::serialization::Buffer, common: &$crate::plonk::circuit_data::CommonCircuitData, - ) -> $crate::util::serialization::IoResult<$crate::iop::generator::WitnessGeneratorRef> { + ) -> $crate::util::serialization::IoResult<$crate::iop::generator::WitnessGeneratorRef> { let tag = $crate::util::serialization::Read::read_u32(buf)?; read_generator_impl!(buf, tag, common, $($generator_types),+) } @@ -85,7 +86,7 @@ macro_rules! impl_generator_serializer { fn write_generator( &self, buf: &mut Vec, - generator: &$crate::iop::generator::WitnessGeneratorRef, + generator: &$crate::iop::generator::WitnessGeneratorRef, ) -> $crate::util::serialization::IoResult<()> { let tag = get_generator_tag_impl!(generator, $($generator_types),+)?; diff --git a/plonky2/src/util/serialization/mod.rs b/plonky2/src/util/serialization/mod.rs index 4324d715..88038da8 100644 --- a/plonky2/src/util/serialization/mod.rs +++ b/plonky2/src/util/serialization/mod.rs @@ -690,7 +690,7 @@ pub trait Read { &mut self, generator_serializer: &dyn WitnessGeneratorSerializer, common_data: &CommonCircuitData, - ) -> IoResult>; + ) -> IoResult>; fn read_selectors_info(&mut self) -> IoResult { let selector_indices = self.read_usize_vec()?; @@ -1693,7 +1693,7 @@ pub trait Write { fn write_generator, const D: usize>( &mut self, - generator: &WitnessGeneratorRef, + generator: &WitnessGeneratorRef, generator_serializer: &dyn WitnessGeneratorSerializer, ) -> IoResult<()>; @@ -2116,7 +2116,7 @@ impl Write for Vec { fn write_generator, const D: usize>( &mut self, - generator: &WitnessGeneratorRef, + generator: &WitnessGeneratorRef, generator_serializer: &dyn WitnessGeneratorSerializer, ) -> IoResult<()> { generator_serializer.write_generator(self, generator) @@ -2186,7 +2186,7 @@ impl<'a> Read for Buffer<'a> { &mut self, generator_serializer: &dyn WitnessGeneratorSerializer, common_data: &CommonCircuitData, - ) -> IoResult> { + ) -> IoResult> { generator_serializer.read_generator(self, common_data) } } From b43d6c1d670c0aa73c55b5d316ad5be0ee346401 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 08:12:40 -0400 Subject: [PATCH 2/9] Add CommonCircuitData to generators deserialization method --- plonky2/examples/square_root.rs | 4 +-- plonky2/src/gadgets/arithmetic.rs | 3 +- plonky2/src/gadgets/arithmetic_extension.rs | 3 +- plonky2/src/gadgets/range_check.rs | 3 +- plonky2/src/gadgets/split_base.rs | 4 ++- plonky2/src/gadgets/split_join.rs | 5 +-- plonky2/src/gates/arithmetic_base.rs | 4 +-- plonky2/src/gates/arithmetic_extension.rs | 4 +-- plonky2/src/gates/base_sum.rs | 4 +-- plonky2/src/gates/coset_interpolation.rs | 3 +- plonky2/src/gates/exponentiation.rs | 4 +-- plonky2/src/gates/lookup.rs | 4 +-- plonky2/src/gates/lookup_table.rs | 4 +-- plonky2/src/gates/multiplication_extension.rs | 4 +-- plonky2/src/gates/poseidon.rs | 3 +- plonky2/src/gates/poseidon_mds.rs | 3 +- plonky2/src/gates/random_access.rs | 4 +-- plonky2/src/gates/reducing.rs | 3 +- plonky2/src/gates/reducing_extension.rs | 3 +- plonky2/src/iop/generator.rs | 16 ++++----- plonky2/src/recursion/dummy_circuit.rs | 36 ++++++------------- .../serialization/generator_serialization.rs | 10 +----- 22 files changed, 60 insertions(+), 71 deletions(-) diff --git a/plonky2/examples/square_root.rs b/plonky2/examples/square_root.rs index f27c46d1..4433cee3 100644 --- a/plonky2/examples/square_root.rs +++ b/plonky2/examples/square_root.rs @@ -14,7 +14,7 @@ use plonky2::iop::generator::{ use plonky2::iop::target::Target; use plonky2::iop::witness::{PartialWitness, PartitionWitness, Witness, WitnessWrite}; use plonky2::plonk::circuit_builder::CircuitBuilder; -use plonky2::plonk::circuit_data::{CircuitConfig, CircuitData}; +use plonky2::plonk::circuit_data::{CircuitConfig, CircuitData, CommonCircuitData}; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig, PoseidonGoldilocksConfig}; use plonky2::recursion::dummy_circuit::DummyProofGenerator; use plonky2::util::serialization::{ @@ -57,7 +57,7 @@ impl, const D: usize> SimpleGenerator dst.write_target(self.x_squared) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let x = src.read_target()?; let x_squared = src.read_target()?; Ok(Self { diff --git a/plonky2/src/gadgets/arithmetic.rs b/plonky2/src/gadgets/arithmetic.rs index aaf12a40..7ee5913e 100644 --- a/plonky2/src/gadgets/arithmetic.rs +++ b/plonky2/src/gadgets/arithmetic.rs @@ -11,6 +11,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::serialization::{Buffer, IoResult, Read, Write}; impl, const D: usize> CircuitBuilder { @@ -405,7 +406,7 @@ impl, const D: usize> SimpleGenerator for Equ dst.write_target(self.inv) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let x = src.read_target()?; let y = src.read_target()?; let equal = src.read_target_bool()?; diff --git a/plonky2/src/gadgets/arithmetic_extension.rs b/plonky2/src/gadgets/arithmetic_extension.rs index d201b523..3240c5f2 100644 --- a/plonky2/src/gadgets/arithmetic_extension.rs +++ b/plonky2/src/gadgets/arithmetic_extension.rs @@ -12,6 +12,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::bits_u64; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -527,7 +528,7 @@ impl, const D: usize> SimpleGenerator dst.write_target_ext(self.quotient) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let numerator = src.read_target_ext()?; let denominator = src.read_target_ext()?; let quotient = src.read_target_ext()?; diff --git a/plonky2/src/gadgets/range_check.rs b/plonky2/src/gadgets/range_check.rs index 4a4617b6..b894f37d 100644 --- a/plonky2/src/gadgets/range_check.rs +++ b/plonky2/src/gadgets/range_check.rs @@ -7,6 +7,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::serialization::{Buffer, IoResult, Read, Write}; impl, const D: usize> CircuitBuilder { @@ -85,7 +86,7 @@ impl, const D: usize> SimpleGenerator for Low dst.write_target(self.high) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let n_log = src.read_usize()?; let low = src.read_target()?; diff --git a/plonky2/src/gadgets/split_base.rs b/plonky2/src/gadgets/split_base.rs index 1b375138..82fed22c 100644 --- a/plonky2/src/gadgets/split_base.rs +++ b/plonky2/src/gadgets/split_base.rs @@ -11,6 +11,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::log_floor; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -114,7 +115,7 @@ impl, const B: usize, const D: usize> SimpleGenerat dst.write_target_bool_vec(&self.limbs) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let limbs = src.read_target_bool_vec()?; Ok(Self { row, limbs }) @@ -124,6 +125,7 @@ impl, const B: usize, const D: usize> SimpleGenerat #[cfg(test)] mod tests { use anyhow::Result; + use plonky2_field::types::Field; use rand::rngs::OsRng; use rand::Rng; diff --git a/plonky2/src/gadgets/split_join.rs b/plonky2/src/gadgets/split_join.rs index 919cba95..8dc28f98 100644 --- a/plonky2/src/gadgets/split_join.rs +++ b/plonky2/src/gadgets/split_join.rs @@ -8,6 +8,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator}; use crate::iop::target::{BoolTarget, Target}; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::ceil_div_usize; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -91,7 +92,7 @@ impl, const D: usize> SimpleGenerator for Spl dst.write_target_vec(&self.bits) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let bits = src.read_target_vec()?; Ok(Self { integer, bits }) @@ -147,7 +148,7 @@ impl, const D: usize> SimpleGenerator for Wir dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let gates = src.read_usize_vec()?; let num_limbs = src.read_usize()?; diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index 62d5ebac..0156e9ec 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -13,7 +13,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -228,7 +228,7 @@ impl, const D: usize> SimpleGenerator dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let const_1 = src.read_field()?; diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index d1f789ac..c42a72e4 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -12,7 +12,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -221,7 +221,7 @@ impl, const D: usize> SimpleGenerator dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let const_1 = src.read_field()?; diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 66cff0d5..15cf4995 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -15,7 +15,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::plonk_common::{reduce_with_powers, reduce_with_powers_ext_circuit}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, @@ -216,7 +216,7 @@ impl, const B: usize, const D: usize> SimpleGenerat dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let num_limbs = src.read_usize()?; Ok(Self { row, num_limbs }) diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index a1409626..8351834c 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -17,6 +17,7 @@ use crate::iop::target::Target; use crate::iop::wire::Wire; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -501,7 +502,7 @@ impl, const D: usize> SimpleGenerator self.gate.serialize(dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let gate = CosetInterpolationGate::deserialize(src)?; Ok(Self::new(row, gate)) diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index d7ba936b..a39a14df 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -17,7 +17,7 @@ use crate::iop::target::Target; use crate::iop::wire::Wire; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -300,7 +300,7 @@ impl, const D: usize> SimpleGenerator self.gate.serialize(dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let gate = ExponentiationGate::deserialize(src)?; Ok(Self { row, gate }) diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 61db77fc..37b7087e 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -16,7 +16,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -190,7 +190,7 @@ impl, const D: usize> SimpleGenerator for Loo dst.write_usize(self.slot_nb) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let lut = src.read_lut()?; let slot_nb = src.read_usize()?; diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 6796dc0a..b53d805c 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -17,7 +17,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -210,7 +210,7 @@ impl, const D: usize> SimpleGenerator for Loo dst.write_usize(self.last_lut_row) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let lut = src.read_lut()?; let slot_nb = src.read_usize()?; diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index 3aa69a5f..1a598cbe 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -12,7 +12,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -197,7 +197,7 @@ impl, const D: usize> SimpleGenerator dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let i = src.read_usize()?; diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index ff2ecf2e..7b5fb6a3 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -17,6 +17,7 @@ use crate::iop::target::Target; use crate::iop::wire::Wire; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -516,7 +517,7 @@ impl + Poseidon, const D: usize> SimpleGenerator IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; Ok(Self { row, diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index ee5665de..927b10fc 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -16,6 +16,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -254,7 +255,7 @@ impl + Poseidon, const D: usize> SimpleGenerator IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; Ok(Self { row }) } diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index d5ae5b9d..114ae5f4 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -18,7 +18,7 @@ use crate::iop::target::Target; use crate::iop::wire::Wire; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; -use crate::plonk::circuit_data::CircuitConfig; +use crate::plonk::circuit_data::{CircuitConfig, CommonCircuitData}; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -400,7 +400,7 @@ impl, const D: usize> SimpleGenerator self.gate.serialize(dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let copy = src.read_usize()?; let gate = RandomAccessGate::::deserialize(src)?; diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index 2f02a747..1c196ede 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -12,6 +12,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -230,7 +231,7 @@ impl, const D: usize> SimpleGenerator for Red as Gate>::serialize(&self.gate, dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let gate = as Gate>::deserialize(src)?; Ok(Self { row, gate }) diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 5b36aad0..2e35d54f 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -12,6 +12,7 @@ use crate::iop::generator::{GeneratedValues, SimpleGenerator, WitnessGeneratorRe use crate::iop::target::Target; use crate::iop::witness::{PartitionWitness, Witness, WitnessWrite}; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBase}; use crate::util::serialization::{Buffer, IoResult, Read, Write}; @@ -224,7 +225,7 @@ impl, const D: usize> SimpleGenerator for Red as Gate>::serialize(&self.gate, dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let gate = as Gate>::deserialize(src)?; Ok(Self { row, gate }) diff --git a/plonky2/src/iop/generator.rs b/plonky2/src/iop/generator.rs index c5f6074e..30cfdad2 100644 --- a/plonky2/src/iop/generator.rs +++ b/plonky2/src/iop/generator.rs @@ -114,7 +114,7 @@ pub trait WitnessGenerator, const D: usize>: fn serialize(&self, dst: &mut Vec) -> IoResult<()>; - fn deserialize(src: &mut Buffer) -> IoResult + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where Self: Sized; } @@ -215,7 +215,7 @@ pub trait SimpleGenerator, const D: usize>: fn serialize(&self, dst: &mut Vec) -> IoResult<()>; - fn deserialize(src: &mut Buffer) -> IoResult + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where Self: Sized; } @@ -254,9 +254,9 @@ impl, SG: SimpleGenerator, const D: usize> Wi self.inner.serialize(dst) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { Ok(Self { - inner: SG::deserialize(src)?, + inner: SG::deserialize(src, cd)?, _phantom: PhantomData, }) } @@ -288,7 +288,7 @@ impl, const D: usize> SimpleGenerator for Cop dst.write_target(self.dst) } - fn deserialize(source: &mut Buffer) -> IoResult { + fn deserialize(source: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let src = source.read_target()?; let dst = source.read_target()?; Ok(Self { src, dst }) @@ -319,7 +319,7 @@ impl, const D: usize> SimpleGenerator for Ran dst.write_target(self.target) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let target = src.read_target()?; Ok(Self { target }) } @@ -358,7 +358,7 @@ impl, const D: usize> SimpleGenerator for Non dst.write_target(self.dummy) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let to_test = src.read_target()?; let dummy = src.read_target()?; Ok(Self { to_test, dummy }) @@ -400,7 +400,7 @@ impl, const D: usize> SimpleGenerator for Con dst.write_field(self.constant) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let constant_index = src.read_usize()?; let wire_index = src.read_usize()?; diff --git a/plonky2/src/recursion/dummy_circuit.rs b/plonky2/src/recursion/dummy_circuit.rs index 2d9c48e4..aa1eb3c4 100644 --- a/plonky2/src/recursion/dummy_circuit.rs +++ b/plonky2/src/recursion/dummy_circuit.rs @@ -215,29 +215,6 @@ where } } -impl DummyProofGenerator -where - F: RichField + Extendable, - C: GenericConfig + 'static, - C::Hasher: AlgebraicHasher, -{ - pub fn deserialize_with_circuit_data( - src: &mut Buffer, - cd: &CommonCircuitData, - ) -> IoResult { - let proof_with_pis_target = src.read_target_proof_with_public_inputs()?; - let proof_with_pis = src.read_proof_with_public_inputs(cd)?; - let verifier_data_target = src.read_target_verifier_circuit()?; - let verifier_data = src.read_verifier_only_circuit_data()?; - Ok(Self { - proof_with_pis_target, - proof_with_pis, - verifier_data_target, - verifier_data, - }) - } -} - impl SimpleGenerator for DummyProofGenerator where F: RichField + Extendable, @@ -264,7 +241,16 @@ where dst.write_verifier_only_circuit_data(&self.verifier_data) } - fn deserialize(_src: &mut Buffer) -> IoResult { - panic!() + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + let proof_with_pis_target = src.read_target_proof_with_public_inputs()?; + let proof_with_pis = src.read_proof_with_public_inputs(cd)?; + let verifier_data_target = src.read_target_verifier_circuit()?; + let verifier_data = src.read_verifier_only_circuit_data()?; + Ok(Self { + proof_with_pis_target, + proof_with_pis, + verifier_data_target, + verifier_data, + }) } } diff --git a/plonky2/src/util/serialization/generator_serialization.rs b/plonky2/src/util/serialization/generator_serialization.rs index 4f35510e..fb9357b8 100644 --- a/plonky2/src/util/serialization/generator_serialization.rs +++ b/plonky2/src/util/serialization/generator_serialization.rs @@ -28,17 +28,9 @@ macro_rules! read_generator_impl { let buf = $buf; let mut i = 0..; - if tag == 0 { - let generator: $crate::recursion::dummy_circuit::DummyProofGenerator = - $crate::recursion::dummy_circuit::DummyProofGenerator::deserialize_with_circuit_data(buf, $common)?; - return Ok($crate::iop::generator::WitnessGeneratorRef::::new( - $crate::iop::generator::SimpleGenerator::::adapter(generator), - )); - } - $(if tag == i.next().unwrap() { let generator = - <$generator_types as $crate::iop::generator::SimpleGenerator>::deserialize(buf)?; + <$generator_types as $crate::iop::generator::SimpleGenerator>::deserialize(buf, $common)?; Ok($crate::iop::generator::WitnessGeneratorRef::::new( $crate::iop::generator::SimpleGenerator::::adapter(generator), )) From 47781e4733016c875687a7b373eece7705d67e5f Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 08:26:38 -0400 Subject: [PATCH 3/9] Add CommonCircuitData to gates deserialization method --- plonky2/src/gates/arithmetic_base.rs | 2 +- plonky2/src/gates/arithmetic_extension.rs | 2 +- plonky2/src/gates/base_sum.rs | 2 +- plonky2/src/gates/constant.rs | 3 +- plonky2/src/gates/coset_interpolation.rs | 4 +- plonky2/src/gates/exponentiation.rs | 4 +- plonky2/src/gates/gate.rs | 3 +- plonky2/src/gates/lookup.rs | 2 +- plonky2/src/gates/lookup_table.rs | 2 +- plonky2/src/gates/multiplication_extension.rs | 2 +- plonky2/src/gates/noop.rs | 3 +- plonky2/src/gates/poseidon.rs | 2 +- plonky2/src/gates/poseidon_mds.rs | 2 +- plonky2/src/gates/public_input.rs | 3 +- plonky2/src/gates/random_access.rs | 4 +- plonky2/src/gates/reducing.rs | 4 +- plonky2/src/gates/reducing_extension.rs | 4 +- .../util/serialization/gate_serialization.rs | 19 ++++++--- plonky2/src/util/serialization/mod.rs | 41 +++++++++++-------- 19 files changed, 65 insertions(+), 43 deletions(-) diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index 0156e9ec..3e238dd4 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -64,7 +64,7 @@ impl, const D: usize> Gate for ArithmeticGate dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index c42a72e4..352aeadf 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -60,7 +60,7 @@ impl, const D: usize> Gate for ArithmeticExte dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 15cf4995..3e00940a 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -59,7 +59,7 @@ impl, const D: usize, const B: usize> Gate fo dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_limbs = src.read_usize()?; Ok(Self { num_limbs }) } diff --git a/plonky2/src/gates/constant.rs b/plonky2/src/gates/constant.rs index d6be45a9..c759ee91 100644 --- a/plonky2/src/gates/constant.rs +++ b/plonky2/src/gates/constant.rs @@ -13,6 +13,7 @@ use crate::hash::hash_types::RichField; use crate::iop::ext_target::ExtensionTarget; use crate::iop::generator::WitnessGeneratorRef; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -46,7 +47,7 @@ impl, const D: usize> Gate for ConstantGate { dst.write_usize(self.num_consts) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_consts = src.read_usize()?; Ok(Self { num_consts }) } diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index 8351834c..c5d6bfbf 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -176,7 +176,7 @@ impl, const D: usize> Gate for CosetInterpola dst.write_field_vec(&self.barycentric_weights) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let subgroup_bits = src.read_usize()?; let degree = src.read_usize()?; let length = src.read_usize()?; @@ -504,7 +504,7 @@ impl, const D: usize> SimpleGenerator fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = CosetInterpolationGate::deserialize(src)?; + let gate = CosetInterpolationGate::deserialize(src, _cd)?; Ok(Self::new(row, gate)) } } diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index a39a14df..7cb18f59 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -80,7 +80,7 @@ impl, const D: usize> Gate for Exponentiation dst.write_usize(self.num_power_bits) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_power_bits = src.read_usize()?; Ok(Self::new(num_power_bits)) } @@ -302,7 +302,7 @@ impl, const D: usize> SimpleGenerator fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = ExponentiationGate::deserialize(src)?; + let gate = ExponentiationGate::deserialize(src, _cd)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index 78552588..71b1b64c 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -19,6 +19,7 @@ use crate::hash::hash_types::RichField; use crate::iop::ext_target::ExtensionTarget; use crate::iop::generator::WitnessGeneratorRef; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, }; @@ -30,7 +31,7 @@ pub trait Gate, const D: usize>: 'static + Send + S fn serialize(&self, dst: &mut Vec) -> IoResult<()>; - fn deserialize(src: &mut Buffer) -> IoResult + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where Self: Sized; diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 37b7087e..e7d24057 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -65,7 +65,7 @@ impl, const D: usize> Gate for LookupGate { dst.write_lut(&self.lut) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; let lut = src.read_lut()?; diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index b53d805c..706ce3e6 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -78,7 +78,7 @@ impl, const D: usize> Gate for LookupTableGat dst.write_usize(self.last_lut_row) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; let lut = src.read_lut()?; let last_lut_row = src.read_usize()?; diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index 1a598cbe..ffed12f8 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -57,7 +57,7 @@ impl, const D: usize> Gate for MulExtensionGa dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } diff --git a/plonky2/src/gates/noop.rs b/plonky2/src/gates/noop.rs index 332dd3a8..7ce5e92f 100644 --- a/plonky2/src/gates/noop.rs +++ b/plonky2/src/gates/noop.rs @@ -7,6 +7,7 @@ use crate::hash::hash_types::RichField; use crate::iop::ext_target::ExtensionTarget; use crate::iop::generator::WitnessGeneratorRef; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{EvaluationTargets, EvaluationVars, EvaluationVarsBaseBatch}; use crate::util::serialization::{Buffer, IoResult}; @@ -22,7 +23,7 @@ impl, const D: usize> Gate for NoopGate { Ok(()) } - fn deserialize(_src: &mut Buffer) -> IoResult { + fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { Ok(Self) } diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index 7b5fb6a3..4eba0eb9 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -104,7 +104,7 @@ impl, const D: usize> Gate for PoseidonGate IoResult { + fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { Ok(PoseidonGate::new()) } diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index 927b10fc..ae796e67 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -123,7 +123,7 @@ impl + Poseidon, const D: usize> Gate for Pos Ok(()) } - fn deserialize(_src: &mut Buffer) -> IoResult { + fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { Ok(PoseidonMdsGate::new()) } diff --git a/plonky2/src/gates/public_input.rs b/plonky2/src/gates/public_input.rs index 4d3f6982..0009d4ac 100644 --- a/plonky2/src/gates/public_input.rs +++ b/plonky2/src/gates/public_input.rs @@ -11,6 +11,7 @@ use crate::hash::hash_types::RichField; use crate::iop::ext_target::ExtensionTarget; use crate::iop::generator::WitnessGeneratorRef; use crate::plonk::circuit_builder::CircuitBuilder; +use crate::plonk::circuit_data::CommonCircuitData; use crate::plonk::vars::{ EvaluationTargets, EvaluationVars, EvaluationVarsBase, EvaluationVarsBaseBatch, EvaluationVarsBasePacked, @@ -35,7 +36,7 @@ impl, const D: usize> Gate for PublicInputGat Ok(()) } - fn deserialize(_src: &mut Buffer) -> IoResult { + fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { Ok(Self) } diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index 114ae5f4..e0aae2a7 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -129,7 +129,7 @@ impl, const D: usize> Gate for RandomAccessGa Ok(()) } - fn deserialize(src: &mut Buffer) -> IoResult { + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let bits = src.read_usize()?; let num_copies = src.read_usize()?; let num_extra_constants = src.read_usize()?; @@ -403,7 +403,7 @@ impl, const D: usize> SimpleGenerator fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let copy = src.read_usize()?; - let gate = RandomAccessGate::::deserialize(src)?; + let gate = RandomAccessGate::::deserialize(src, _cd)?; Ok(Self { row, gate, copy }) } } diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index 1c196ede..b72bcc42 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -66,7 +66,7 @@ impl, const D: usize> Gate for ReducingGate IoResult + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult where Self: Sized, { @@ -233,7 +233,7 @@ impl, const D: usize> SimpleGenerator for Red fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = as Gate>::deserialize(src)?; + let gate = as Gate>::deserialize(src, _cd)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 2e35d54f..021188ea 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -69,7 +69,7 @@ impl, const D: usize> Gate for ReducingExtens Ok(()) } - fn deserialize(src: &mut Buffer) -> IoResult + fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult where Self: Sized, { @@ -227,7 +227,7 @@ impl, const D: usize> SimpleGenerator for Red fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = as Gate>::deserialize(src)?; + let gate = as Gate>::deserialize(src, _cd)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/util/serialization/gate_serialization.rs b/plonky2/src/util/serialization/gate_serialization.rs index 2d9e3e30..3313937f 100644 --- a/plonky2/src/util/serialization/gate_serialization.rs +++ b/plonky2/src/util/serialization/gate_serialization.rs @@ -2,21 +2,26 @@ use plonky2_field::extension::Extendable; use crate::gates::gate::GateRef; use crate::hash::hash_types::RichField; +use crate::plonk::circuit_data::CommonCircuitData; use crate::util::serialization::{Buffer, IoResult}; pub trait GateSerializer, const D: usize> { - fn read_gate(&self, buf: &mut Buffer) -> IoResult>; + fn read_gate( + &self, + buf: &mut Buffer, + common: &CommonCircuitData, + ) -> IoResult>; fn write_gate(&self, buf: &mut Vec, gate: &GateRef) -> IoResult<()>; } #[macro_export] macro_rules! read_gate_impl { - ($buf:expr, $tag:expr, $($gate_types:ty),+) => {{ + ($buf:expr, $tag:expr, $common:expr, $($gate_types:ty),+) => {{ let tag = $tag; let buf = $buf; let mut i = 0..; $(if tag == i.next().unwrap() { - let gate = <$gate_types as $crate::gates::gate::Gate>::deserialize(buf)?; + let gate = <$gate_types as $crate::gates::gate::Gate>::deserialize(buf, $common)?; Ok($crate::gates::gate::GateRef::::new(gate)) } else)* { @@ -47,9 +52,13 @@ macro_rules! get_gate_tag_impl { /// this as first argument, followed by all the targeted gates. macro_rules! impl_gate_serializer { ($target:ty, $($gate_types:ty),+) => { - fn read_gate(&self, buf: &mut $crate::util::serialization::Buffer) -> $crate::util::serialization::IoResult<$crate::gates::gate::GateRef> { + fn read_gate( + &self, + buf: &mut $crate::util::serialization::Buffer, + common: &$crate::plonk::circuit_data::CommonCircuitData, + ) -> $crate::util::serialization::IoResult<$crate::gates::gate::GateRef> { let tag = $crate::util::serialization::Read::read_u32(buf)?; - read_gate_impl!(buf, tag, $($gate_types),+) + read_gate_impl!(buf, tag, common, $($gate_types),+) } fn write_gate(&self, buf: &mut Vec, gate: &$crate::gates::gate::GateRef) -> $crate::util::serialization::IoResult<()> { diff --git a/plonky2/src/util/serialization/mod.rs b/plonky2/src/util/serialization/mod.rs index 88038da8..875929fa 100644 --- a/plonky2/src/util/serialization/mod.rs +++ b/plonky2/src/util/serialization/mod.rs @@ -684,6 +684,7 @@ pub trait Read { fn read_gate, const D: usize>( &mut self, gate_serializer: &dyn GateSerializer, + common_data: &CommonCircuitData, ) -> IoResult>; fn read_generator, const D: usize>( @@ -743,13 +744,6 @@ pub trait Read { let config = self.read_circuit_config()?; let fri_params = self.read_fri_params()?; - let gates_len = self.read_usize()?; - let mut gates = Vec::with_capacity(gates_len); - for _ in 0..gates_len { - let gate = self.read_gate::(gate_serializer)?; - gates.push(gate); - } - let selectors_info = self.read_selectors_info()?; let quotient_degree_factor = self.read_usize()?; let num_gate_constraints = self.read_usize()?; @@ -770,10 +764,15 @@ pub trait Read { luts.push(Arc::new(self.read_lut()?)); } - Ok(CommonCircuitData { + let gates_len = self.read_usize()?; + let mut gates = Vec::with_capacity(gates_len); + + // We construct the common data without gates first, + // to pass it as argument when reading the gates. + let mut cd = CommonCircuitData { config, fri_params, - gates, + gates: vec![], selectors_info, quotient_degree_factor, num_gate_constraints, @@ -784,7 +783,16 @@ pub trait Read { num_lookup_polys, num_lookup_selectors, luts, - }) + }; + + for _ in 0..gates_len { + let gate = self.read_gate::(gate_serializer, &cd)?; + gates.push(gate); + } + + cd.gates = gates; + + Ok(cd) } fn read_circuit_data< @@ -1757,11 +1765,6 @@ pub trait Write { self.write_circuit_config(config)?; self.write_fri_params(fri_params)?; - self.write_usize(gates.len())?; - for gate in gates.iter() { - self.write_gate::(gate, gate_serializer)?; - } - self.write_selectors_info(selectors_info)?; self.write_usize(*quotient_degree_factor)?; self.write_usize(*num_gate_constraints)?; @@ -1780,6 +1783,11 @@ pub trait Write { self.write_lut(lut)?; } + self.write_usize(gates.len())?; + for gate in gates.iter() { + self.write_gate::(gate, gate_serializer)?; + } + Ok(()) } @@ -2178,8 +2186,9 @@ impl<'a> Read for Buffer<'a> { fn read_gate, const D: usize>( &mut self, gate_serializer: &dyn GateSerializer, + common_data: &CommonCircuitData, ) -> IoResult> { - gate_serializer.read_gate(self) + gate_serializer.read_gate(self, common_data) } fn read_generator, const D: usize>( From 544aff27b602f6bbeae735b1a1ff7a8f3628e2ca Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 08:38:02 -0400 Subject: [PATCH 4/9] Also provide CommonCircuitData in serialization of gates and generators --- evm/src/fixed_recursive_verifier.rs | 1 + plonky2/examples/square_root.rs | 2 +- plonky2/src/gadgets/arithmetic.rs | 2 +- plonky2/src/gadgets/arithmetic_extension.rs | 2 +- plonky2/src/gadgets/range_check.rs | 2 +- plonky2/src/gadgets/split_base.rs | 2 +- plonky2/src/gadgets/split_join.rs | 4 +-- plonky2/src/gates/arithmetic_base.rs | 4 +-- plonky2/src/gates/arithmetic_extension.rs | 4 +-- plonky2/src/gates/base_sum.rs | 4 +-- plonky2/src/gates/constant.rs | 2 +- plonky2/src/gates/coset_interpolation.rs | 6 ++--- plonky2/src/gates/exponentiation.rs | 6 ++--- plonky2/src/gates/gate.rs | 2 +- plonky2/src/gates/lookup.rs | 4 +-- plonky2/src/gates/lookup_table.rs | 4 +-- plonky2/src/gates/multiplication_extension.rs | 4 +-- plonky2/src/gates/noop.rs | 2 +- plonky2/src/gates/poseidon.rs | 4 +-- plonky2/src/gates/poseidon_mds.rs | 4 +-- plonky2/src/gates/public_input.rs | 2 +- plonky2/src/gates/random_access.rs | 6 ++--- plonky2/src/gates/reducing.rs | 6 ++--- plonky2/src/gates/reducing_extension.rs | 6 ++--- plonky2/src/iop/generator.rs | 16 ++++++------ plonky2/src/recursion/dummy_circuit.rs | 2 +- .../util/serialization/gate_serialization.rs | 20 +++++++++------ .../serialization/generator_serialization.rs | 10 +++----- plonky2/src/util/serialization/mod.rs | 25 ++++++++++++++----- 29 files changed, 88 insertions(+), 70 deletions(-) diff --git a/evm/src/fixed_recursive_verifier.rs b/evm/src/fixed_recursive_verifier.rs index 79848eca..307c4a13 100644 --- a/evm/src/fixed_recursive_verifier.rs +++ b/evm/src/fixed_recursive_verifier.rs @@ -831,6 +831,7 @@ where buffer.write_prover_only_circuit_data( &wrapper.circuit.prover_only, generator_serializer, + &wrapper.circuit.common, )?; buffer.write_verifier_only_circuit_data(&wrapper.circuit.verifier_only)?; buffer.write_target_proof_with_public_inputs(&wrapper.proof_with_pis_target)?; diff --git a/plonky2/examples/square_root.rs b/plonky2/examples/square_root.rs index 4433cee3..48883e3f 100644 --- a/plonky2/examples/square_root.rs +++ b/plonky2/examples/square_root.rs @@ -52,7 +52,7 @@ impl, const D: usize> SimpleGenerator out_buffer.set_target(self.x, x); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.x)?; dst.write_target(self.x_squared) } diff --git a/plonky2/src/gadgets/arithmetic.rs b/plonky2/src/gadgets/arithmetic.rs index 7ee5913e..d245aef5 100644 --- a/plonky2/src/gadgets/arithmetic.rs +++ b/plonky2/src/gadgets/arithmetic.rs @@ -399,7 +399,7 @@ impl, const D: usize> SimpleGenerator for Equ out_buffer.set_target(self.inv, inv); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.x)?; dst.write_target(self.y)?; dst.write_target_bool(self.equal)?; diff --git a/plonky2/src/gadgets/arithmetic_extension.rs b/plonky2/src/gadgets/arithmetic_extension.rs index 3240c5f2..11e3cc83 100644 --- a/plonky2/src/gadgets/arithmetic_extension.rs +++ b/plonky2/src/gadgets/arithmetic_extension.rs @@ -522,7 +522,7 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(self.quotient, quotient) } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target_ext(self.numerator)?; dst.write_target_ext(self.denominator)?; dst.write_target_ext(self.quotient) diff --git a/plonky2/src/gadgets/range_check.rs b/plonky2/src/gadgets/range_check.rs index b894f37d..c7bfc6a5 100644 --- a/plonky2/src/gadgets/range_check.rs +++ b/plonky2/src/gadgets/range_check.rs @@ -79,7 +79,7 @@ impl, const D: usize> SimpleGenerator for Low out_buffer.set_target(self.high, F::from_canonical_u64(high)); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_usize(self.n_log)?; dst.write_target(self.low)?; diff --git a/plonky2/src/gadgets/split_base.rs b/plonky2/src/gadgets/split_base.rs index 82fed22c..c300723e 100644 --- a/plonky2/src/gadgets/split_base.rs +++ b/plonky2/src/gadgets/split_base.rs @@ -110,7 +110,7 @@ impl, const B: usize, const D: usize> SimpleGenerat out_buffer.set_target(Target::wire(self.row, BaseSumGate::::WIRE_SUM), sum); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_target_bool_vec(&self.limbs) } diff --git a/plonky2/src/gadgets/split_join.rs b/plonky2/src/gadgets/split_join.rs index 8dc28f98..b8daeec8 100644 --- a/plonky2/src/gadgets/split_join.rs +++ b/plonky2/src/gadgets/split_join.rs @@ -87,7 +87,7 @@ impl, const D: usize> SimpleGenerator for Spl ); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_target_vec(&self.bits) } @@ -142,7 +142,7 @@ impl, const D: usize> SimpleGenerator for Wir ); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_usize_vec(&self.gates)?; dst.write_usize(self.num_limbs) diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index 3e238dd4..dae84fb1 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -60,7 +60,7 @@ impl, const D: usize> Gate for ArithmeticGate format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } @@ -221,7 +221,7 @@ impl, const D: usize> SimpleGenerator out_buffer.set_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_field(self.const_1)?; diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index 352aeadf..bd21b22c 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -56,7 +56,7 @@ impl, const D: usize> Gate for ArithmeticExte format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } @@ -214,7 +214,7 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_field(self.const_1)?; diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 3e00940a..5d999e92 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -55,7 +55,7 @@ impl, const D: usize, const B: usize> Gate fo format!("{self:?} + Base: {B}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_limbs) } @@ -211,7 +211,7 @@ impl, const B: usize, const D: usize> SimpleGenerat } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.num_limbs) } diff --git a/plonky2/src/gates/constant.rs b/plonky2/src/gates/constant.rs index c759ee91..4a41ab9f 100644 --- a/plonky2/src/gates/constant.rs +++ b/plonky2/src/gates/constant.rs @@ -43,7 +43,7 @@ impl, const D: usize> Gate for ConstantGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_consts) } diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index c5d6bfbf..ea0b00e3 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -169,7 +169,7 @@ impl, const D: usize> Gate for CosetInterpola format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.subgroup_bits)?; dst.write_usize(self.degree)?; dst.write_usize(self.barycentric_weights.len())?; @@ -497,9 +497,9 @@ impl, const D: usize> SimpleGenerator out_buffer.set_ext_wires(evaluation_value_wires, computed_eval); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - self.gate.serialize(dst) + self.gate.serialize(dst, _cd) } fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index 7cb18f59..38053e65 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -76,7 +76,7 @@ impl, const D: usize> Gate for Exponentiation format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_power_bits) } @@ -295,9 +295,9 @@ impl, const D: usize> SimpleGenerator out_buffer.set_wire(output_wire, intermediate_values[num_power_bits - 1]); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - self.gate.serialize(dst) + self.gate.serialize(dst, _cd) } fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index 71b1b64c..6783c38f 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -29,7 +29,7 @@ use crate::util::serialization::{Buffer, IoResult}; pub trait Gate, const D: usize>: 'static + Send + Sync { fn id(&self) -> String; - fn serialize(&self, dst: &mut Vec) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index e7d24057..5b27abf8 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -60,7 +60,7 @@ impl, const D: usize> Gate for LookupGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; dst.write_lut(&self.lut) } @@ -184,7 +184,7 @@ impl, const D: usize> SimpleGenerator for Loo out_buffer.set_target(out_wire, output_val); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_lut(&self.lut)?; dst.write_usize(self.slot_nb) diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 706ce3e6..e80e1898 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -72,7 +72,7 @@ impl, const D: usize> Gate for LookupTableGat format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; dst.write_lut(&self.lut)?; dst.write_usize(self.last_lut_row) @@ -202,7 +202,7 @@ impl, const D: usize> SimpleGenerator for Loo } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_lut(&self.lut)?; dst.write_usize(self.slot_nb)?; diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index ffed12f8..ed330e85 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -53,7 +53,7 @@ impl, const D: usize> Gate for MulExtensionGa format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } @@ -191,7 +191,7 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_usize(self.i) diff --git a/plonky2/src/gates/noop.rs b/plonky2/src/gates/noop.rs index 7ce5e92f..f1baae52 100644 --- a/plonky2/src/gates/noop.rs +++ b/plonky2/src/gates/noop.rs @@ -19,7 +19,7 @@ impl, const D: usize> Gate for NoopGate { "NoopGate".into() } - fn serialize(&self, _dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { Ok(()) } diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index 4eba0eb9..0f68ea99 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -100,7 +100,7 @@ impl, const D: usize> Gate for PoseidonGate") } - fn serialize(&self, _dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { Ok(()) } @@ -513,7 +513,7 @@ impl + Poseidon, const D: usize> SimpleGenerator) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row) } diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index ae796e67..59bbf48b 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -119,7 +119,7 @@ impl + Poseidon, const D: usize> Gate for Pos format!("{self:?}") } - fn serialize(&self, _dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { Ok(()) } @@ -251,7 +251,7 @@ impl + Poseidon, const D: usize> SimpleGenerator) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row) } diff --git a/plonky2/src/gates/public_input.rs b/plonky2/src/gates/public_input.rs index 0009d4ac..1d081819 100644 --- a/plonky2/src/gates/public_input.rs +++ b/plonky2/src/gates/public_input.rs @@ -32,7 +32,7 @@ impl, const D: usize> Gate for PublicInputGat "PublicInputGate".into() } - fn serialize(&self, _dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { Ok(()) } diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index e0aae2a7..38ba5a47 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -122,7 +122,7 @@ impl, const D: usize> Gate for RandomAccessGa format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.bits)?; dst.write_usize(self.num_copies)?; dst.write_usize(self.num_extra_constants)?; @@ -394,10 +394,10 @@ impl, const D: usize> SimpleGenerator } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.copy)?; - self.gate.serialize(dst) + self.gate.serialize(dst, _cd) } fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index b72bcc42..e0587f02 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -61,7 +61,7 @@ impl, const D: usize> Gate for ReducingGate) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_coeffs)?; Ok(()) } @@ -226,9 +226,9 @@ impl, const D: usize> SimpleGenerator for Red out_buffer.set_extension_target(output, acc); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - as Gate>::serialize(&self.gate, dst) + as Gate>::serialize(&self.gate, dst, _cd) } fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 021188ea..2c4e5aa6 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -64,7 +64,7 @@ impl, const D: usize> Gate for ReducingExtens format!("{self:?}") } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_coeffs)?; Ok(()) } @@ -220,9 +220,9 @@ impl, const D: usize> SimpleGenerator for Red } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - as Gate>::serialize(&self.gate, dst) + as Gate>::serialize(&self.gate, dst, _cd) } fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { diff --git a/plonky2/src/iop/generator.rs b/plonky2/src/iop/generator.rs index 30cfdad2..a0cd8e76 100644 --- a/plonky2/src/iop/generator.rs +++ b/plonky2/src/iop/generator.rs @@ -112,7 +112,7 @@ pub trait WitnessGenerator, const D: usize>: /// run next time a target in its watch list is populated. fn run(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) -> bool; - fn serialize(&self, dst: &mut Vec) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where @@ -213,7 +213,7 @@ pub trait SimpleGenerator, const D: usize>: } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult where @@ -250,8 +250,8 @@ impl, SG: SimpleGenerator, const D: usize> Wi } } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { - self.inner.serialize(dst) + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { + self.inner.serialize(dst, cd) } fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { @@ -283,7 +283,7 @@ impl, const D: usize> SimpleGenerator for Cop out_buffer.set_target(self.dst, value); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.src)?; dst.write_target(self.dst) } @@ -315,7 +315,7 @@ impl, const D: usize> SimpleGenerator for Ran out_buffer.set_target(self.target, random_value); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.target) } @@ -353,7 +353,7 @@ impl, const D: usize> SimpleGenerator for Non out_buffer.set_target(self.dummy, dummy_value); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.to_test)?; dst.write_target(self.dummy) } @@ -393,7 +393,7 @@ impl, const D: usize> SimpleGenerator for Con out_buffer.set_target(Target::wire(self.row, self.wire_index), self.constant); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.constant_index)?; dst.write_usize(self.wire_index)?; diff --git a/plonky2/src/recursion/dummy_circuit.rs b/plonky2/src/recursion/dummy_circuit.rs index aa1eb3c4..897abb75 100644 --- a/plonky2/src/recursion/dummy_circuit.rs +++ b/plonky2/src/recursion/dummy_circuit.rs @@ -234,7 +234,7 @@ where out_buffer.set_verifier_data_target(&self.verifier_data_target, &self.verifier_data); } - fn serialize(&self, dst: &mut Vec) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { dst.write_target_proof_with_public_inputs(&self.proof_with_pis_target)?; dst.write_proof_with_public_inputs(&self.proof_with_pis)?; dst.write_target_verifier_circuit(&self.verifier_data_target)?; diff --git a/plonky2/src/util/serialization/gate_serialization.rs b/plonky2/src/util/serialization/gate_serialization.rs index 3313937f..2ed43990 100644 --- a/plonky2/src/util/serialization/gate_serialization.rs +++ b/plonky2/src/util/serialization/gate_serialization.rs @@ -6,12 +6,13 @@ use crate::plonk::circuit_data::CommonCircuitData; use crate::util::serialization::{Buffer, IoResult}; pub trait GateSerializer, const D: usize> { - fn read_gate( + fn read_gate(&self, buf: &mut Buffer, cd: &CommonCircuitData) -> IoResult>; + fn write_gate( &self, - buf: &mut Buffer, - common: &CommonCircuitData, - ) -> IoResult>; - fn write_gate(&self, buf: &mut Vec, gate: &GateRef) -> IoResult<()>; + buf: &mut Vec, + gate: &GateRef, + cd: &CommonCircuitData, + ) -> IoResult<()>; } #[macro_export] @@ -61,11 +62,16 @@ macro_rules! impl_gate_serializer { read_gate_impl!(buf, tag, common, $($gate_types),+) } - fn write_gate(&self, buf: &mut Vec, gate: &$crate::gates::gate::GateRef) -> $crate::util::serialization::IoResult<()> { + fn write_gate( + &self, + buf: &mut Vec, + gate: &$crate::gates::gate::GateRef, + common: &$crate::plonk::circuit_data::CommonCircuitData, + ) -> $crate::util::serialization::IoResult<()> { let tag = get_gate_tag_impl!(gate, $($gate_types),+)?; $crate::util::serialization::Write::write_u32(buf, tag)?; - gate.0.serialize(buf)?; + gate.0.serialize(buf, common)?; Ok(()) } }; diff --git a/plonky2/src/util/serialization/generator_serialization.rs b/plonky2/src/util/serialization/generator_serialization.rs index fb9357b8..a7377de8 100644 --- a/plonky2/src/util/serialization/generator_serialization.rs +++ b/plonky2/src/util/serialization/generator_serialization.rs @@ -18,6 +18,7 @@ pub trait WitnessGeneratorSerializer, const D: usiz &self, buf: &mut Vec, generator: &WitnessGeneratorRef, + cd: &CommonCircuitData, ) -> IoResult<()>; } @@ -60,10 +61,6 @@ macro_rules! get_generator_tag_impl { /// To serialize a list of generators used for a circuit, /// this macro should be called with a struct on which to implement /// this as first argument, followed by all the targeted generators. -/// -/// ***NOTE:*** If you need to include `DummyProofGenerator`, you **MUST** -/// place it at the *beginning* of the generators list, right after -/// the serializer struct. macro_rules! impl_generator_serializer { ($target:ty, $($generator_types:ty),+) => { fn read_generator( @@ -79,11 +76,12 @@ macro_rules! impl_generator_serializer { &self, buf: &mut Vec, generator: &$crate::iop::generator::WitnessGeneratorRef, + common: &$crate::plonk::circuit_data::CommonCircuitData, ) -> $crate::util::serialization::IoResult<()> { let tag = get_generator_tag_impl!(generator, $($generator_types),+)?; $crate::util::serialization::Write::write_u32(buf, tag)?; - generator.0.serialize(buf)?; + generator.0.serialize(buf, common)?; Ok(()) } }; @@ -132,13 +130,13 @@ pub mod default { { impl_generator_serializer! { DefaultGeneratorSerializer, - DummyProofGenerator, ArithmeticBaseGenerator, ArithmeticExtensionGenerator, BaseSplitGenerator<2>, BaseSumGenerator<2>, ConstantGenerator, CopyGenerator, + DummyProofGenerator, EqualityGenerator, ExponentiationGenerator, InterpolationGenerator, diff --git a/plonky2/src/util/serialization/mod.rs b/plonky2/src/util/serialization/mod.rs index 875929fa..79c11c40 100644 --- a/plonky2/src/util/serialization/mod.rs +++ b/plonky2/src/util/serialization/mod.rs @@ -1697,12 +1697,14 @@ pub trait Write { &mut self, gate: &GateRef, gate_serializer: &dyn GateSerializer, + common_data: &CommonCircuitData, ) -> IoResult<()>; fn write_generator, const D: usize>( &mut self, generator: &WitnessGeneratorRef, generator_serializer: &dyn WitnessGeneratorSerializer, + common_data: &CommonCircuitData, ) -> IoResult<()>; fn write_selectors_info(&mut self, selectors_info: &SelectorsInfo) -> IoResult<()> { @@ -1785,7 +1787,7 @@ pub trait Write { self.write_usize(gates.len())?; for gate in gates.iter() { - self.write_gate::(gate, gate_serializer)?; + self.write_gate::(gate, gate_serializer, common_data)?; } Ok(()) @@ -1802,7 +1804,11 @@ pub trait Write { generator_serializer: &dyn WitnessGeneratorSerializer, ) -> IoResult<()> { self.write_common_circuit_data(&circuit_data.common, gate_serializer)?; - self.write_prover_only_circuit_data(&circuit_data.prover_only, generator_serializer)?; + self.write_prover_only_circuit_data( + &circuit_data.prover_only, + generator_serializer, + &circuit_data.common, + )?; self.write_verifier_only_circuit_data(&circuit_data.verifier_only) } @@ -1814,6 +1820,7 @@ pub trait Write { &mut self, prover_only_circuit_data: &ProverOnlyCircuitData, generator_serializer: &dyn WitnessGeneratorSerializer, + common_data: &CommonCircuitData, ) -> IoResult<()> { let ProverOnlyCircuitData { generators, @@ -1831,7 +1838,7 @@ pub trait Write { self.write_usize(generators.len())?; for generator in generators.iter() { - self.write_generator::(generator, generator_serializer)?; + self.write_generator::(generator, generator_serializer, common_data)?; } self.write_usize(generator_indices_by_watches.len())?; @@ -1891,7 +1898,11 @@ pub trait Write { generator_serializer: &dyn WitnessGeneratorSerializer, ) -> IoResult<()> { self.write_common_circuit_data(&prover_circuit_data.common, gate_serializer)?; - self.write_prover_only_circuit_data(&prover_circuit_data.prover_only, generator_serializer) + self.write_prover_only_circuit_data( + &prover_circuit_data.prover_only, + generator_serializer, + &prover_circuit_data.common, + ) } fn write_verifier_only_circuit_data< @@ -2118,16 +2129,18 @@ impl Write for Vec { &mut self, gate: &GateRef, gate_serializer: &dyn GateSerializer, + common_data: &CommonCircuitData, ) -> IoResult<()> { - gate_serializer.write_gate(self, gate) + gate_serializer.write_gate(self, gate, common_data) } fn write_generator, const D: usize>( &mut self, generator: &WitnessGeneratorRef, generator_serializer: &dyn WitnessGeneratorSerializer, + common_data: &CommonCircuitData, ) -> IoResult<()> { - generator_serializer.write_generator(self, generator) + generator_serializer.write_generator(self, generator, common_data) } } From c80201261d968699ab6c0ca83416565415b818f8 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 08:48:32 -0400 Subject: [PATCH 5/9] Provide methods for ProverOnlyCircuitData serialization --- plonky2/src/plonk/circuit_data.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/plonky2/src/plonk/circuit_data.rs b/plonky2/src/plonk/circuit_data.rs index edf28ba5..6e4e0638 100644 --- a/plonky2/src/plonk/circuit_data.rs +++ b/plonky2/src/plonk/circuit_data.rs @@ -321,6 +321,29 @@ pub struct ProverOnlyCircuitData< pub lut_to_lookups: Vec, } +impl, C: GenericConfig, const D: usize> + ProverOnlyCircuitData +{ + pub fn to_bytes( + &self, + generator_serializer: &dyn WitnessGeneratorSerializer, + common_data: &CommonCircuitData, + ) -> IoResult> { + let mut buffer = Vec::new(); + buffer.write_prover_only_circuit_data(self, generator_serializer, common_data)?; + Ok(buffer) + } + + pub fn from_bytes( + bytes: &[u8], + generator_serializer: &dyn WitnessGeneratorSerializer, + common_data: &CommonCircuitData, + ) -> IoResult { + let mut buffer = Buffer::new(bytes); + buffer.read_prover_only_circuit_data(generator_serializer, common_data) + } +} + /// Circuit data required by the verifier, but not the prover. #[derive(Debug, Clone, Eq, PartialEq, Serialize)] pub struct VerifierOnlyCircuitData, const D: usize> { From b32345cd520768129a37d0df92feb6694b1aac29 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Wed, 28 Jun 2023 08:54:54 -0400 Subject: [PATCH 6/9] Update lookup serialization --- plonky2/src/gates/lookup.rs | 35 +++++++++++++++++++----------- plonky2/src/gates/lookup_table.rs | 36 ++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 5b27abf8..36dab8bf 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -1,6 +1,5 @@ use alloc::format; use alloc::string::String; -use alloc::sync::Arc; use alloc::vec::Vec; use core::usize; @@ -60,18 +59,24 @@ impl, const D: usize> Gate for LookupGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; - dst.write_lut(&self.lut) + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; - let lut = src.read_lut()?; + let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), }) } @@ -184,20 +189,26 @@ impl, const D: usize> SimpleGenerator for Loo out_buffer.set_target(out_wire, output_val); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - dst.write_lut(&self.lut)?; - dst.write_usize(self.slot_nb) + dst.write_usize(self.slot_nb)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let lut = src.read_lut()?; let slot_nb = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { row, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), slot_nb, }) } diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index e80e1898..99b8f8e1 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -72,20 +72,26 @@ impl, const D: usize> Gate for LookupTableGat format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; - dst.write_lut(&self.lut)?; - dst.write_usize(self.last_lut_row) + dst.write_usize(self.last_lut_row)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; - let lut = src.read_lut()?; let last_lut_row = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), last_lut_row, }) } @@ -202,24 +208,30 @@ impl, const D: usize> SimpleGenerator for Loo } } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - dst.write_lut(&self.lut)?; dst.write_usize(self.slot_nb)?; dst.write_usize(self.num_slots)?; - dst.write_usize(self.last_lut_row) + dst.write_usize(self.last_lut_row)?; + for (i, lut) in cd.luts.iter().enumerate() { + if lut == &self.lut { + return dst.write_usize(i); + } + } + + panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let lut = src.read_lut()?; let slot_nb = src.read_usize()?; let num_slots = src.read_usize()?; let last_lut_row = src.read_usize()?; + let lut_index = src.read_usize()?; Ok(Self { row, - lut: Arc::new(lut), + lut: cd.luts[lut_index].clone(), slot_nb, num_slots, last_lut_row, From cbb3da15c9200060d4b946e171d555cc53cad9e9 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 6 Jul 2023 11:19:35 -0400 Subject: [PATCH 7/9] Reduce number of lookup accesses --- plonky2/src/gates/lookup.rs | 34 +++++++++++++++-------------- plonky2/src/gates/lookup_table.rs | 11 +++------- plonky2/src/plonk/prover.rs | 7 +++--- plonky2/src/plonk/vanishing_poly.rs | 20 ++++++----------- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 36dab8bf..5c751989 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -170,23 +170,25 @@ impl, const D: usize> SimpleGenerator for Loo let get_wire = |wire: usize| -> F { witness.get_target(Target::wire(self.row, wire)) }; let input_val = get_wire(LookupGate::wire_ith_looking_inp(self.slot_nb)); - let output_val = if input_val - == F::from_canonical_u16(self.lut[input_val.to_canonical_u64() as usize].0) - { - F::from_canonical_u16(self.lut[input_val.to_canonical_u64() as usize].1) - } else { - let mut cur_idx = 0; - while input_val != F::from_canonical_u16(self.lut[cur_idx].0) - && cur_idx < self.lut.len() - { - cur_idx += 1; - } - assert!(cur_idx < self.lut.len(), "Incorrect input value provided"); - F::from_canonical_u16(self.lut[cur_idx].1) - }; + let (input, output) = self.lut[input_val.to_canonical_u64() as usize]; + if input_val == F::from_canonical_u16(input) { + let output_val = F::from_canonical_u16(output); - let out_wire = Target::wire(self.row, LookupGate::wire_ith_looking_out(self.slot_nb)); - out_buffer.set_target(out_wire, output_val); + let out_wire = Target::wire(self.row, LookupGate::wire_ith_looking_out(self.slot_nb)); + out_buffer.set_target(out_wire, output_val); + } else { + for (input, output) in self.lut.iter() { + if input_val == F::from_canonical_u16(*input) { + let output_val = F::from_canonical_u16(*output); + + let out_wire = + Target::wire(self.row, LookupGate::wire_ith_looking_out(self.slot_nb)); + out_buffer.set_target(out_wire, output_val); + return; + } + } + panic!("Incorrect input value provided"); + }; } fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 99b8f8e1..99109f04 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -193,14 +193,9 @@ impl, const D: usize> SimpleGenerator for Loo Target::wire(self.row, LookupTableGate::wire_ith_looked_out(self.slot_nb)); if slot < self.lut.len() { - out_buffer.set_target( - slot_input_target, - F::from_canonical_usize(self.lut[slot].0 as usize), - ); - out_buffer.set_target( - slot_output_target, - F::from_canonical_usize(self.lut[slot].1.into()), - ); + let (input, output) = self.lut[slot]; + out_buffer.set_target(slot_input_target, F::from_canonical_usize(input as usize)); + out_buffer.set_target(slot_output_target, F::from_canonical_usize(output as usize)); } else { // Pad with zeros. out_buffer.set_target(slot_input_target, F::ZERO); diff --git a/plonky2/src/plonk/prover.rs b/plonky2/src/plonk/prover.rs index df2249df..8c70a19a 100644 --- a/plonky2/src/plonk/prover.rs +++ b/plonky2/src/plonk/prover.rs @@ -71,15 +71,14 @@ pub fn set_lookup_wires< let remaining_slots = (num_entries - (prover_data.lut_to_lookups[lut_index].len() % num_entries)) % num_entries; - let first_inp_value = F::from_canonical_u16(common_data.luts[lut_index][0].0); - let first_out_value = F::from_canonical_u16(common_data.luts[lut_index][0].1); + let (first_inp_value, first_out_value) = common_data.luts[lut_index][0]; for slot in (num_entries - remaining_slots)..num_entries { let inp_target = Target::wire(last_lut_gate - 1, LookupGate::wire_ith_looking_inp(slot)); let out_target = Target::wire(last_lut_gate - 1, LookupGate::wire_ith_looking_out(slot)); - pw.set_target(inp_target, first_inp_value); - pw.set_target(out_target, first_out_value); + pw.set_target(inp_target, F::from_canonical_u16(first_inp_value)); + pw.set_target(out_target, F::from_canonical_u16(first_out_value)); multiplicities[0] += 1; } diff --git a/plonky2/src/plonk/vanishing_poly.rs b/plonky2/src/plonk/vanishing_poly.rs index adc76654..a56b4b7e 100644 --- a/plonky2/src/plonk/vanishing_poly.rs +++ b/plonky2/src/plonk/vanishing_poly.rs @@ -37,11 +37,8 @@ pub(crate) fn get_lut_poly, const D: usize>( let b = deltas[LookupChallenges::ChallengeB as usize]; let mut coeffs = Vec::new(); let n = common_data.luts[lut_index].len(); - for i in 0..n { - coeffs.push( - F::from_canonical_u16(common_data.luts[lut_index][i].0) - + b * F::from_canonical_u16(common_data.luts[lut_index][i].1), - ); + for (input, output) in common_data.luts[lut_index].iter() { + coeffs.push(F::from_canonical_u16(*input) + b * F::from_canonical_u16(*output)); } coeffs.append(&mut vec![F::ZERO; degree - n]); coeffs.reverse(); @@ -767,14 +764,11 @@ pub(crate) fn get_lut_poly_circuit, const D: usize> let b = deltas[LookupChallenges::ChallengeB as usize]; let delta = deltas[LookupChallenges::ChallengeDelta as usize]; let n = common_data.luts[lut_index].len(); - let mut coeffs: Vec = (0..n) - .map(|i| { - let temp = - builder.mul_const(F::from_canonical_u16(common_data.luts[lut_index][i].1), b); - builder.add_const( - temp, - F::from_canonical_u16(common_data.luts[lut_index][i].0), - ) + let mut coeffs: Vec = common_data.luts[lut_index] + .iter() + .map(|(input, output)| { + let temp = builder.mul_const(F::from_canonical_u16(*output), b); + builder.add_const(temp, F::from_canonical_u16(*input)) }) .collect(); for _ in n..degree { From 8b35fefb3b74a254c9ca611c741c1ffea7f4af65 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Thu, 13 Jul 2023 19:34:32 -0400 Subject: [PATCH 8/9] Rename cd to common_data for consistency Cf review --- plonky2/examples/bench_recursion.rs | 34 ++--- plonky2/examples/square_root.rs | 4 +- plonky2/src/gadgets/arithmetic.rs | 4 +- plonky2/src/gadgets/arithmetic_extension.rs | 4 +- plonky2/src/gadgets/range_check.rs | 4 +- plonky2/src/gadgets/split_base.rs | 4 +- plonky2/src/gadgets/split_join.rs | 8 +- plonky2/src/gates/arithmetic_base.rs | 8 +- plonky2/src/gates/arithmetic_extension.rs | 8 +- plonky2/src/gates/base_sum.rs | 8 +- plonky2/src/gates/constant.rs | 4 +- plonky2/src/gates/coset_interpolation.rs | 12 +- plonky2/src/gates/exponentiation.rs | 12 +- plonky2/src/gates/gate.rs | 4 +- plonky2/src/gates/lookup.rs | 16 +-- plonky2/src/gates/lookup_table.rs | 16 +-- plonky2/src/gates/multiplication_extension.rs | 8 +- plonky2/src/gates/noop.rs | 8 +- plonky2/src/gates/poseidon.rs | 12 +- plonky2/src/gates/poseidon_mds.rs | 12 +- plonky2/src/gates/public_input.rs | 8 +- plonky2/src/gates/random_access.rs | 12 +- plonky2/src/gates/reducing.rs | 12 +- plonky2/src/gates/reducing_extension.rs | 12 +- plonky2/src/iop/generator.rs | 32 ++--- plonky2/src/recursion/dummy_circuit.rs | 6 +- plonky2/src/recursion/recursive_verifier.rs | 119 ++++++++++-------- .../util/serialization/gate_serialization.rs | 8 +- .../serialization/generator_serialization.rs | 4 +- plonky2/src/util/serialization/mod.rs | 12 +- 30 files changed, 228 insertions(+), 187 deletions(-) diff --git a/plonky2/examples/bench_recursion.rs b/plonky2/examples/bench_recursion.rs index ce94fca7..d0c273d1 100644 --- a/plonky2/examples/bench_recursion.rs +++ b/plonky2/examples/bench_recursion.rs @@ -248,18 +248,18 @@ where fn test_serialization, C: GenericConfig, const D: usize>( proof: &ProofWithPublicInputs, vd: &VerifierOnlyCircuitData, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> Result<()> { let proof_bytes = proof.to_bytes(); info!("Proof length: {} bytes", proof_bytes.len()); - let proof_from_bytes = ProofWithPublicInputs::from_bytes(proof_bytes, cd)?; + let proof_from_bytes = ProofWithPublicInputs::from_bytes(proof_bytes, common_data)?; assert_eq!(proof, &proof_from_bytes); let now = std::time::Instant::now(); - let compressed_proof = proof.clone().compress(&vd.circuit_digest, cd)?; + let compressed_proof = proof.clone().compress(&vd.circuit_digest, common_data)?; let decompressed_compressed_proof = compressed_proof .clone() - .decompress(&vd.circuit_digest, cd)?; + .decompress(&vd.circuit_digest, common_data)?; info!("{:.4}s to compress proof", now.elapsed().as_secs_f64()); assert_eq!(proof, &decompressed_compressed_proof); @@ -269,11 +269,11 @@ fn test_serialization, C: GenericConfig, compressed_proof_bytes.len() ); let compressed_proof_from_bytes = - CompressedProofWithPublicInputs::from_bytes(compressed_proof_bytes, cd)?; + CompressedProofWithPublicInputs::from_bytes(compressed_proof_bytes, common_data)?; assert_eq!(compressed_proof, compressed_proof_from_bytes); let gate_serializer = DefaultGateSerializer; - let common_data_bytes = cd + let common_data_bytes = common_data .to_bytes(&gate_serializer) .map_err(|_| anyhow::Error::msg("CommonCircuitData serialization failed."))?; info!( @@ -283,7 +283,7 @@ fn test_serialization, C: GenericConfig, let common_data_from_bytes = CommonCircuitData::::from_bytes(common_data_bytes, &gate_serializer) .map_err(|_| anyhow::Error::msg("CommonCircuitData deserialization failed."))?; - assert_eq!(cd, &common_data_from_bytes); + assert_eq!(common_data, &common_data_from_bytes); Ok(()) } @@ -312,35 +312,35 @@ pub fn benchmark_function( }; // Start with a dummy proof of specified size let inner = dummy_proof_function(config, log2_inner_size)?; - let (_, _, cd) = &inner; + let (_, _, common_data) = &inner; info!( "Initial {} degree {} = 2^{}", name, - cd.degree(), - cd.degree_bits() + common_data.degree(), + common_data.degree_bits() ); // Recursively verify the proof let middle = recursive_proof::(&inner, config, None)?; - let (_, _, cd) = &middle; + let (_, _, common_data) = &middle; info!( "Single recursion {} degree {} = 2^{}", name, - cd.degree(), - cd.degree_bits() + common_data.degree(), + common_data.degree_bits() ); // Add a second layer of recursion to shrink the proof size further let outer = recursive_proof::(&middle, config, None)?; - let (proof, vd, cd) = &outer; + let (proof, vd, common_data) = &outer; info!( "Double recursion {} degree {} = 2^{}", name, - cd.degree(), - cd.degree_bits() + common_data.degree(), + common_data.degree_bits() ); - test_serialization(proof, vd, cd)?; + test_serialization(proof, vd, common_data)?; Ok(()) } diff --git a/plonky2/examples/square_root.rs b/plonky2/examples/square_root.rs index 48883e3f..40c2e1fc 100644 --- a/plonky2/examples/square_root.rs +++ b/plonky2/examples/square_root.rs @@ -52,12 +52,12 @@ impl, const D: usize> SimpleGenerator out_buffer.set_target(self.x, x); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.x)?; dst.write_target(self.x_squared) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let x = src.read_target()?; let x_squared = src.read_target()?; Ok(Self { diff --git a/plonky2/src/gadgets/arithmetic.rs b/plonky2/src/gadgets/arithmetic.rs index d245aef5..858a4eaf 100644 --- a/plonky2/src/gadgets/arithmetic.rs +++ b/plonky2/src/gadgets/arithmetic.rs @@ -399,14 +399,14 @@ impl, const D: usize> SimpleGenerator for Equ out_buffer.set_target(self.inv, inv); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.x)?; dst.write_target(self.y)?; dst.write_target_bool(self.equal)?; dst.write_target(self.inv) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let x = src.read_target()?; let y = src.read_target()?; let equal = src.read_target_bool()?; diff --git a/plonky2/src/gadgets/arithmetic_extension.rs b/plonky2/src/gadgets/arithmetic_extension.rs index 11e3cc83..0fe8083a 100644 --- a/plonky2/src/gadgets/arithmetic_extension.rs +++ b/plonky2/src/gadgets/arithmetic_extension.rs @@ -522,13 +522,13 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(self.quotient, quotient) } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target_ext(self.numerator)?; dst.write_target_ext(self.denominator)?; dst.write_target_ext(self.quotient) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let numerator = src.read_target_ext()?; let denominator = src.read_target_ext()?; let quotient = src.read_target_ext()?; diff --git a/plonky2/src/gadgets/range_check.rs b/plonky2/src/gadgets/range_check.rs index c7bfc6a5..bdb35f9e 100644 --- a/plonky2/src/gadgets/range_check.rs +++ b/plonky2/src/gadgets/range_check.rs @@ -79,14 +79,14 @@ impl, const D: usize> SimpleGenerator for Low out_buffer.set_target(self.high, F::from_canonical_u64(high)); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_usize(self.n_log)?; dst.write_target(self.low)?; dst.write_target(self.high) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let n_log = src.read_usize()?; let low = src.read_target()?; diff --git a/plonky2/src/gadgets/split_base.rs b/plonky2/src/gadgets/split_base.rs index c300723e..0a39b8f0 100644 --- a/plonky2/src/gadgets/split_base.rs +++ b/plonky2/src/gadgets/split_base.rs @@ -110,12 +110,12 @@ impl, const B: usize, const D: usize> SimpleGenerat out_buffer.set_target(Target::wire(self.row, BaseSumGate::::WIRE_SUM), sum); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_target_bool_vec(&self.limbs) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let limbs = src.read_target_bool_vec()?; Ok(Self { row, limbs }) diff --git a/plonky2/src/gadgets/split_join.rs b/plonky2/src/gadgets/split_join.rs index b8daeec8..fb83c3a6 100644 --- a/plonky2/src/gadgets/split_join.rs +++ b/plonky2/src/gadgets/split_join.rs @@ -87,12 +87,12 @@ impl, const D: usize> SimpleGenerator for Spl ); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_target_vec(&self.bits) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let bits = src.read_target_vec()?; Ok(Self { integer, bits }) @@ -142,13 +142,13 @@ impl, const D: usize> SimpleGenerator for Wir ); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.integer)?; dst.write_usize_vec(&self.gates)?; dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let integer = src.read_target()?; let gates = src.read_usize_vec()?; let num_limbs = src.read_usize()?; diff --git a/plonky2/src/gates/arithmetic_base.rs b/plonky2/src/gates/arithmetic_base.rs index dae84fb1..cf111a71 100644 --- a/plonky2/src/gates/arithmetic_base.rs +++ b/plonky2/src/gates/arithmetic_base.rs @@ -60,11 +60,11 @@ impl, const D: usize> Gate for ArithmeticGate format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } @@ -221,14 +221,14 @@ impl, const D: usize> SimpleGenerator out_buffer.set_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_field(self.const_1)?; dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let const_1 = src.read_field()?; diff --git a/plonky2/src/gates/arithmetic_extension.rs b/plonky2/src/gates/arithmetic_extension.rs index bd21b22c..82ca8a56 100644 --- a/plonky2/src/gates/arithmetic_extension.rs +++ b/plonky2/src/gates/arithmetic_extension.rs @@ -56,11 +56,11 @@ impl, const D: usize> Gate for ArithmeticExte format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } @@ -214,14 +214,14 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_field(self.const_1)?; dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let const_1 = src.read_field()?; diff --git a/plonky2/src/gates/base_sum.rs b/plonky2/src/gates/base_sum.rs index 5d999e92..181252a2 100644 --- a/plonky2/src/gates/base_sum.rs +++ b/plonky2/src/gates/base_sum.rs @@ -55,11 +55,11 @@ impl, const D: usize, const B: usize> Gate fo format!("{self:?} + Base: {B}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_limbs = src.read_usize()?; Ok(Self { num_limbs }) } @@ -211,12 +211,12 @@ impl, const B: usize, const D: usize> SimpleGenerat } } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.num_limbs) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let num_limbs = src.read_usize()?; Ok(Self { row, num_limbs }) diff --git a/plonky2/src/gates/constant.rs b/plonky2/src/gates/constant.rs index 4a41ab9f..067855ca 100644 --- a/plonky2/src/gates/constant.rs +++ b/plonky2/src/gates/constant.rs @@ -43,11 +43,11 @@ impl, const D: usize> Gate for ConstantGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_consts) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_consts = src.read_usize()?; Ok(Self { num_consts }) } diff --git a/plonky2/src/gates/coset_interpolation.rs b/plonky2/src/gates/coset_interpolation.rs index ea0b00e3..c701b8cf 100644 --- a/plonky2/src/gates/coset_interpolation.rs +++ b/plonky2/src/gates/coset_interpolation.rs @@ -169,14 +169,14 @@ impl, const D: usize> Gate for CosetInterpola format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.subgroup_bits)?; dst.write_usize(self.degree)?; dst.write_usize(self.barycentric_weights.len())?; dst.write_field_vec(&self.barycentric_weights) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let subgroup_bits = src.read_usize()?; let degree = src.read_usize()?; let length = src.read_usize()?; @@ -497,14 +497,14 @@ impl, const D: usize> SimpleGenerator out_buffer.set_ext_wires(evaluation_value_wires, computed_eval); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - self.gate.serialize(dst, _cd) + self.gate.serialize(dst, _common_data) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = CosetInterpolationGate::deserialize(src, _cd)?; + let gate = CosetInterpolationGate::deserialize(src, _common_data)?; Ok(Self::new(row, gate)) } } diff --git a/plonky2/src/gates/exponentiation.rs b/plonky2/src/gates/exponentiation.rs index 38053e65..a8629a84 100644 --- a/plonky2/src/gates/exponentiation.rs +++ b/plonky2/src/gates/exponentiation.rs @@ -76,11 +76,11 @@ impl, const D: usize> Gate for Exponentiation format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_power_bits) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_power_bits = src.read_usize()?; Ok(Self::new(num_power_bits)) } @@ -295,14 +295,14 @@ impl, const D: usize> SimpleGenerator out_buffer.set_wire(output_wire, intermediate_values[num_power_bits - 1]); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - self.gate.serialize(dst, _cd) + self.gate.serialize(dst, _common_data) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = ExponentiationGate::deserialize(src, _cd)?; + let gate = ExponentiationGate::deserialize(src, _common_data)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/gates/gate.rs b/plonky2/src/gates/gate.rs index 6783c38f..2c52076b 100644 --- a/plonky2/src/gates/gate.rs +++ b/plonky2/src/gates/gate.rs @@ -29,9 +29,9 @@ use crate::util::serialization::{Buffer, IoResult}; pub trait Gate, const D: usize>: 'static + Send + Sync { fn id(&self) -> String; - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()>; - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult where Self: Sized; diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 5c751989..03cddbf7 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -59,9 +59,9 @@ impl, const D: usize> Gate for LookupGate { format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; - for (i, lut) in cd.luts.iter().enumerate() { + for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { return dst.write_usize(i); } @@ -70,13 +70,13 @@ impl, const D: usize> Gate for LookupGate { panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: cd.luts[lut_index].clone(), + lut: common_data.luts[lut_index].clone(), }) } @@ -191,10 +191,10 @@ impl, const D: usize> SimpleGenerator for Loo }; } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.slot_nb)?; - for (i, lut) in cd.luts.iter().enumerate() { + for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { return dst.write_usize(i); } @@ -203,14 +203,14 @@ impl, const D: usize> SimpleGenerator for Loo panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let slot_nb = src.read_usize()?; let lut_index = src.read_usize()?; Ok(Self { row, - lut: cd.luts[lut_index].clone(), + lut: common_data.luts[lut_index].clone(), slot_nb, }) } diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 99109f04..39ef1953 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -72,10 +72,10 @@ impl, const D: usize> Gate for LookupTableGat format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; dst.write_usize(self.last_lut_row)?; - for (i, lut) in cd.luts.iter().enumerate() { + for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { return dst.write_usize(i); } @@ -84,14 +84,14 @@ impl, const D: usize> Gate for LookupTableGat panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; let last_lut_row = src.read_usize()?; let lut_index = src.read_usize()?; Ok(Self { num_slots, - lut: cd.luts[lut_index].clone(), + lut: common_data.luts[lut_index].clone(), last_lut_row, }) } @@ -203,12 +203,12 @@ impl, const D: usize> SimpleGenerator for Loo } } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.slot_nb)?; dst.write_usize(self.num_slots)?; dst.write_usize(self.last_lut_row)?; - for (i, lut) in cd.luts.iter().enumerate() { + for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { return dst.write_usize(i); } @@ -217,7 +217,7 @@ impl, const D: usize> SimpleGenerator for Loo panic!("The associated lookup table couldn't be found.") } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let slot_nb = src.read_usize()?; let num_slots = src.read_usize()?; @@ -226,7 +226,7 @@ impl, const D: usize> SimpleGenerator for Loo Ok(Self { row, - lut: cd.luts[lut_index].clone(), + lut: common_data.luts[lut_index].clone(), slot_nb, num_slots, last_lut_row, diff --git a/plonky2/src/gates/multiplication_extension.rs b/plonky2/src/gates/multiplication_extension.rs index ed330e85..6799bd37 100644 --- a/plonky2/src/gates/multiplication_extension.rs +++ b/plonky2/src/gates/multiplication_extension.rs @@ -53,11 +53,11 @@ impl, const D: usize> Gate for MulExtensionGa format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_ops) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let num_ops = src.read_usize()?; Ok(Self { num_ops }) } @@ -191,13 +191,13 @@ impl, const D: usize> SimpleGenerator out_buffer.set_extension_target(output_target, computed_output) } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_field(self.const_0)?; dst.write_usize(self.i) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let const_0 = src.read_field()?; let i = src.read_usize()?; diff --git a/plonky2/src/gates/noop.rs b/plonky2/src/gates/noop.rs index f1baae52..8752f380 100644 --- a/plonky2/src/gates/noop.rs +++ b/plonky2/src/gates/noop.rs @@ -19,11 +19,15 @@ impl, const D: usize> Gate for NoopGate { "NoopGate".into() } - fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize( + &self, + _dst: &mut Vec, + _common_data: &CommonCircuitData, + ) -> IoResult<()> { Ok(()) } - fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(_src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { Ok(Self) } diff --git a/plonky2/src/gates/poseidon.rs b/plonky2/src/gates/poseidon.rs index 0f68ea99..f6d06572 100644 --- a/plonky2/src/gates/poseidon.rs +++ b/plonky2/src/gates/poseidon.rs @@ -100,11 +100,15 @@ impl, const D: usize> Gate for PoseidonGate") } - fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize( + &self, + _dst: &mut Vec, + _common_data: &CommonCircuitData, + ) -> IoResult<()> { Ok(()) } - fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(_src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { Ok(PoseidonGate::new()) } @@ -513,11 +517,11 @@ impl + Poseidon, const D: usize> SimpleGenerator, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; Ok(Self { row, diff --git a/plonky2/src/gates/poseidon_mds.rs b/plonky2/src/gates/poseidon_mds.rs index 59bbf48b..8e2f4a76 100644 --- a/plonky2/src/gates/poseidon_mds.rs +++ b/plonky2/src/gates/poseidon_mds.rs @@ -119,11 +119,15 @@ impl + Poseidon, const D: usize> Gate for Pos format!("{self:?}") } - fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize( + &self, + _dst: &mut Vec, + _common_data: &CommonCircuitData, + ) -> IoResult<()> { Ok(()) } - fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(_src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { Ok(PoseidonMdsGate::new()) } @@ -251,11 +255,11 @@ impl + Poseidon, const D: usize> SimpleGenerator, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; Ok(Self { row }) } diff --git a/plonky2/src/gates/public_input.rs b/plonky2/src/gates/public_input.rs index 1d081819..f770e2e6 100644 --- a/plonky2/src/gates/public_input.rs +++ b/plonky2/src/gates/public_input.rs @@ -32,11 +32,15 @@ impl, const D: usize> Gate for PublicInputGat "PublicInputGate".into() } - fn serialize(&self, _dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize( + &self, + _dst: &mut Vec, + _common_data: &CommonCircuitData, + ) -> IoResult<()> { Ok(()) } - fn deserialize(_src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(_src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { Ok(Self) } diff --git a/plonky2/src/gates/random_access.rs b/plonky2/src/gates/random_access.rs index 38ba5a47..9110a59b 100644 --- a/plonky2/src/gates/random_access.rs +++ b/plonky2/src/gates/random_access.rs @@ -122,14 +122,14 @@ impl, const D: usize> Gate for RandomAccessGa format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.bits)?; dst.write_usize(self.num_copies)?; dst.write_usize(self.num_extra_constants)?; Ok(()) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let bits = src.read_usize()?; let num_copies = src.read_usize()?; let num_extra_constants = src.read_usize()?; @@ -394,16 +394,16 @@ impl, const D: usize> SimpleGenerator } } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.copy)?; - self.gate.serialize(dst, _cd) + self.gate.serialize(dst, _common_data) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let copy = src.read_usize()?; - let gate = RandomAccessGate::::deserialize(src, _cd)?; + let gate = RandomAccessGate::::deserialize(src, _common_data)?; Ok(Self { row, gate, copy }) } } diff --git a/plonky2/src/gates/reducing.rs b/plonky2/src/gates/reducing.rs index e0587f02..b313efe6 100644 --- a/plonky2/src/gates/reducing.rs +++ b/plonky2/src/gates/reducing.rs @@ -61,12 +61,12 @@ impl, const D: usize> Gate for ReducingGate, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_coeffs)?; Ok(()) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult where Self: Sized, { @@ -226,14 +226,14 @@ impl, const D: usize> SimpleGenerator for Red out_buffer.set_extension_target(output, acc); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - as Gate>::serialize(&self.gate, dst, _cd) + as Gate>::serialize(&self.gate, dst, _common_data) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = as Gate>::deserialize(src, _cd)?; + let gate = as Gate>::deserialize(src, _common_data)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/gates/reducing_extension.rs b/plonky2/src/gates/reducing_extension.rs index 2c4e5aa6..5492c506 100644 --- a/plonky2/src/gates/reducing_extension.rs +++ b/plonky2/src/gates/reducing_extension.rs @@ -64,12 +64,12 @@ impl, const D: usize> Gate for ReducingExtens format!("{self:?}") } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_coeffs)?; Ok(()) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult where Self: Sized, { @@ -220,14 +220,14 @@ impl, const D: usize> SimpleGenerator for Red } } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; - as Gate>::serialize(&self.gate, dst, _cd) + as Gate>::serialize(&self.gate, dst, _common_data) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; - let gate = as Gate>::deserialize(src, _cd)?; + let gate = as Gate>::deserialize(src, _common_data)?; Ok(Self { row, gate }) } } diff --git a/plonky2/src/iop/generator.rs b/plonky2/src/iop/generator.rs index a0cd8e76..478c5ff5 100644 --- a/plonky2/src/iop/generator.rs +++ b/plonky2/src/iop/generator.rs @@ -112,9 +112,9 @@ pub trait WitnessGenerator, const D: usize>: /// run next time a target in its watch list is populated. fn run(&self, witness: &PartitionWitness, out_buffer: &mut GeneratedValues) -> bool; - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()>; - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult where Self: Sized; } @@ -213,9 +213,9 @@ pub trait SimpleGenerator, const D: usize>: } } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()>; + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()>; - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult where Self: Sized; } @@ -250,13 +250,13 @@ impl, SG: SimpleGenerator, const D: usize> Wi } } - fn serialize(&self, dst: &mut Vec, cd: &CommonCircuitData) -> IoResult<()> { - self.inner.serialize(dst, cd) + fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { + self.inner.serialize(dst, common_data) } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { Ok(Self { - inner: SG::deserialize(src, cd)?, + inner: SG::deserialize(src, common_data)?, _phantom: PhantomData, }) } @@ -283,12 +283,12 @@ impl, const D: usize> SimpleGenerator for Cop out_buffer.set_target(self.dst, value); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.src)?; dst.write_target(self.dst) } - fn deserialize(source: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(source: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let src = source.read_target()?; let dst = source.read_target()?; Ok(Self { src, dst }) @@ -315,11 +315,11 @@ impl, const D: usize> SimpleGenerator for Ran out_buffer.set_target(self.target, random_value); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.target) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let target = src.read_target()?; Ok(Self { target }) } @@ -353,12 +353,12 @@ impl, const D: usize> SimpleGenerator for Non out_buffer.set_target(self.dummy, dummy_value); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target(self.to_test)?; dst.write_target(self.dummy) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let to_test = src.read_target()?; let dummy = src.read_target()?; Ok(Self { to_test, dummy }) @@ -393,14 +393,14 @@ impl, const D: usize> SimpleGenerator for Con out_buffer.set_target(Target::wire(self.row, self.wire_index), self.constant); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.row)?; dst.write_usize(self.constant_index)?; dst.write_usize(self.wire_index)?; dst.write_field(self.constant) } - fn deserialize(src: &mut Buffer, _cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, _common_data: &CommonCircuitData) -> IoResult { let row = src.read_usize()?; let constant_index = src.read_usize()?; let wire_index = src.read_usize()?; diff --git a/plonky2/src/recursion/dummy_circuit.rs b/plonky2/src/recursion/dummy_circuit.rs index 897abb75..620c979f 100644 --- a/plonky2/src/recursion/dummy_circuit.rs +++ b/plonky2/src/recursion/dummy_circuit.rs @@ -234,16 +234,16 @@ where out_buffer.set_verifier_data_target(&self.verifier_data_target, &self.verifier_data); } - fn serialize(&self, dst: &mut Vec, _cd: &CommonCircuitData) -> IoResult<()> { + fn serialize(&self, dst: &mut Vec, _common_data: &CommonCircuitData) -> IoResult<()> { dst.write_target_proof_with_public_inputs(&self.proof_with_pis_target)?; dst.write_proof_with_public_inputs(&self.proof_with_pis)?; dst.write_target_verifier_circuit(&self.verifier_data_target)?; dst.write_verifier_only_circuit_data(&self.verifier_data) } - fn deserialize(src: &mut Buffer, cd: &CommonCircuitData) -> IoResult { + fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let proof_with_pis_target = src.read_target_proof_with_public_inputs()?; - let proof_with_pis = src.read_proof_with_public_inputs(cd)?; + let proof_with_pis = src.read_proof_with_public_inputs(common_data)?; let verifier_data_target = src.read_target_verifier_circuit()?; let verifier_data = src.read_verifier_only_circuit_data()?; Ok(Self { diff --git a/plonky2/src/recursion/recursive_verifier.rs b/plonky2/src/recursion/recursive_verifier.rs index 613766e4..ada2b002 100644 --- a/plonky2/src/recursion/recursive_verifier.rs +++ b/plonky2/src/recursion/recursive_verifier.rs @@ -218,10 +218,10 @@ mod tests { type F = >::F; let config = CircuitConfig::standard_recursion_zk_config(); - let (proof, vd, cd) = dummy_proof::(&config, 4_000)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, true, true)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = dummy_proof::(&config, 4_000)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, true, true)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -234,10 +234,10 @@ mod tests { type F = >::F; let config = CircuitConfig::standard_recursion_zk_config(); - let (proof, vd, cd) = dummy_lookup_proof::(&config, 10)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, true, true)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = dummy_lookup_proof::(&config, 10)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, true, true)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -250,10 +250,10 @@ mod tests { type F = >::F; let config = CircuitConfig::standard_recursion_config(); - let (proof, vd, cd) = dummy_two_luts_proof::(&config)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, true, true)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = dummy_two_luts_proof::(&config)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, true, true)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -266,10 +266,10 @@ mod tests { type F = >::F; let config = CircuitConfig::standard_recursion_config(); - let (proof, vd, cd) = dummy_too_many_rows_proof::(&config)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, true, true)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = dummy_too_many_rows_proof::(&config)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, true, true)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -284,20 +284,20 @@ mod tests { let config = CircuitConfig::standard_recursion_config(); // Start with a degree 2^14 proof - let (proof, vd, cd) = dummy_proof::(&config, 16_000)?; - assert_eq!(cd.degree_bits(), 14); + let (proof, vd, common_data) = dummy_proof::(&config, 16_000)?; + assert_eq!(common_data.degree_bits(), 14); // Shrink it to 2^13. - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, Some(13), false, false)?; - assert_eq!(cd.degree_bits(), 13); + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, Some(13), false, false)?; + assert_eq!(common_data.degree_bits(), 13); // Shrink it to 2^12. - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, true, true)?; - assert_eq!(cd.degree_bits(), 12); + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, true, true)?; + assert_eq!(common_data.degree_bits(), 12); - test_serialization(&proof, &vd, &cd)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -316,13 +316,20 @@ mod tests { let standard_config = CircuitConfig::standard_recursion_config(); // An initial dummy proof. - let (proof, vd, cd) = dummy_proof::(&standard_config, 4_000)?; - assert_eq!(cd.degree_bits(), 12); + let (proof, vd, common_data) = dummy_proof::(&standard_config, 4_000)?; + assert_eq!(common_data.degree_bits(), 12); // A standard recursive proof. - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &standard_config, None, false, false)?; - assert_eq!(cd.degree_bits(), 12); + let (proof, vd, common_data) = recursive_proof::( + proof, + vd, + common_data, + &standard_config, + None, + false, + false, + )?; + assert_eq!(common_data.degree_bits(), 12); // A high-rate recursive proof, designed to be verifiable with fewer routed wires. let high_rate_config = CircuitConfig { @@ -334,9 +341,16 @@ mod tests { }, ..standard_config }; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &high_rate_config, None, true, true)?; - assert_eq!(cd.degree_bits(), 12); + let (proof, vd, common_data) = recursive_proof::( + proof, + vd, + common_data, + &high_rate_config, + None, + true, + true, + )?; + assert_eq!(common_data.degree_bits(), 12); // A final proof, optimized for size. let final_config = CircuitConfig { @@ -350,11 +364,18 @@ mod tests { }, ..high_rate_config }; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &final_config, None, true, true)?; - assert_eq!(cd.degree_bits(), 12, "final proof too large"); + let (proof, vd, common_data) = recursive_proof::( + proof, + vd, + common_data, + &final_config, + None, + true, + true, + )?; + assert_eq!(common_data.degree_bits(), 12, "final proof too large"); - test_serialization(&proof, &vd, &cd)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -368,15 +389,15 @@ mod tests { type F = >::F; let config = CircuitConfig::standard_recursion_config(); - let (proof, vd, cd) = dummy_proof::(&config, 4_000)?; + let (proof, vd, common_data) = dummy_proof::(&config, 4_000)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, false, false)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, false, false)?; + test_serialization(&proof, &vd, &common_data)?; - let (proof, vd, cd) = - recursive_proof::(proof, vd, cd, &config, None, false, false)?; - test_serialization(&proof, &vd, &cd)?; + let (proof, vd, common_data) = + recursive_proof::(proof, vd, common_data, &config, None, false, false)?; + test_serialization(&proof, &vd, &common_data)?; Ok(()) } @@ -662,18 +683,18 @@ mod tests { >( proof: &ProofWithPublicInputs, vd: &VerifierOnlyCircuitData, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> Result<()> { let proof_bytes = proof.to_bytes(); info!("Proof length: {} bytes", proof_bytes.len()); - let proof_from_bytes = ProofWithPublicInputs::from_bytes(proof_bytes, cd)?; + let proof_from_bytes = ProofWithPublicInputs::from_bytes(proof_bytes, common_data)?; assert_eq!(proof, &proof_from_bytes); let now = std::time::Instant::now(); - let compressed_proof = proof.clone().compress(&vd.circuit_digest, cd)?; + let compressed_proof = proof.clone().compress(&vd.circuit_digest, common_data)?; let decompressed_compressed_proof = compressed_proof .clone() - .decompress(&vd.circuit_digest, cd)?; + .decompress(&vd.circuit_digest, common_data)?; info!("{:.4}s to compress proof", now.elapsed().as_secs_f64()); assert_eq!(proof, &decompressed_compressed_proof); @@ -683,7 +704,7 @@ mod tests { compressed_proof_bytes.len() ); let compressed_proof_from_bytes = - CompressedProofWithPublicInputs::from_bytes(compressed_proof_bytes, cd)?; + CompressedProofWithPublicInputs::from_bytes(compressed_proof_bytes, common_data)?; assert_eq!(compressed_proof, compressed_proof_from_bytes); Ok(()) diff --git a/plonky2/src/util/serialization/gate_serialization.rs b/plonky2/src/util/serialization/gate_serialization.rs index 2ed43990..008e29c0 100644 --- a/plonky2/src/util/serialization/gate_serialization.rs +++ b/plonky2/src/util/serialization/gate_serialization.rs @@ -6,12 +6,16 @@ use crate::plonk::circuit_data::CommonCircuitData; use crate::util::serialization::{Buffer, IoResult}; pub trait GateSerializer, const D: usize> { - fn read_gate(&self, buf: &mut Buffer, cd: &CommonCircuitData) -> IoResult>; + fn read_gate( + &self, + buf: &mut Buffer, + common_data: &CommonCircuitData, + ) -> IoResult>; fn write_gate( &self, buf: &mut Vec, gate: &GateRef, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> IoResult<()>; } diff --git a/plonky2/src/util/serialization/generator_serialization.rs b/plonky2/src/util/serialization/generator_serialization.rs index a7377de8..6e003400 100644 --- a/plonky2/src/util/serialization/generator_serialization.rs +++ b/plonky2/src/util/serialization/generator_serialization.rs @@ -11,14 +11,14 @@ pub trait WitnessGeneratorSerializer, const D: usiz fn read_generator( &self, buf: &mut Buffer, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> IoResult>; fn write_generator( &self, buf: &mut Vec, generator: &WitnessGeneratorRef, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> IoResult<()>; } diff --git a/plonky2/src/util/serialization/mod.rs b/plonky2/src/util/serialization/mod.rs index 79c11c40..2751ec69 100644 --- a/plonky2/src/util/serialization/mod.rs +++ b/plonky2/src/util/serialization/mod.rs @@ -769,7 +769,7 @@ pub trait Read { // We construct the common data without gates first, // to pass it as argument when reading the gates. - let mut cd = CommonCircuitData { + let mut common_data = CommonCircuitData { config, fri_params, gates: vec![], @@ -786,13 +786,13 @@ pub trait Read { }; for _ in 0..gates_len { - let gate = self.read_gate::(gate_serializer, &cd)?; + let gate = self.read_gate::(gate_serializer, &common_data)?; gates.push(gate); } - cd.gates = gates; + common_data.gates = gates; - Ok(cd) + Ok(common_data) } fn read_circuit_data< @@ -821,12 +821,12 @@ pub trait Read { >( &mut self, generator_serializer: &dyn WitnessGeneratorSerializer, - cd: &CommonCircuitData, + common_data: &CommonCircuitData, ) -> IoResult> { let gen_len = self.read_usize()?; let mut generators = Vec::with_capacity(gen_len); for _ in 0..gen_len { - generators.push(self.read_generator(generator_serializer, cd)?); + generators.push(self.read_generator(generator_serializer, common_data)?); } let map_len = self.read_usize()?; let mut generator_indices_by_watches = BTreeMap::new(); From 1d6ca5894f5904b7dd010b716728fcbd26b2c234 Mon Sep 17 00:00:00 2001 From: Robin Salen Date: Fri, 14 Jul 2023 19:19:39 -0400 Subject: [PATCH 9/9] Add LUT hash to remove CircuitBuilder overhead --- plonky2/src/gates/lookup.rs | 23 +++++++++++++++++++++-- plonky2/src/gates/lookup_table.rs | 22 ++++++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/plonky2/src/gates/lookup.rs b/plonky2/src/gates/lookup.rs index 03cddbf7..f682be23 100644 --- a/plonky2/src/gates/lookup.rs +++ b/plonky2/src/gates/lookup.rs @@ -3,6 +3,9 @@ use alloc::string::String; use alloc::vec::Vec; use core::usize; +use itertools::Itertools; +use keccak_hash::keccak; + use super::lookup_table::LookupTable; use crate::field::extension::Extendable; use crate::field::packed::PackedField; @@ -31,13 +34,21 @@ pub struct LookupGate { pub num_slots: usize, /// LUT associated to the gate. lut: LookupTable, + /// The Keccak hash of the lookup table. + lut_hash: [u8; 32], } impl LookupGate { pub fn new_from_table(config: &CircuitConfig, lut: LookupTable) -> Self { + let table_bytes = lut + .iter() + .flat_map(|(input, output)| [input.to_le_bytes(), output.to_le_bytes()].concat()) + .collect_vec(); + Self { num_slots: Self::num_slots(config), lut, + lut_hash: keccak(table_bytes).0, } } pub(crate) fn num_slots(config: &CircuitConfig) -> usize { @@ -56,14 +67,19 @@ impl LookupGate { impl, const D: usize> Gate for LookupGate { fn id(&self) -> String { - format!("{self:?}") + // Custom implementation to not have the entire lookup table + format!( + "LookupGate {{num_slots: {}, lut_hash: {:?}}}", + self.num_slots, self.lut_hash + ) } fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { dst.write_usize(self.num_slots)?; for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { - return dst.write_usize(i); + dst.write_usize(i)?; + return dst.write_all(&self.lut_hash); } } @@ -73,10 +89,13 @@ impl, const D: usize> Gate for LookupGate { fn deserialize(src: &mut Buffer, common_data: &CommonCircuitData) -> IoResult { let num_slots = src.read_usize()?; let lut_index = src.read_usize()?; + let mut lut_hash = [0u8; 32]; + src.read_exact(&mut lut_hash)?; Ok(Self { num_slots, lut: common_data.luts[lut_index].clone(), + lut_hash, }) } diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index 39ef1953..f3ed842d 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -4,6 +4,8 @@ use alloc::sync::Arc; use alloc::vec::Vec; use core::usize; +use itertools::Itertools; +use keccak_hash::keccak; use plonky2_util::ceil_div_usize; use crate::field::extension::Extendable; @@ -33,15 +35,23 @@ pub struct LookupTableGate { pub num_slots: usize, /// Lookup table associated to the gate. pub lut: LookupTable, + /// The Keccak hash of the lookup table. + lut_hash: [u8; 32], /// First row of the lookup table. last_lut_row: usize, } impl LookupTableGate { pub fn new_from_table(config: &CircuitConfig, lut: LookupTable, last_lut_row: usize) -> Self { + let table_bytes = lut + .iter() + .flat_map(|(input, output)| [input.to_le_bytes(), output.to_le_bytes()].concat()) + .collect_vec(); + Self { num_slots: Self::num_slots(config), lut, + lut_hash: keccak(table_bytes).0, last_lut_row, } } @@ -69,7 +79,11 @@ impl LookupTableGate { impl, const D: usize> Gate for LookupTableGate { fn id(&self) -> String { - format!("{self:?}") + // Custom implementation to not have the entire lookup table + format!( + "LookupGate {{num_slots: {}, lut_hash: {:?}, last_lut_row: {}}}", + self.num_slots, self.lut_hash, self.last_lut_row + ) } fn serialize(&self, dst: &mut Vec, common_data: &CommonCircuitData) -> IoResult<()> { @@ -77,7 +91,8 @@ impl, const D: usize> Gate for LookupTableGat dst.write_usize(self.last_lut_row)?; for (i, lut) in common_data.luts.iter().enumerate() { if lut == &self.lut { - return dst.write_usize(i); + dst.write_usize(i)?; + return dst.write_all(&self.lut_hash); } } @@ -88,10 +103,13 @@ impl, const D: usize> Gate for LookupTableGat let num_slots = src.read_usize()?; let last_lut_row = src.read_usize()?; let lut_index = src.read_usize()?; + let mut lut_hash = [0u8; 32]; + src.read_exact(&mut lut_hash)?; Ok(Self { num_slots, lut: common_data.luts[lut_index].clone(), + lut_hash, last_lut_row, }) }