|
|
@ -11,6 +11,7 @@ use color_eyre::Result; |
|
|
|
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 @@ impl ConstraintSynthesizer for CircomCircuit { |
|
|
|
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 @@ impl ConstraintSynthesizer for CircomCircuit { |
|
|
|
)
|
|
|
|
};
|
|
|
|
|
|
|
|
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),
|
|
|
|