mirror of https://github.com/zcash/orchard.git
note_commit::tests: Constrain output of NoteCommit to expected point.
This commit is contained in:
parent
7aa3174880
commit
fa135fe62e
|
@ -1467,10 +1467,12 @@ mod tests {
|
||||||
lookup_range_check::LookupRangeCheckConfig, CellValue, UtilitiesInstructions,
|
lookup_range_check::LookupRangeCheckConfig, CellValue, UtilitiesInstructions,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
constants::T_Q,
|
constants::{L_ORCHARD_BASE, L_VALUE, NOTE_COMMITMENT_PERSONALIZATION, T_Q},
|
||||||
|
primitives::sinsemilla::CommitDomain,
|
||||||
};
|
};
|
||||||
|
|
||||||
use ff::Field;
|
use ff::{Field, PrimeField, PrimeFieldBits};
|
||||||
|
use group::Curve;
|
||||||
use halo2::{
|
use halo2::{
|
||||||
circuit::{Layouter, SimpleFloorPlanner},
|
circuit::{Layouter, SimpleFloorPlanner},
|
||||||
dev::MockProver,
|
dev::MockProver,
|
||||||
|
@ -1489,7 +1491,9 @@ mod tests {
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct MyCircuit {
|
struct MyCircuit {
|
||||||
gd_x: Option<pallas::Base>,
|
gd_x: Option<pallas::Base>,
|
||||||
|
gd_y_lsb: Option<pallas::Base>,
|
||||||
pkd_x: Option<pallas::Base>,
|
pkd_x: Option<pallas::Base>,
|
||||||
|
pkd_y_lsb: Option<pallas::Base>,
|
||||||
rho: Option<pallas::Base>,
|
rho: Option<pallas::Base>,
|
||||||
psi: Option<pallas::Base>,
|
psi: Option<pallas::Base>,
|
||||||
}
|
}
|
||||||
|
@ -1577,9 +1581,12 @@ mod tests {
|
||||||
|
|
||||||
// Witness g_d
|
// Witness g_d
|
||||||
let g_d = {
|
let g_d = {
|
||||||
let g_d = self.gd_x.map(|x| {
|
let g_d = self.gd_x.zip(self.gd_y_lsb).map(|(x, y_lsb)| {
|
||||||
// Calculate y = (x^3 + 5).sqrt()
|
// Calculate y = (x^3 + 5).sqrt()
|
||||||
let y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap();
|
let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap();
|
||||||
|
if y.is_odd() && y_lsb == pallas::Base::zero() {
|
||||||
|
y = -y;
|
||||||
|
}
|
||||||
pallas::Affine::from_xy(x, y).unwrap()
|
pallas::Affine::from_xy(x, y).unwrap()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1588,9 +1595,12 @@ mod tests {
|
||||||
|
|
||||||
// Witness pk_d
|
// Witness pk_d
|
||||||
let pk_d = {
|
let pk_d = {
|
||||||
let pk_d = self.pkd_x.map(|x| {
|
let pk_d = self.pkd_x.zip(self.pkd_y_lsb).map(|(x, y_lsb)| {
|
||||||
// Calculate y = (x^3 + 5).sqrt()
|
// Calculate y = (x^3 + 5).sqrt()
|
||||||
let y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap();
|
let mut y = (x.square() * x + pallas::Affine::b()).sqrt().unwrap();
|
||||||
|
if y.is_odd() && y_lsb == pallas::Base::zero() {
|
||||||
|
y = -y;
|
||||||
|
}
|
||||||
pallas::Affine::from_xy(x, y).unwrap()
|
pallas::Affine::from_xy(x, y).unwrap()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1605,7 +1615,9 @@ mod tests {
|
||||||
// A note value cannot be negative.
|
// A note value cannot be negative.
|
||||||
let value = {
|
let value = {
|
||||||
let mut rng = OsRng;
|
let mut rng = OsRng;
|
||||||
let value = pallas::Base::from_u64(rng.next_u64());
|
pallas::Base::from_u64(rng.next_u64())
|
||||||
|
};
|
||||||
|
let value_var = {
|
||||||
self.load_private(
|
self.load_private(
|
||||||
layouter.namespace(|| "witness value"),
|
layouter.namespace(|| "witness value"),
|
||||||
note_commit_config.advices[0],
|
note_commit_config.advices[0],
|
||||||
|
@ -1627,21 +1639,68 @@ mod tests {
|
||||||
self.psi,
|
self.psi,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let rcm = Some(pallas::Scalar::rand());
|
let rcm = pallas::Scalar::rand();
|
||||||
|
|
||||||
let _cm = note_commit_config.assign_region(
|
let cm = note_commit_config.assign_region(
|
||||||
layouter.namespace(|| "Hash NoteCommit pieces"),
|
layouter.namespace(|| "Hash NoteCommit pieces"),
|
||||||
sinsemilla_chip,
|
sinsemilla_chip,
|
||||||
ecc_chip,
|
ecc_chip.clone(),
|
||||||
g_d.inner(),
|
g_d.inner(),
|
||||||
pk_d.inner(),
|
pk_d.inner(),
|
||||||
value,
|
value_var,
|
||||||
rho,
|
rho,
|
||||||
psi,
|
psi,
|
||||||
rcm,
|
Some(rcm),
|
||||||
)?;
|
)?;
|
||||||
|
let expected_cm = {
|
||||||
Ok(())
|
let domain = CommitDomain::new(NOTE_COMMITMENT_PERSONALIZATION);
|
||||||
|
// Hash g★_d || pk★_d || i2lebsp_{64}(v) || rho || psi
|
||||||
|
let lsb = |y_lsb: pallas::Base| y_lsb == pallas::Base::one();
|
||||||
|
let point = domain
|
||||||
|
.commit(
|
||||||
|
std::iter::empty()
|
||||||
|
.chain(
|
||||||
|
self.gd_x
|
||||||
|
.unwrap()
|
||||||
|
.to_le_bits()
|
||||||
|
.iter()
|
||||||
|
.by_val()
|
||||||
|
.take(L_ORCHARD_BASE),
|
||||||
|
)
|
||||||
|
.chain(Some(lsb(self.gd_y_lsb.unwrap())))
|
||||||
|
.chain(
|
||||||
|
self.pkd_x
|
||||||
|
.unwrap()
|
||||||
|
.to_le_bits()
|
||||||
|
.iter()
|
||||||
|
.by_val()
|
||||||
|
.take(L_ORCHARD_BASE),
|
||||||
|
)
|
||||||
|
.chain(Some(lsb(self.pkd_y_lsb.unwrap())))
|
||||||
|
.chain(value.to_le_bits().iter().by_val().take(L_VALUE))
|
||||||
|
.chain(
|
||||||
|
self.rho
|
||||||
|
.unwrap()
|
||||||
|
.to_le_bits()
|
||||||
|
.iter()
|
||||||
|
.by_val()
|
||||||
|
.take(L_ORCHARD_BASE),
|
||||||
|
)
|
||||||
|
.chain(
|
||||||
|
self.psi
|
||||||
|
.unwrap()
|
||||||
|
.to_le_bits()
|
||||||
|
.iter()
|
||||||
|
.by_val()
|
||||||
|
.take(L_ORCHARD_BASE),
|
||||||
|
),
|
||||||
|
&rcm,
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.to_affine();
|
||||||
|
Point::new(ecc_chip, layouter.namespace(|| "witness g_d"), Some(point))?
|
||||||
|
};
|
||||||
|
cm.constrain_equal(layouter.namespace(|| "cm == expected cm"), &expected_cm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1652,49 +1711,63 @@ mod tests {
|
||||||
// `rho` = 0, `psi` = 0
|
// `rho` = 0, `psi` = 0
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::one()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::one()),
|
||||||
rho: Some(pallas::Base::zero()),
|
rho: Some(pallas::Base::zero()),
|
||||||
psi: Some(pallas::Base::zero()),
|
psi: Some(pallas::Base::zero()),
|
||||||
},
|
},
|
||||||
// `rho` = T_Q - 1, `psi` = T_Q - 1
|
// `rho` = T_Q - 1, `psi` = T_Q - 1
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::zero()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::zero()),
|
||||||
rho: Some(pallas::Base::from_u128(T_Q - 1)),
|
rho: Some(pallas::Base::from_u128(T_Q - 1)),
|
||||||
psi: Some(pallas::Base::from_u128(T_Q - 1)),
|
psi: Some(pallas::Base::from_u128(T_Q - 1)),
|
||||||
},
|
},
|
||||||
// `rho` = T_Q, `psi` = T_Q
|
// `rho` = T_Q, `psi` = T_Q
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::one()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::zero()),
|
||||||
rho: Some(pallas::Base::from_u128(T_Q)),
|
rho: Some(pallas::Base::from_u128(T_Q)),
|
||||||
psi: Some(pallas::Base::from_u128(T_Q)),
|
psi: Some(pallas::Base::from_u128(T_Q)),
|
||||||
},
|
},
|
||||||
// `rho` = 2^127 - 1, `psi` = 2^127 - 1
|
// `rho` = 2^127 - 1, `psi` = 2^127 - 1
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::zero()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::one()),
|
||||||
rho: Some(pallas::Base::from_u128((1 << 127) - 1)),
|
rho: Some(pallas::Base::from_u128((1 << 127) - 1)),
|
||||||
psi: Some(pallas::Base::from_u128((1 << 127) - 1)),
|
psi: Some(pallas::Base::from_u128((1 << 127) - 1)),
|
||||||
},
|
},
|
||||||
// `rho` = 2^127, `psi` = 2^127
|
// `rho` = 2^127, `psi` = 2^127
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::zero()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::zero()),
|
||||||
rho: Some(pallas::Base::from_u128(1 << 127)),
|
rho: Some(pallas::Base::from_u128(1 << 127)),
|
||||||
psi: Some(pallas::Base::from_u128(1 << 127)),
|
psi: Some(pallas::Base::from_u128(1 << 127)),
|
||||||
},
|
},
|
||||||
// `rho` = 2^254 - 1, `psi` = 2^254 - 1
|
// `rho` = 2^254 - 1, `psi` = 2^254 - 1
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::one()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::one()),
|
||||||
rho: Some(two_pow_254 - pallas::Base::one()),
|
rho: Some(two_pow_254 - pallas::Base::one()),
|
||||||
psi: Some(two_pow_254 - pallas::Base::one()),
|
psi: Some(two_pow_254 - pallas::Base::one()),
|
||||||
},
|
},
|
||||||
// `rho` = 2^254, `psi` = 2^254
|
// `rho` = 2^254, `psi` = 2^254
|
||||||
MyCircuit {
|
MyCircuit {
|
||||||
gd_x: Some(-pallas::Base::one()),
|
gd_x: Some(-pallas::Base::one()),
|
||||||
|
gd_y_lsb: Some(pallas::Base::one()),
|
||||||
pkd_x: Some(-pallas::Base::one()),
|
pkd_x: Some(-pallas::Base::one()),
|
||||||
|
pkd_y_lsb: Some(pallas::Base::zero()),
|
||||||
rho: Some(two_pow_254),
|
rho: Some(two_pow_254),
|
||||||
psi: Some(two_pow_254),
|
psi: Some(two_pow_254),
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue