mirror of https://github.com/zcash/orchard.git
add_incomplete::tests: Constrain output of `P + Q` test.
Also minor docfixes and refactors. Co-authored-by: Jack Grigg <jack@electriccoin.co>
This commit is contained in:
parent
7341996d2c
commit
8a8df98a50
|
@ -470,7 +470,7 @@ mod tests {
|
||||||
// Test complete addition
|
// Test complete addition
|
||||||
{
|
{
|
||||||
super::chip::add::tests::test_add(
|
super::chip::add::tests::test_add(
|
||||||
chip,
|
chip.clone(),
|
||||||
layouter.namespace(|| "complete addition"),
|
layouter.namespace(|| "complete addition"),
|
||||||
&zero,
|
&zero,
|
||||||
p_val,
|
p_val,
|
||||||
|
@ -484,9 +484,12 @@ mod tests {
|
||||||
// Test incomplete addition
|
// Test incomplete addition
|
||||||
{
|
{
|
||||||
super::chip::add_incomplete::tests::test_add_incomplete(
|
super::chip::add_incomplete::tests::test_add_incomplete(
|
||||||
|
chip,
|
||||||
layouter.namespace(|| "incomplete addition"),
|
layouter.namespace(|| "incomplete addition"),
|
||||||
&zero,
|
&zero,
|
||||||
|
p_val,
|
||||||
&p,
|
&p,
|
||||||
|
q_val,
|
||||||
&q,
|
&q,
|
||||||
&p_neg,
|
&p_neg,
|
||||||
)?;
|
)?;
|
||||||
|
@ -498,7 +501,7 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ecc() {
|
fn ecc() {
|
||||||
let k = 5;
|
let k = 6;
|
||||||
let circuit = MyCircuit {};
|
let circuit = MyCircuit {};
|
||||||
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(()))
|
||||||
|
|
|
@ -409,13 +409,13 @@ pub mod tests {
|
||||||
// Check complete addition P + (-P)
|
// Check complete addition P + (-P)
|
||||||
{
|
{
|
||||||
let result = p.add(layouter.namespace(|| "P + (-P)"), p_neg)?;
|
let result = p.add(layouter.namespace(|| "P + (-P)"), p_neg)?;
|
||||||
result.constrain_equal(layouter.namespace(|| "P + (-P) = 0"), zero)?;
|
result.constrain_equal(layouter.namespace(|| "P + (-P) = 𝒪"), zero)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check complete addition 𝒪 + 𝒪
|
// Check complete addition 𝒪 + 𝒪
|
||||||
{
|
{
|
||||||
let result = zero.add(layouter.namespace(|| "𝒪 + 𝒪"), zero)?;
|
let result = zero.add(layouter.namespace(|| "𝒪 + 𝒪"), zero)?;
|
||||||
result.constrain_equal(layouter.namespace(|| "P + (-P) = 0"), zero)?;
|
result.constrain_equal(layouter.namespace(|| "𝒪 + 𝒪 = 𝒪"), zero)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check P + Q
|
// Check P + Q
|
||||||
|
|
|
@ -53,7 +53,7 @@ impl Config {
|
||||||
(x_r.clone() + x_q.clone() + x_p.clone())
|
(x_r.clone() + x_q.clone() + x_p.clone())
|
||||||
* (x_p.clone() - x_q.clone())
|
* (x_p.clone() - x_q.clone())
|
||||||
* (x_p.clone() - x_q.clone())
|
* (x_p.clone() - x_q.clone())
|
||||||
- (y_p.clone() - y_q.clone()) * (y_p.clone() - y_q.clone())
|
- (y_p.clone() - y_q.clone()).square()
|
||||||
};
|
};
|
||||||
|
|
||||||
// (y_r + y_q)(x_p − x_q) − (y_p − y_q)(x_q − x_r) = 0
|
// (y_r + y_q)(x_p − x_q) − (y_p − y_q)(x_q − x_r) = 0
|
||||||
|
@ -143,22 +143,35 @@ impl Config {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use halo2::{arithmetic::CurveAffine, circuit::Layouter, plonk::Error};
|
use group::Curve;
|
||||||
|
use halo2::{circuit::Layouter, plonk::Error};
|
||||||
|
use pasta_curves::pallas;
|
||||||
|
|
||||||
use crate::circuit::gadget::ecc::{EccInstructions, Point};
|
use crate::circuit::gadget::ecc::{EccInstructions, Point};
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn test_add_incomplete<
|
pub fn test_add_incomplete<
|
||||||
C: CurveAffine,
|
EccChip: EccInstructions<pallas::Affine> + Clone + Eq + std::fmt::Debug,
|
||||||
EccChip: EccInstructions<C> + Clone + Eq + std::fmt::Debug,
|
|
||||||
>(
|
>(
|
||||||
mut layouter: impl Layouter<C::Base>,
|
chip: EccChip,
|
||||||
zero: &Point<C, EccChip>,
|
mut layouter: impl Layouter<pallas::Base>,
|
||||||
p: &Point<C, EccChip>,
|
zero: &Point<pallas::Affine, EccChip>,
|
||||||
q: &Point<C, EccChip>,
|
p_val: pallas::Affine,
|
||||||
p_neg: &Point<C, EccChip>,
|
p: &Point<pallas::Affine, EccChip>,
|
||||||
|
q_val: pallas::Affine,
|
||||||
|
q: &Point<pallas::Affine, EccChip>,
|
||||||
|
p_neg: &Point<pallas::Affine, EccChip>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
// P + Q
|
// P + Q
|
||||||
p.add_incomplete(layouter.namespace(|| "P + Q"), q)?;
|
{
|
||||||
|
let result = p.add_incomplete(layouter.namespace(|| "P + Q"), q)?;
|
||||||
|
let witnessed_result = Point::new(
|
||||||
|
chip,
|
||||||
|
layouter.namespace(|| "witnessed P + Q"),
|
||||||
|
Some((p_val + q_val).to_affine()),
|
||||||
|
)?;
|
||||||
|
result.constrain_equal(layouter.namespace(|| "constrain P + Q"), &witnessed_result)?;
|
||||||
|
}
|
||||||
|
|
||||||
// P + P should return an error
|
// P + P should return an error
|
||||||
p.add_incomplete(layouter.namespace(|| "P + P"), p)
|
p.add_incomplete(layouter.namespace(|| "P + P"), p)
|
||||||
|
|
|
@ -40,8 +40,8 @@ impl Config {
|
||||||
let y = meta.query_advice(self.y, Rotation::cur());
|
let y = meta.query_advice(self.y, Rotation::cur());
|
||||||
|
|
||||||
// y^2 = x^3 + b
|
// y^2 = x^3 + b
|
||||||
let curve_eqn = y.clone() * y.clone()
|
let curve_eqn = y.clone().square()
|
||||||
- (x.clone() * x.clone() * x.clone())
|
- (x.clone().square() * x.clone())
|
||||||
- Expression::Constant(pallas::Affine::b());
|
- Expression::Constant(pallas::Affine::b());
|
||||||
|
|
||||||
vec![
|
vec![
|
||||||
|
|
Loading…
Reference in New Issue