diff --git a/leo/commands/build.rs b/leo/commands/build.rs index 5f47cd1a6b..badfec2e15 100644 --- a/leo/commands/build.rs +++ b/leo/commands/build.rs @@ -122,9 +122,7 @@ impl Command for Build { // Generate the program on the constraint system and verify correctness { let mut cs = CircuitSynthesizer:: { - at: Default::default(), - bt: Default::default(), - ct: Default::default(), + constraints: Default::default(), public_variables: Default::default(), private_variables: Default::default(), namespaces: Default::default(), diff --git a/synthesizer/src/circuit_synthesizer.rs b/synthesizer/src/circuit_synthesizer.rs index 356f97d15a..e12a3292d0 100644 --- a/synthesizer/src/circuit_synthesizer.rs +++ b/synthesizer/src/circuit_synthesizer.rs @@ -25,11 +25,25 @@ pub struct Namespace { private_var_indices: Vec, } +pub struct ConstraintSet { + pub at: Vec<(E::Fr, Index)>, + pub bt: Vec<(E::Fr, Index)>, + pub ct: Vec<(E::Fr, Index)>, +} + +impl Default for ConstraintSet { + fn default() -> Self { + ConstraintSet { + at: Default::default(), + bt: Default::default(), + ct: Default::default(), + } + } +} + pub struct CircuitSynthesizer { // Constraints - pub at: OptionalVec>, - pub bt: OptionalVec>, - pub ct: OptionalVec>, + pub constraints: OptionalVec>, // Assignments of variables pub public_variables: OptionalVec, @@ -79,13 +93,11 @@ impl ConstraintSystem for CircuitSynthesizer { LB: FnOnce(LinearCombination) -> LinearCombination, LC: FnOnce(LinearCombination) -> LinearCombination, { - let index = self.at.insert(Vec::new()); - self.bt.insert(Vec::new()); - self.ct.insert(Vec::new()); + let index = self.constraints.insert(Default::default()); - push_constraints(a(LinearCombination::zero()), &mut self.at, index); - push_constraints(b(LinearCombination::zero()), &mut self.bt, index); - push_constraints(c(LinearCombination::zero()), &mut self.ct, index); + push_constraints(a(LinearCombination::zero()), &mut self.constraints[index].at); + push_constraints(b(LinearCombination::zero()), &mut self.constraints[index].bt); + push_constraints(c(LinearCombination::zero()), &mut self.constraints[index].ct); if let Some(ref mut ns) = self.namespaces.last_mut() { ns.constraint_indices.push(index); @@ -103,9 +115,7 @@ impl ConstraintSystem for CircuitSynthesizer { fn pop_namespace(&mut self) { if let Some(ns) = self.namespaces.pop() { for idx in ns.constraint_indices { - self.at.remove(idx); - self.bt.remove(idx); - self.ct.remove(idx); + self.constraints.remove(idx); } for idx in ns.private_var_indices { @@ -123,7 +133,7 @@ impl ConstraintSystem for CircuitSynthesizer { } fn num_constraints(&self) -> usize { - self.at.len() + self.constraints.len() } fn num_public_variables(&self) -> usize { @@ -135,15 +145,11 @@ impl ConstraintSystem for CircuitSynthesizer { } } -fn push_constraints( - l: LinearCombination, - constraints: &mut OptionalVec>, - this_constraint: usize, -) { +fn push_constraints(l: LinearCombination, constraint: &mut Vec<(F, Index)>) { for (var, coeff) in l.as_ref() { match var.get_unchecked() { - Index::Public(i) => constraints[this_constraint].push((*coeff, Index::Public(i))), - Index::Private(i) => constraints[this_constraint].push((*coeff, Index::Private(i))), + Index::Public(i) => constraint.push((*coeff, Index::Public(i))), + Index::Private(i) => constraint.push((*coeff, Index::Private(i))), } } } diff --git a/synthesizer/src/serialized_circuit.rs b/synthesizer/src/serialized_circuit.rs index 4f20704b2c..5d7e3c379f 100644 --- a/synthesizer/src/serialized_circuit.rs +++ b/synthesizer/src/serialized_circuit.rs @@ -21,7 +21,7 @@ use snarkvm_curves::{bls12_377::Bls12_377, traits::PairingEngine}; use snarkvm_fields::FieldError; use snarkvm_r1cs::{ConstraintSystem, Index, OptionalVec}; -use crate::{CircuitSynthesizer, SerializedField, SerializedIndex}; +use crate::{CircuitSynthesizer, ConstraintSet, SerializedField, SerializedIndex}; #[derive(Serialize, Deserialize)] pub struct SerializedCircuit { @@ -86,17 +86,17 @@ impl From> for SerializedCircuit { for i in 0..num_constraints { // Serialize at[i] - let a_constraints = get_serialized_constraints::(&synthesizer.at[i]); + let a_constraints = get_serialized_constraints::(&synthesizer.constraints[i].at); at.push(a_constraints); // Serialize bt[i] - let b_constraints = get_serialized_constraints::(&synthesizer.bt[i]); + let b_constraints = get_serialized_constraints::(&synthesizer.constraints[i].bt); bt.push(b_constraints); // Serialize ct[i] - let c_constraints = get_serialized_constraints::(&synthesizer.ct[i]); + let c_constraints = get_serialized_constraints::(&synthesizer.constraints[i].ct); ct.push(c_constraints); } @@ -151,31 +151,27 @@ impl TryFrom for CircuitSynthesizer { Ok(deserialized) } - let mut at = OptionalVec::with_capacity(serialized.num_constraints); - let mut bt = OptionalVec::with_capacity(serialized.num_constraints); - let mut ct = OptionalVec::with_capacity(serialized.num_constraints); + let mut constraints = OptionalVec::with_capacity(serialized.num_constraints); for i in 0..serialized.num_constraints { // Deserialize at[i] - let a_constraints = get_deserialized_constraints(&serialized.at[i])?; - at.insert(a_constraints); // Deserialize bt[i] - let b_constraints = get_deserialized_constraints(&serialized.bt[i])?; - bt.insert(b_constraints); // Deserialize ct[i] - let c_constraints = get_deserialized_constraints(&serialized.ct[i])?; - ct.insert(c_constraints); + + constraints.insert(ConstraintSet { + at: a_constraints, + bt: b_constraints, + ct: c_constraints, + }); } Ok(CircuitSynthesizer:: { - at, - bt, - ct, + constraints, public_variables, private_variables, namespaces: Default::default(),