Tidy up network handling for Orchard keys/addresses

This commit is contained in:
Deirdre Connolly 2021-04-23 23:17:01 -04:00
parent ee2c3af937
commit d7d8986849
3 changed files with 16 additions and 23 deletions

View File

@ -64,10 +64,11 @@ mod tests {
fn derive_keys_and_addresses() {
zebra_test::init();
let spending_key = keys::SpendingKey::new(&mut OsRng);
let network = Network::Mainnet;
let full_viewing_key =
keys::FullViewingKey::from_spending_key(spending_key, Network::Mainnet);
let spending_key = keys::SpendingKey::new(&mut OsRng, network);
let full_viewing_key = keys::FullViewingKey::from_spending_key(spending_key);
// Default diversifier, where index = 0.
let diversifier_key = keys::DiversifierKey::from(full_viewing_key);
@ -78,7 +79,7 @@ mod tests {
let transmission_key = keys::TransmissionKey::from((incoming_viewing_key, diversifier));
let _orchard_shielded_address = Address {
network: Network::Mainnet,
network,
diversifier,
transmission_key,
};

View File

@ -144,16 +144,6 @@ pub struct SpendingKey {
bytes: [u8; 32],
}
impl From<[u8; 32]> for SpendingKey {
/// Generate a _SpendingKey_ from existing bytes.
fn from(bytes: [u8; 32]) -> Self {
Self {
network: Network::default(),
bytes,
}
}
}
impl From<SpendingKey> for [u8; 32] {
fn from(sk: SpendingKey) -> Self {
sk.bytes
@ -203,7 +193,7 @@ impl SpendingKey {
/// is not zero, else fail.
///
/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents
pub fn new<T>(csprng: &mut T) -> Self
pub fn new<T>(csprng: &mut T, network: Network) -> Self
where
T: RngCore + CryptoRng,
{
@ -211,7 +201,7 @@ impl SpendingKey {
let mut bytes = [0u8; 32];
csprng.fill_bytes(&mut bytes);
let sk = Self::from(bytes);
let sk = Self::from_bytes(bytes, network);
// "if ask = 0, discard this key and repeat with a new sk"
if SpendAuthorizingKey::from(sk).0 == pallas::Scalar::zero() {
@ -221,6 +211,11 @@ impl SpendingKey {
break sk;
}
}
/// Generate a `SpendingKey` from existing bytes.
fn from_bytes(bytes: [u8; 32], network: Network) -> Self {
Self { network, bytes }
}
}
/// A Spend authorizing key (_ask_), as described in [protocol specification
@ -643,11 +638,11 @@ impl FullViewingKey {
///
/// 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 {
pub fn from_spending_key(sk: SpendingKey) -> FullViewingKey {
let spend_authorizing_key = SpendAuthorizingKey::from(sk);
Self {
network,
network: sk.network,
spend_validating_key: SpendValidatingKey::from(spend_authorizing_key),
nullifier_deriving_key: NullifierDerivingKey::from(sk),
ivk_commit_randomness: IvkCommitRandomness::from(sk),

View File

@ -11,8 +11,7 @@ impl Arbitrary for TransmissionKey {
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
(any::<SpendingKey>())
.prop_map(|spending_key| {
let full_viewing_key =
FullViewingKey::from_spending_key(spending_key, Network::Mainnet);
let full_viewing_key = FullViewingKey::from_spending_key(spending_key);
let diversifier_key = DiversifierKey::from(full_viewing_key);
@ -56,9 +55,7 @@ proptest! {
prop_assert_eq![full_viewing_key, full_viewing_key_2];
let diversifier_key = DiversifierKey::from(full_viewing_key);
let mut incoming_viewing_key = IncomingViewingKey::from(full_viewing_key);
incoming_viewing_key.network = spending_key.network;
let incoming_viewing_key = IncomingViewingKey::from(full_viewing_key);
let ivk_string = incoming_viewing_key.to_string();
let incoming_viewing_key_2: IncomingViewingKey = ivk_string.parse().unwrap();