mirror of https://github.com/zcash/halo2.git
Replace OrchardFixedBases enum with newtypes
Co-authored-by: Kris Nuttycombe <kris@electriccoin.co>
This commit is contained in:
parent
e26b6c6123
commit
13d7da3c45
|
@ -56,66 +56,47 @@ pub const NUM_WINDOWS_SHORT: usize =
|
|||
/// Number of bits used in complete addition (for variable-base scalar mul)
|
||||
pub const NUM_COMPLETE_BITS: usize = 3;
|
||||
|
||||
pub trait OrchardFixedBases {
|
||||
fn name(&self) -> &[u8];
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum OrchardFixedBases<C: CurveAffine> {
|
||||
CommitIvkR(OrchardFixedBase<C>),
|
||||
NoteCommitR(OrchardFixedBase<C>),
|
||||
NullifierK(OrchardFixedBase<C>),
|
||||
ValueCommitR(OrchardFixedBase<C>),
|
||||
ValueCommitV(OrchardFixedBase<C>),
|
||||
}
|
||||
|
||||
impl<C: CurveAffine> std::hash::Hash for OrchardFixedBases<C> {
|
||||
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||
match *self {
|
||||
OrchardFixedBases::CommitIvkR(_) => state.write(self.variant()),
|
||||
OrchardFixedBases::NoteCommitR(_) => state.write(self.variant()),
|
||||
OrchardFixedBases::NullifierK(_) => state.write(self.variant()),
|
||||
OrchardFixedBases::ValueCommitR(_) => state.write(self.variant()),
|
||||
OrchardFixedBases::ValueCommitV(_) => state.write(self.variant()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: CurveAffine> OrchardFixedBases<C> {
|
||||
pub fn inner(&self) -> OrchardFixedBase<C> {
|
||||
match self {
|
||||
Self::CommitIvkR(inner) => *inner,
|
||||
Self::NoteCommitR(inner) => *inner,
|
||||
Self::NullifierK(inner) => *inner,
|
||||
Self::ValueCommitR(inner) => *inner,
|
||||
Self::ValueCommitV(inner) => *inner,
|
||||
pub struct CommitIvkR<C: CurveAffine>(pub OrchardFixedBase<C>);
|
||||
impl<C: CurveAffine> OrchardFixedBases for CommitIvkR<C> {
|
||||
fn name(&self) -> &[u8] {
|
||||
b"CommitIvkR"
|
||||
}
|
||||
}
|
||||
|
||||
pub fn variant(&self) -> &[u8] {
|
||||
match *self {
|
||||
OrchardFixedBases::CommitIvkR(_) => b"CommitIvkR",
|
||||
OrchardFixedBases::NoteCommitR(_) => b"NoteCommitR",
|
||||
OrchardFixedBases::NullifierK(_) => b"NullifierK",
|
||||
OrchardFixedBases::ValueCommitR(_) => b"ValueCommitR",
|
||||
OrchardFixedBases::ValueCommitV(_) => b"ValueCommitV",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: CurveAffine> PartialEq for OrchardFixedBases<C> {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
self.inner() == other.inner()
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct NoteCommitR<C: CurveAffine>(pub OrchardFixedBase<C>);
|
||||
impl<C: CurveAffine> OrchardFixedBases for NoteCommitR<C> {
|
||||
fn name(&self) -> &[u8] {
|
||||
b"NoteCommitR"
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: CurveAffine> Eq for OrchardFixedBases<C> {}
|
||||
|
||||
impl<C: CurveAffine> PartialOrd for OrchardFixedBases<C> {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
self.variant().partial_cmp(&other.variant())
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct NullifierK<C: CurveAffine>(pub OrchardFixedBase<C>);
|
||||
impl<C: CurveAffine> OrchardFixedBases for NullifierK<C> {
|
||||
fn name(&self) -> &[u8] {
|
||||
b"NullifierK"
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: CurveAffine> Ord for OrchardFixedBases<C> {
|
||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||
self.variant().cmp(&other.variant())
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct ValueCommitR<C: CurveAffine>(pub OrchardFixedBase<C>);
|
||||
impl<C: CurveAffine> OrchardFixedBases for ValueCommitR<C> {
|
||||
fn name(&self) -> &[u8] {
|
||||
b"ValueCommitR"
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct ValueCommitV<C: CurveAffine>(pub OrchardFixedBase<C>);
|
||||
impl<C: CurveAffine> OrchardFixedBases for ValueCommitV<C> {
|
||||
fn name(&self) -> &[u8] {
|
||||
b"ValueCommitV"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use super::{OrchardFixedBase, OrchardFixedBases, COMMIT_IVK_PERSONALIZATION};
|
||||
use super::{CommitIvkR, OrchardFixedBase, COMMIT_IVK_PERSONALIZATION};
|
||||
use halo2::arithmetic::{CurveAffine, FieldExt};
|
||||
|
||||
pub const PERSONALIZATION: &str = COMMIT_IVK_PERSONALIZATION;
|
||||
|
@ -3678,8 +3678,8 @@ pub const U_SHORT: [[[u8; 32]; super::H]; super::NUM_WINDOWS_SHORT] = [
|
|||
],
|
||||
];
|
||||
|
||||
pub fn generator<C: CurveAffine>() -> OrchardFixedBases<C> {
|
||||
OrchardFixedBases::CommitIvkR(OrchardFixedBase::<C>::new(
|
||||
pub fn generator<C: CurveAffine>() -> CommitIvkR<C> {
|
||||
CommitIvkR(OrchardFixedBase::<C>::new(
|
||||
C::from_xy(
|
||||
C::Base::from_bytes(&GENERATOR.0).unwrap(),
|
||||
C::Base::from_bytes(&GENERATOR.1).unwrap(),
|
||||
|
@ -3712,38 +3712,24 @@ mod tests {
|
|||
#[test]
|
||||
fn lagrange_coeffs() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::CommitIvkR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lagrange_coeffs_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::CommitIvkR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS_SHORT),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS_SHORT);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::CommitIvkR(inner) => inner.test_z(&Z, &U, NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z, &U, NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::CommitIvkR(inner) => {
|
||||
inner.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use super::{OrchardFixedBase, OrchardFixedBases, NOTE_COMMITMENT_PERSONALIZATION};
|
||||
use super::{NoteCommitR, OrchardFixedBase, NOTE_COMMITMENT_PERSONALIZATION};
|
||||
use halo2::arithmetic::{CurveAffine, FieldExt};
|
||||
|
||||
pub const PERSONALIZATION: &str = NOTE_COMMITMENT_PERSONALIZATION;
|
||||
|
@ -3678,8 +3678,8 @@ pub const U_SHORT: [[[u8; 32]; super::H]; super::NUM_WINDOWS_SHORT] = [
|
|||
],
|
||||
];
|
||||
|
||||
pub fn generator<C: CurveAffine>() -> OrchardFixedBases<C> {
|
||||
OrchardFixedBases::NoteCommitR(OrchardFixedBase::<C>::new(
|
||||
pub fn generator<C: CurveAffine>() -> NoteCommitR<C> {
|
||||
NoteCommitR(OrchardFixedBase::<C>::new(
|
||||
C::from_xy(
|
||||
C::Base::from_bytes(&GENERATOR.0).unwrap(),
|
||||
C::Base::from_bytes(&GENERATOR.1).unwrap(),
|
||||
|
@ -3712,38 +3712,24 @@ mod tests {
|
|||
#[test]
|
||||
fn lagrange_coeffs() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NoteCommitR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lagrange_coeffs_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NoteCommitR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS_SHORT),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS_SHORT);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NoteCommitR(inner) => inner.test_z(&Z, &U, NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z, &U, NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NoteCommitR(inner) => {
|
||||
inner.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use crate::constants::{OrchardFixedBase, OrchardFixedBases, ORCHARD_PERSONALIZATION};
|
||||
use crate::constants::{NullifierK, OrchardFixedBase, ORCHARD_PERSONALIZATION};
|
||||
use halo2::arithmetic::{CurveAffine, FieldExt};
|
||||
|
||||
pub const PERSONALIZATION: &str = ORCHARD_PERSONALIZATION;
|
||||
|
@ -3677,8 +3677,8 @@ pub const U_SHORT: [[[u8; 32]; super::H]; super::NUM_WINDOWS_SHORT] = [
|
|||
],
|
||||
];
|
||||
|
||||
pub fn generator<C: CurveAffine>() -> OrchardFixedBases<C> {
|
||||
OrchardFixedBases::NullifierK(OrchardFixedBase::<C>::new(
|
||||
pub fn generator<C: CurveAffine>() -> NullifierK<C> {
|
||||
NullifierK(OrchardFixedBase::<C>::new(
|
||||
C::from_xy(
|
||||
C::Base::from_bytes(&GENERATOR.0).unwrap(),
|
||||
C::Base::from_bytes(&GENERATOR.1).unwrap(),
|
||||
|
@ -3710,38 +3710,24 @@ mod tests {
|
|||
#[test]
|
||||
fn lagrange_coeffs() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NullifierK(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lagrange_coeffs_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NullifierK(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS_SHORT),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS_SHORT);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NullifierK(inner) => inner.test_z(&Z, &U, NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z, &U, NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::NullifierK(inner) => {
|
||||
inner.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,8 +37,9 @@ pub fn decompose_scalar_fixed<C: CurveAffine>(
|
|||
|
||||
/// Evaluate y = f(x) given the coefficients of f(x)
|
||||
pub fn evaluate<C: CurveAffine>(x: u8, coeffs: &[C::Base]) -> C::Base {
|
||||
(0..coeffs.len())
|
||||
.zip(coeffs.iter())
|
||||
coeffs
|
||||
.iter()
|
||||
.enumerate()
|
||||
.fold(C::Base::default(), |acc, (pow, coeff)| {
|
||||
acc + (*coeff) * C::Base::from_u64(x as u64).pow(&[pow as u64, 0, 0, 0])
|
||||
})
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use super::{OrchardFixedBase, OrchardFixedBases, VALUE_COMMITMENT_PERSONALIZATION};
|
||||
use super::{OrchardFixedBase, ValueCommitR, VALUE_COMMITMENT_PERSONALIZATION};
|
||||
use halo2::arithmetic::{CurveAffine, FieldExt};
|
||||
|
||||
pub const PERSONALIZATION: &str = VALUE_COMMITMENT_PERSONALIZATION;
|
||||
|
@ -3679,8 +3679,8 @@ pub const U_SHORT: [[[u8; 32]; super::H]; super::NUM_WINDOWS_SHORT] = [
|
|||
],
|
||||
];
|
||||
|
||||
pub fn generator<C: CurveAffine>() -> OrchardFixedBases<C> {
|
||||
OrchardFixedBases::ValueCommitR(OrchardFixedBase::<C>::new(
|
||||
pub fn generator<C: CurveAffine>() -> ValueCommitR<C> {
|
||||
ValueCommitR(OrchardFixedBase::<C>::new(
|
||||
C::from_xy(
|
||||
C::Base::from_bytes(&GENERATOR.0).unwrap(),
|
||||
C::Base::from_bytes(&GENERATOR.1).unwrap(),
|
||||
|
@ -3712,38 +3712,24 @@ mod tests {
|
|||
#[test]
|
||||
fn lagrange_coeffs() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lagrange_coeffs_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitR(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS_SHORT),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS_SHORT);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitR(inner) => inner.test_z(&Z, &U, NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z, &U, NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitR(inner) => {
|
||||
inner.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use super::{OrchardFixedBase, OrchardFixedBases, VALUE_COMMITMENT_PERSONALIZATION};
|
||||
use super::{OrchardFixedBase, ValueCommitV, VALUE_COMMITMENT_PERSONALIZATION};
|
||||
use halo2::arithmetic::{CurveAffine, FieldExt};
|
||||
|
||||
pub const PERSONALIZATION: &str = VALUE_COMMITMENT_PERSONALIZATION;
|
||||
|
@ -3679,8 +3679,8 @@ pub const U_SHORT: [[[u8; 32]; super::H]; super::NUM_WINDOWS_SHORT] = [
|
|||
],
|
||||
];
|
||||
|
||||
pub fn generator<C: CurveAffine>() -> OrchardFixedBases<C> {
|
||||
OrchardFixedBases::ValueCommitV(OrchardFixedBase::<C>::new(
|
||||
pub fn generator<C: CurveAffine>() -> ValueCommitV<C> {
|
||||
ValueCommitV(OrchardFixedBase::<C>::new(
|
||||
C::from_xy(
|
||||
C::Base::from_bytes(&GENERATOR.0).unwrap(),
|
||||
C::Base::from_bytes(&GENERATOR.1).unwrap(),
|
||||
|
@ -3712,38 +3712,24 @@ mod tests {
|
|||
#[test]
|
||||
fn lagrange_coeffs() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitV(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lagrange_coeffs_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitV(inner) => inner.test_lagrange_coeffs(NUM_WINDOWS_SHORT),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_lagrange_coeffs(NUM_WINDOWS_SHORT);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitV(inner) => inner.test_z(&Z, &U, NUM_WINDOWS),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z, &U, NUM_WINDOWS);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn z_short() {
|
||||
let base = super::generator::<pallas::Affine>();
|
||||
match base {
|
||||
OrchardFixedBases::ValueCommitV(inner) => {
|
||||
inner.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
base.0.test_z(&Z_SHORT, &U_SHORT, NUM_WINDOWS_SHORT);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue