From 13d7da3c453e46f4c623c9ba632c1e1c091918c5 Mon Sep 17 00:00:00 2001 From: therealyingtong Date: Tue, 13 Apr 2021 23:01:07 +0800 Subject: [PATCH] Replace OrchardFixedBases enum with newtypes Co-authored-by: Kris Nuttycombe --- src/constants.rs | 75 ++++++++++++--------------------- src/constants/commit_ivk_r.rs | 28 +++--------- src/constants/note_commit_r.rs | 28 +++--------- src/constants/nullifier_k.rs | 28 +++--------- src/constants/util.rs | 5 ++- src/constants/value_commit_r.rs | 28 +++--------- src/constants/value_commit_v.rs | 28 +++--------- 7 files changed, 66 insertions(+), 154 deletions(-) diff --git a/src/constants.rs b/src/constants.rs index 04f6c74b..8486f81c 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -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 { - CommitIvkR(OrchardFixedBase), - NoteCommitR(OrchardFixedBase), - NullifierK(OrchardFixedBase), - ValueCommitR(OrchardFixedBase), - ValueCommitV(OrchardFixedBase), -} - -impl std::hash::Hash for OrchardFixedBases { - fn hash(&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(pub OrchardFixedBase); +impl OrchardFixedBases for CommitIvkR { + fn name(&self) -> &[u8] { + b"CommitIvkR" } } -impl OrchardFixedBases { - pub fn inner(&self) -> OrchardFixedBase { - 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(pub OrchardFixedBase); +impl OrchardFixedBases for NoteCommitR { + fn name(&self) -> &[u8] { + b"NoteCommitR" } } -impl PartialEq for OrchardFixedBases { - fn eq(&self, other: &Self) -> bool { - self.inner() == other.inner() +#[derive(Copy, Clone, Debug)] +pub struct NullifierK(pub OrchardFixedBase); +impl OrchardFixedBases for NullifierK { + fn name(&self) -> &[u8] { + b"NullifierK" } } -impl Eq for OrchardFixedBases {} - -impl PartialOrd for OrchardFixedBases { - fn partial_cmp(&self, other: &Self) -> Option { - self.variant().partial_cmp(&other.variant()) +#[derive(Copy, Clone, Debug)] +pub struct ValueCommitR(pub OrchardFixedBase); +impl OrchardFixedBases for ValueCommitR { + fn name(&self) -> &[u8] { + b"ValueCommitR" } } -impl Ord for OrchardFixedBases { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.variant().cmp(&other.variant()) +#[derive(Copy, Clone, Debug)] +pub struct ValueCommitV(pub OrchardFixedBase); +impl OrchardFixedBases for ValueCommitV { + fn name(&self) -> &[u8] { + b"ValueCommitV" } } diff --git a/src/constants/commit_ivk_r.rs b/src/constants/commit_ivk_r.rs index f0ad2ca5..2535034f 100644 --- a/src/constants/commit_ivk_r.rs +++ b/src/constants/commit_ivk_r.rs @@ -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() -> OrchardFixedBases { - OrchardFixedBases::CommitIvkR(OrchardFixedBase::::new( +pub fn generator() -> CommitIvkR { + CommitIvkR(OrchardFixedBase::::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::(); - 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::(); - 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::(); - 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::(); - 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); } } diff --git a/src/constants/note_commit_r.rs b/src/constants/note_commit_r.rs index 90abd4b3..ecdefa63 100644 --- a/src/constants/note_commit_r.rs +++ b/src/constants/note_commit_r.rs @@ -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() -> OrchardFixedBases { - OrchardFixedBases::NoteCommitR(OrchardFixedBase::::new( +pub fn generator() -> NoteCommitR { + NoteCommitR(OrchardFixedBase::::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::(); - 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::(); - 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::(); - 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::(); - 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); } } diff --git a/src/constants/nullifier_k.rs b/src/constants/nullifier_k.rs index 08e50e95..89413dc1 100644 --- a/src/constants/nullifier_k.rs +++ b/src/constants/nullifier_k.rs @@ -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() -> OrchardFixedBases { - OrchardFixedBases::NullifierK(OrchardFixedBase::::new( +pub fn generator() -> NullifierK { + NullifierK(OrchardFixedBase::::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::(); - 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::(); - 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::(); - 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::(); - 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); } } diff --git a/src/constants/util.rs b/src/constants/util.rs index 41a51164..c40c4fd8 100644 --- a/src/constants/util.rs +++ b/src/constants/util.rs @@ -37,8 +37,9 @@ pub fn decompose_scalar_fixed( /// Evaluate y = f(x) given the coefficients of f(x) pub fn evaluate(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]) }) diff --git a/src/constants/value_commit_r.rs b/src/constants/value_commit_r.rs index 38fad852..cca601a7 100644 --- a/src/constants/value_commit_r.rs +++ b/src/constants/value_commit_r.rs @@ -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() -> OrchardFixedBases { - OrchardFixedBases::ValueCommitR(OrchardFixedBase::::new( +pub fn generator() -> ValueCommitR { + ValueCommitR(OrchardFixedBase::::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::(); - 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::(); - 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::(); - 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::(); - 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); } } diff --git a/src/constants/value_commit_v.rs b/src/constants/value_commit_v.rs index a72bb374..70aefc06 100644 --- a/src/constants/value_commit_v.rs +++ b/src/constants/value_commit_v.rs @@ -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() -> OrchardFixedBases { - OrchardFixedBases::ValueCommitV(OrchardFixedBase::::new( +pub fn generator() -> ValueCommitV { + ValueCommitV(OrchardFixedBase::::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::(); - 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::(); - 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::(); - 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::(); - 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); } }