Update SproutShieldedAddress types
Use magics module. Stub out key types, including a TransmissionKey alias for x25519_dalek::PublicKey
This commit is contained in:
parent
01afa09575
commit
c3700c1a37
|
@ -3,9 +3,7 @@
|
|||
use std::{fmt, io};
|
||||
|
||||
use bs58;
|
||||
use ripemd160::{Digest, Ripemd160};
|
||||
use sha2::Sha256;
|
||||
use x25519_dalek;
|
||||
|
||||
#[cfg(test)]
|
||||
use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*};
|
||||
|
@ -18,6 +16,13 @@ use crate::{
|
|||
Network,
|
||||
};
|
||||
|
||||
/// Magic numbers used to identify what networks Sprout Shielded
|
||||
/// Addresses are associated with.
|
||||
mod magics {
|
||||
pub const MAINNET: [u8; 2] = [0x16, 0x9A];
|
||||
pub const TESTNET: [u8; 2] = [0x16, 0xB6];
|
||||
}
|
||||
|
||||
/// Sprout Shielded Payment Addresses
|
||||
///
|
||||
/// In Bitcoin a single byte is used for the version field identifying
|
||||
|
@ -29,11 +34,11 @@ use crate::{
|
|||
/// to a Bitcoin address just by removing the “t”.)
|
||||
///
|
||||
/// https://zips.z.cash/protocol/protocol.pdf#transparentaddrencoding
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct SproutShieldedAddress {
|
||||
network: Network,
|
||||
paying_key: sprout::PayingKey,
|
||||
transmission_key: x25519_dalek::PublicKey,
|
||||
transmission_key: sprout::TransmissionKey,
|
||||
}
|
||||
|
||||
impl fmt::Debug for SproutShieldedAddress {
|
||||
|
@ -50,13 +55,11 @@ impl fmt::Debug for SproutShieldedAddress {
|
|||
impl ZcashSerialize for SproutShieldedAddress {
|
||||
fn zcash_serialize<W: io::Write>(&self, mut writer: W) -> Result<(), io::Error> {
|
||||
if self.network == Network::Mainnet {
|
||||
writer.write_all(&[0x16, 0x9A][..])?
|
||||
writer.write_all(&magics::MAINNET[..])?
|
||||
} else {
|
||||
writer.write_all(&[0x16, 0xB6][..])?
|
||||
writer.write_all(&magics::TESTNET[..])?
|
||||
}
|
||||
writer.write_all(&self.paying_key.0[..])?;
|
||||
// XXX revisit to see if we want to impl ZcashSerialize on
|
||||
// x25519_dalek::PublicKey
|
||||
writer.write_all(self.transmission_key.as_bytes())?;
|
||||
|
||||
Ok(())
|
||||
|
@ -69,8 +72,8 @@ impl ZcashDeserialize for SproutShieldedAddress {
|
|||
reader.read_exact(&mut version_bytes)?;
|
||||
|
||||
let network = match version_bytes {
|
||||
[0x16, 0x9A] => Network::Mainnet,
|
||||
[0x16, 0xB6] => Network::Testnet,
|
||||
magics::MAINNET => Network::Mainnet,
|
||||
magics::TESTNET => Network::Testnet,
|
||||
_ => panic!(SerializationError::Parse(
|
||||
"bad sprout shielded addr version/type",
|
||||
)),
|
||||
|
@ -79,7 +82,7 @@ impl ZcashDeserialize for SproutShieldedAddress {
|
|||
Ok(SproutShieldedAddress {
|
||||
network,
|
||||
paying_key: sprout::PayingKey(reader.read_32_bytes()?),
|
||||
transmission_key: sprout::TransmissionKey(reader.read_32_bytes()?),
|
||||
transmission_key: sprout::TransmissionKey::from(reader.read_32_bytes()?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,12 +21,17 @@ use crate::serialization::{SerializationError, ZcashDeserialize, ZcashSerialize}
|
|||
/// All other Sprout key types derive from the SpendingKey value.
|
||||
pub struct SpendingKey;
|
||||
|
||||
///
|
||||
pub struct ReceivingKey;
|
||||
|
||||
pub struct PayingKey;
|
||||
///
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
pub struct PayingKey(pub [u8; 32]);
|
||||
|
||||
pub struct TransmissionKey;
|
||||
///
|
||||
pub type TransmissionKey = x25519_dalek::PublicKey;
|
||||
|
||||
///
|
||||
pub struct IncomingViewingKey {
|
||||
paying_key: PayingKey,
|
||||
receiving_key: ReceivingKey,
|
||||
|
|
Loading…
Reference in New Issue