fix: negate negative witness elements
Georgios Konstantopoulos me@gakonst.com
Tue, 10 Aug 2021 23:40:57 +0300
1 files changed,
13 insertions(+),
2 deletions(-)
jump to
M
src/circom/builder.rs
→
src/circom/builder.rs
@@ -75,11 +75,22 @@ .cfg
.wtns .calculate_witness(self.inputs, self.cfg.sanity_check)?; + use ark_ff::{PrimeField, FpParameters}; + let modulus = <<E::Fr as PrimeField>::Params as FpParameters>::MODULUS; + // convert it to field elements + use num_traits::Signed; let witness = witness .into_iter() - .map(|w| E::Fr::from(w.to_biguint().unwrap())) - .collect::<Vec<_>>(); + .map(|w| { + let w = if w.sign() == num_bigint::Sign::Minus { + // Need to negate the witness element if negative + modulus.into() - w.abs().to_biguint().unwrap() + } else { + w.to_biguint().unwrap() + }; + E::Fr::from(w) + }).collect::<Vec<_>>(); circom.witness = Some(witness); // sanity check