From d33947b331a8600324e192fed0985a66b802a8b5 Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Tue, 20 Apr 2021 12:54:23 -0400 Subject: [PATCH] Impl FullViewingKey::from_spending_key(SpendingKey, Network) Remove From impl --- zebra-chain/src/orchard/address.rs | 3 ++- zebra-chain/src/orchard/keys.rs | 31 +++++++++++++-------------- zebra-chain/src/orchard/keys/tests.rs | 3 ++- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/zebra-chain/src/orchard/address.rs b/zebra-chain/src/orchard/address.rs index 146da338..2da7a5dc 100644 --- a/zebra-chain/src/orchard/address.rs +++ b/zebra-chain/src/orchard/address.rs @@ -66,7 +66,8 @@ mod tests { let spending_key = keys::SpendingKey::new(&mut OsRng); - let full_viewing_key = keys::FullViewingKey::from(spending_key); + let full_viewing_key = + keys::FullViewingKey::from_spending_key(spending_key, Network::Mainnet); // Default diversifier, where index = 0. let diversifier_key = keys::DiversifierKey::from(full_viewing_key); diff --git a/zebra-chain/src/orchard/keys.rs b/zebra-chain/src/orchard/keys.rs index 6ba99375..3db22478 100644 --- a/zebra-chain/src/orchard/keys.rs +++ b/zebra-chain/src/orchard/keys.rs @@ -568,8 +568,6 @@ pub struct FullViewingKey { ivk_commit_randomness: IvkCommitRandomness, } -// TODO: impl a From that accepts a Network? - impl fmt::Debug for FullViewingKey { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("FullViewingKey") @@ -598,20 +596,6 @@ impl fmt::Display for FullViewingKey { } } -impl From for FullViewingKey { - fn from(sk: SpendingKey) -> FullViewingKey { - let spend_authorizing_key = SpendAuthorizingKey::from(sk); - - Self { - // TODO: handle setting the Network better. - network: Network::default(), - spend_validating_key: SpendValidatingKey::from(spend_authorizing_key), - nullifier_deriving_key: NullifierDerivingKey::from(sk), - ivk_commit_randomness: IvkCommitRandomness::from(sk), - } - } -} - impl FromStr for FullViewingKey { type Err = SerializationError; @@ -657,6 +641,21 @@ impl FullViewingKey { // let R = PRF^expand_K( [0x82] || I2LEOSP256(ak) || I2LEOSP256(nk) ) prf_expand(K, t) } + + /// Derive a full viewing key from a existing spending key and its network. + /// + /// https://zips.z.cash/protocol/nu5.pdf#addressesandkeys + /// https://zips.z.cash/protocol/nu5.pdf#orchardfullviewingkeyencoding + pub fn from_spending_key(sk: SpendingKey, network: Network) -> FullViewingKey { + let spend_authorizing_key = SpendAuthorizingKey::from(sk); + + Self { + network, + spend_validating_key: SpendValidatingKey::from(spend_authorizing_key), + nullifier_deriving_key: NullifierDerivingKey::from(sk), + ivk_commit_randomness: IvkCommitRandomness::from(sk), + } + } } /// An outgoing viewing key, as described in [protocol specification diff --git a/zebra-chain/src/orchard/keys/tests.rs b/zebra-chain/src/orchard/keys/tests.rs index c7f12fa4..8f8bd6cf 100644 --- a/zebra-chain/src/orchard/keys/tests.rs +++ b/zebra-chain/src/orchard/keys/tests.rs @@ -11,7 +11,8 @@ impl Arbitrary for TransmissionKey { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { (any::()) .prop_map(|spending_key| { - let full_viewing_key = FullViewingKey::from(spending_key); + let full_viewing_key = + FullViewingKey::from_spending_key(spending_key, Network::Mainnet); let diversifier_key = DiversifierKey::from(full_viewing_key);