ecc::chip: Fix `print_ecc_chip`

The ECC test chip performs various checks that assume the chip will only
be synthesized with witnesses. This assumption is broken by the chip
printer test, so we fix the assumption here.
This commit is contained in:
Jack Grigg 2021-12-09 00:49:01 +00:00
parent 6b84d0955a
commit a4135dde24
7 changed files with 31 additions and 15 deletions

View File

@ -508,7 +508,9 @@ mod tests {
use super::chip::{EccChip, EccConfig}; use super::chip::{EccChip, EccConfig};
use crate::circuit::gadget::utilities::lookup_range_check::LookupRangeCheckConfig; use crate::circuit::gadget::utilities::lookup_range_check::LookupRangeCheckConfig;
struct MyCircuit {} struct MyCircuit {
test_errors: bool,
}
#[allow(non_snake_case)] #[allow(non_snake_case)]
impl Circuit<pallas::Base> for MyCircuit { impl Circuit<pallas::Base> for MyCircuit {
@ -516,7 +518,7 @@ mod tests {
type FloorPlanner = SimpleFloorPlanner; type FloorPlanner = SimpleFloorPlanner;
fn without_witnesses(&self) -> Self { fn without_witnesses(&self) -> Self {
MyCircuit {} MyCircuit { test_errors: false }
} }
fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config { fn configure(meta: &mut ConstraintSystem<pallas::Base>) -> Self::Config {
@ -634,6 +636,7 @@ mod tests {
q_val, q_val,
&q, &q,
&p_neg, &p_neg,
self.test_errors,
)?; )?;
} }
@ -678,7 +681,7 @@ mod tests {
#[test] #[test]
fn ecc_chip() { fn ecc_chip() {
let k = 13; let k = 13;
let circuit = MyCircuit {}; let circuit = MyCircuit { test_errors: true };
let prover = MockProver::run(k, &circuit, vec![]).unwrap(); let prover = MockProver::run(k, &circuit, vec![]).unwrap();
assert_eq!(prover.verify(), Ok(())) assert_eq!(prover.verify(), Ok(()))
} }
@ -692,7 +695,7 @@ mod tests {
root.fill(&WHITE).unwrap(); root.fill(&WHITE).unwrap();
let root = root.titled("Ecc Chip Layout", ("sans-serif", 60)).unwrap(); let root = root.titled("Ecc Chip Layout", ("sans-serif", 60)).unwrap();
let circuit = MyCircuit {}; let circuit = MyCircuit { test_errors: false };
halo2::dev::CircuitLayout::default() halo2::dev::CircuitLayout::default()
.render(13, &circuit, &root) .render(13, &circuit, &root)
.unwrap(); .unwrap();

View File

@ -414,7 +414,9 @@ pub mod tests {
// Check complete addition P + (-P) // Check complete addition P + (-P)
let zero = { let zero = {
let result = p.add(layouter.namespace(|| "P + (-P)"), p_neg)?; let result = p.add(layouter.namespace(|| "P + (-P)"), p_neg)?;
assert!(result.inner().is_identity().unwrap()); if let Some(is_identity) = result.inner().is_identity() {
assert!(is_identity);
}
result result
}; };

View File

@ -176,6 +176,7 @@ pub mod tests {
q_val: pallas::Affine, q_val: pallas::Affine,
q: &NonIdentityPoint<pallas::Affine, EccChip>, q: &NonIdentityPoint<pallas::Affine, EccChip>,
p_neg: &NonIdentityPoint<pallas::Affine, EccChip>, p_neg: &NonIdentityPoint<pallas::Affine, EccChip>,
test_errors: bool,
) -> Result<(), Error> { ) -> Result<(), Error> {
// P + Q // P + Q
{ {
@ -188,13 +189,15 @@ pub mod tests {
result.constrain_equal(layouter.namespace(|| "constrain P + Q"), &witnessed_result)?; result.constrain_equal(layouter.namespace(|| "constrain P + Q"), &witnessed_result)?;
} }
// P + P should return an error if test_errors {
p.add_incomplete(layouter.namespace(|| "P + P"), p) // P + P should return an error
.expect_err("P + P should return an error"); p.add_incomplete(layouter.namespace(|| "P + P"), p)
.expect_err("P + P should return an error");
// P + (-P) should return an error // P + (-P) should return an error
p.add_incomplete(layouter.namespace(|| "P + (-P)"), p_neg) p.add_incomplete(layouter.namespace(|| "P + (-P)"), p_neg)
.expect_err("P + (-P) should return an error"); .expect_err("P + (-P) should return an error");
}
Ok(()) Ok(())
} }

View File

@ -535,7 +535,9 @@ pub mod tests {
chip.load_private(layouter.namespace(|| "zero"), column, Some(scalar_val))?; chip.load_private(layouter.namespace(|| "zero"), column, Some(scalar_val))?;
p.mul(layouter.namespace(|| "[0]B"), &scalar)? p.mul(layouter.namespace(|| "[0]B"), &scalar)?
}; };
assert!(result.inner().is_identity().unwrap()); if let Some(is_identity) = result.inner().is_identity() {
assert!(is_identity);
}
} }
// [-1]B (the largest possible base field element) // [-1]B (the largest possible base field element)

View File

@ -487,7 +487,9 @@ pub mod tests {
chip.load_private(layouter.namespace(|| "zero"), column, Some(scalar_fixed))?; chip.load_private(layouter.namespace(|| "zero"), column, Some(scalar_fixed))?;
base.mul(layouter.namespace(|| "mul by zero"), scalar_fixed)? base.mul(layouter.namespace(|| "mul by zero"), scalar_fixed)?
}; };
assert!(result.inner().is_identity().unwrap()); if let Some(is_identity) = result.inner().is_identity() {
assert!(is_identity);
}
} }
// [-1]B is the largest base field element // [-1]B is the largest base field element

View File

@ -295,7 +295,9 @@ pub mod tests {
{ {
let scalar_fixed = pallas::Scalar::zero(); let scalar_fixed = pallas::Scalar::zero();
let (result, _) = base.mul(layouter.namespace(|| "mul by zero"), Some(scalar_fixed))?; let (result, _) = base.mul(layouter.namespace(|| "mul by zero"), Some(scalar_fixed))?;
assert!(result.inner().is_identity().unwrap()); if let Some(is_identity) = result.inner().is_identity() {
assert!(is_identity);
}
} }
// [-1]B is the largest scalar field element. // [-1]B is the largest scalar field element.

View File

@ -367,7 +367,9 @@ pub mod tests {
)?; )?;
value_commit_v.mul(layouter.namespace(|| *name), magnitude_sign)? value_commit_v.mul(layouter.namespace(|| *name), magnitude_sign)?
}; };
assert!(result.inner().is_identity().unwrap()); if let Some(is_identity) = result.inner().is_identity() {
assert!(is_identity);
}
} }
Ok(()) Ok(())