diff --git a/zebra-chain/src/orchard/address.rs b/zebra-chain/src/orchard/address.rs index 146da3380..2da7a5dc2 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 6ba993756..3db224785 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 c7f12fa49..8f8bd6cfe 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);