Replace OrchardFixedBases enum with newtypes

Co-authored-by: Kris Nuttycombe <kris@electriccoin.co>
This commit is contained in:
therealyingtong 2021-04-13 23:01:07 +08:00
parent e26b6c6123
commit 13d7da3c45
7 changed files with 66 additions and 154 deletions

View File

@ -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()),
}
pub struct CommitIvkR<C: CurveAffine>(pub OrchardFixedBase<C>);
impl<C: CurveAffine> OrchardFixedBases for CommitIvkR<C> {
fn name(&self) -> &[u8] {
b"CommitIvkR"
}
}
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 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",
}
#[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> PartialEq for OrchardFixedBases<C> {
fn eq(&self, other: &Self) -> bool {
self.inner() == other.inner()
#[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> 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 ValueCommitR<C: CurveAffine>(pub OrchardFixedBase<C>);
impl<C: CurveAffine> OrchardFixedBases for ValueCommitR<C> {
fn name(&self) -> &[u8] {
b"ValueCommitR"
}
}
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 ValueCommitV<C: CurveAffine>(pub OrchardFixedBase<C>);
impl<C: CurveAffine> OrchardFixedBases for ValueCommitV<C> {
fn name(&self) -> &[u8] {
b"ValueCommitV"
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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])
})

View File

@ -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);
}
}

View File

@ -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);
}
}