From b15343f6f714439129c98dc3783d452b88093578 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 16 Jun 2021 16:01:30 +0100 Subject: [PATCH] Add `OrchardFixedBasesFull::{generator, u}` methods Using these in `OrchardFixedBases::{generator, u}` instead of the `impl From for OrchardFixedBase` means we avoid computing the Lagrange coefficients for the generator (which were then immediately dropped). This decreases proving time in the Action circuit by 53%. --- src/circuit/gadget/ecc/chip/mul_fixed.rs | 10 ++-------- src/constants/load.rs | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/circuit/gadget/ecc/chip/mul_fixed.rs b/src/circuit/gadget/ecc/chip/mul_fixed.rs index 13c50187..2c57cded 100644 --- a/src/circuit/gadget/ecc/chip/mul_fixed.rs +++ b/src/circuit/gadget/ecc/chip/mul_fixed.rs @@ -48,20 +48,14 @@ impl OrchardFixedBases { pub fn generator(self) -> pallas::Affine { match self { Self::ValueCommitV => constants::value_commit_v::generator(), - Self::Full(base) => { - let base: OrchardFixedBase = base.into(); - base.generator - } + Self::Full(base) => base.generator(), } } pub fn u(self) -> Vec { match self { Self::ValueCommitV => ValueCommitV::get().u_short.0.as_ref().to_vec(), - Self::Full(base) => { - let base: OrchardFixedBase = base.into(); - base.u.0.as_ref().to_vec() - } + Self::Full(base) => base.u().0.as_ref().to_vec(), } } } diff --git a/src/constants/load.rs b/src/constants/load.rs index e18b3b22..60a28b14 100644 --- a/src/constants/load.rs +++ b/src/constants/load.rs @@ -12,6 +12,28 @@ pub enum OrchardFixedBasesFull { SpendAuthG, } +impl OrchardFixedBasesFull { + pub fn generator(&self) -> pallas::Affine { + match self { + OrchardFixedBasesFull::CommitIvkR => super::commit_ivk_r::generator(), + OrchardFixedBasesFull::NoteCommitR => super::note_commit_r::generator(), + OrchardFixedBasesFull::NullifierK => super::nullifier_k::generator(), + OrchardFixedBasesFull::ValueCommitR => super::value_commit_r::generator(), + OrchardFixedBasesFull::SpendAuthG => super::spend_auth_g::generator(), + } + } + + pub fn u(&self) -> U { + match self { + OrchardFixedBasesFull::CommitIvkR => super::commit_ivk_r::U.into(), + OrchardFixedBasesFull::NoteCommitR => super::note_commit_r::U.into(), + OrchardFixedBasesFull::NullifierK => super::nullifier_k::U.into(), + OrchardFixedBasesFull::ValueCommitR => super::value_commit_r::U.into(), + OrchardFixedBasesFull::SpendAuthG => super::spend_auth_g::U.into(), + } + } +} + /// A fixed base to be used in scalar multiplication with a full-width scalar. #[derive(Clone, Debug, Eq, PartialEq)] pub struct OrchardFixedBase {