Add parameter 'inputs_already_allocated' to CircomCircuit To allow allocating the inputs in previous stages.
arnaucube root@arnaucube.com
Mon, 25 Mar 2024 22:31:47 +0100
2 files changed,
20 insertions(+),
11 deletions(-)
M
src/circom/builder.rs
→
src/circom/builder.rs
@@ -58,6 +58,7 @@ pub fn setup(&self) -> CircomCircuit<F> {
let mut circom = CircomCircuit { r1cs: self.cfg.r1cs.clone(), witness: None, + inputs_already_allocated: false, }; // Disable the wire mapping
M
src/circom/circuit.rs
→
src/circom/circuit.rs
@@ -11,6 +11,7 @@ #[derive(Clone, Debug)]
pub struct CircomCircuit<F: PrimeField> { pub r1cs: R1CS<F>, pub witness: Option<Vec<F>>, + pub inputs_already_allocated: bool, } impl<F: PrimeField> CircomCircuit<F> {@@ -31,16 +32,18 @@ let witness = &self.witness;
let wire_mapping = &self.r1cs.wire_mapping; // Start from 1 because Arkworks implicitly allocates One for the first input - for i in 1..self.r1cs.num_inputs { - cs.new_input_variable(|| { - Ok(match witness { - None => F::from(1u32), - Some(w) => match wire_mapping { - Some(m) => w[m[i]], - None => w[i], - }, - }) - })?; + if !self.inputs_already_allocated { + for i in 1..self.r1cs.num_inputs { + cs.new_input_variable(|| { + Ok(match witness { + None => F::from(1u32), + Some(w) => match wire_mapping { + Some(m) => w[m[i]], + None => w[i], + }, + }) + })?; + } } for i in 0..self.r1cs.num_aux {@@ -69,7 +72,12 @@ |lc: LinearCombination<F>, (index, coeff)| lc + (*coeff, make_index(*index)),
) }; - for constraint in &self.r1cs.constraints { + let skip = if self.inputs_already_allocated { + self.r1cs.num_inputs + } else { + 0 + }; + for constraint in self.r1cs.constraints.iter().skip(skip) { cs.enforce_constraint( make_lc(&constraint.0), make_lc(&constraint.1),