Tidy up network handling for Orchard keys/addresses
This commit is contained in:
parent
ee2c3af937
commit
d7d8986849
|
@ -64,10 +64,11 @@ mod tests {
|
||||||
fn derive_keys_and_addresses() {
|
fn derive_keys_and_addresses() {
|
||||||
zebra_test::init();
|
zebra_test::init();
|
||||||
|
|
||||||
let spending_key = keys::SpendingKey::new(&mut OsRng);
|
let network = Network::Mainnet;
|
||||||
|
|
||||||
let full_viewing_key =
|
let spending_key = keys::SpendingKey::new(&mut OsRng, network);
|
||||||
keys::FullViewingKey::from_spending_key(spending_key, Network::Mainnet);
|
|
||||||
|
let full_viewing_key = keys::FullViewingKey::from_spending_key(spending_key);
|
||||||
|
|
||||||
// Default diversifier, where index = 0.
|
// Default diversifier, where index = 0.
|
||||||
let diversifier_key = keys::DiversifierKey::from(full_viewing_key);
|
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 transmission_key = keys::TransmissionKey::from((incoming_viewing_key, diversifier));
|
||||||
|
|
||||||
let _orchard_shielded_address = Address {
|
let _orchard_shielded_address = Address {
|
||||||
network: Network::Mainnet,
|
network,
|
||||||
diversifier,
|
diversifier,
|
||||||
transmission_key,
|
transmission_key,
|
||||||
};
|
};
|
||||||
|
|
|
@ -144,16 +144,6 @@ pub struct SpendingKey {
|
||||||
bytes: [u8; 32],
|
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] {
|
impl From<SpendingKey> for [u8; 32] {
|
||||||
fn from(sk: SpendingKey) -> Self {
|
fn from(sk: SpendingKey) -> Self {
|
||||||
sk.bytes
|
sk.bytes
|
||||||
|
@ -203,7 +193,7 @@ impl SpendingKey {
|
||||||
/// is not zero, else fail.
|
/// is not zero, else fail.
|
||||||
///
|
///
|
||||||
/// [orchardkeycomponents]: https://zips.z.cash/protocol/nu5.pdf#orchardkeycomponents
|
/// [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
|
where
|
||||||
T: RngCore + CryptoRng,
|
T: RngCore + CryptoRng,
|
||||||
{
|
{
|
||||||
|
@ -211,7 +201,7 @@ impl SpendingKey {
|
||||||
let mut bytes = [0u8; 32];
|
let mut bytes = [0u8; 32];
|
||||||
csprng.fill_bytes(&mut bytes);
|
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 ask = 0, discard this key and repeat with a new sk"
|
||||||
if SpendAuthorizingKey::from(sk).0 == pallas::Scalar::zero() {
|
if SpendAuthorizingKey::from(sk).0 == pallas::Scalar::zero() {
|
||||||
|
@ -221,6 +211,11 @@ impl SpendingKey {
|
||||||
break sk;
|
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
|
/// 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#addressesandkeys
|
||||||
/// https://zips.z.cash/protocol/nu5.pdf#orchardfullviewingkeyencoding
|
/// 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);
|
let spend_authorizing_key = SpendAuthorizingKey::from(sk);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
network,
|
network: sk.network,
|
||||||
spend_validating_key: SpendValidatingKey::from(spend_authorizing_key),
|
spend_validating_key: SpendValidatingKey::from(spend_authorizing_key),
|
||||||
nullifier_deriving_key: NullifierDerivingKey::from(sk),
|
nullifier_deriving_key: NullifierDerivingKey::from(sk),
|
||||||
ivk_commit_randomness: IvkCommitRandomness::from(sk),
|
ivk_commit_randomness: IvkCommitRandomness::from(sk),
|
||||||
|
|
|
@ -11,8 +11,7 @@ impl Arbitrary for TransmissionKey {
|
||||||
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
|
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
|
||||||
(any::<SpendingKey>())
|
(any::<SpendingKey>())
|
||||||
.prop_map(|spending_key| {
|
.prop_map(|spending_key| {
|
||||||
let full_viewing_key =
|
let full_viewing_key = FullViewingKey::from_spending_key(spending_key);
|
||||||
FullViewingKey::from_spending_key(spending_key, Network::Mainnet);
|
|
||||||
|
|
||||||
let diversifier_key = DiversifierKey::from(full_viewing_key);
|
let diversifier_key = DiversifierKey::from(full_viewing_key);
|
||||||
|
|
||||||
|
@ -56,9 +55,7 @@ proptest! {
|
||||||
prop_assert_eq![full_viewing_key, full_viewing_key_2];
|
prop_assert_eq![full_viewing_key, full_viewing_key_2];
|
||||||
|
|
||||||
let diversifier_key = DiversifierKey::from(full_viewing_key);
|
let diversifier_key = DiversifierKey::from(full_viewing_key);
|
||||||
|
let incoming_viewing_key = IncomingViewingKey::from(full_viewing_key);
|
||||||
let mut incoming_viewing_key = IncomingViewingKey::from(full_viewing_key);
|
|
||||||
incoming_viewing_key.network = spending_key.network;
|
|
||||||
|
|
||||||
let ivk_string = incoming_viewing_key.to_string();
|
let ivk_string = incoming_viewing_key.to_string();
|
||||||
let incoming_viewing_key_2: IncomingViewingKey = ivk_string.parse().unwrap();
|
let incoming_viewing_key_2: IncomingViewingKey = ivk_string.parse().unwrap();
|
||||||
|
|
Loading…
Reference in New Issue