chain: extract sprout code into sprout module.

This commit is contained in:
Henry de Valence 2020-08-15 18:36:01 -07:00
parent e06f59ee21
commit 312c66264a
19 changed files with 42 additions and 53 deletions

View File

@ -1,4 +1,3 @@
//! Address types. //! Address types.
pub mod sprout;
pub mod transparent; pub mod transparent;

View File

@ -1,3 +0,0 @@
//! Note and value commitments and associated types.
pub mod sprout;

View File

@ -1,4 +1,3 @@
//! Key types. //! Key types.
pub mod sprout;
pub mod transparent; pub mod transparent;

View File

@ -14,11 +14,8 @@ extern crate serde;
mod merkle_tree; mod merkle_tree;
pub mod addresses; pub mod addresses;
pub mod commitments;
pub mod keys; pub mod keys;
pub mod notes; pub mod notes;
pub mod treestate;
pub mod types;
pub mod amount; pub mod amount;
pub mod block; pub mod block;

View File

@ -3,5 +3,3 @@
#[cfg(test)] #[cfg(test)]
mod arbitrary; mod arbitrary;
pub mod memo; pub mod memo;
pub mod sprout;

View File

@ -1 +1,7 @@
//! Sprout-related functionality.
pub mod address;
pub mod commitment;
pub mod keys;
pub mod note;
pub mod tree;

View File

@ -6,11 +6,12 @@ use std::{fmt, io};
use proptest::{arbitrary::Arbitrary, array, prelude::*}; use proptest::{arbitrary::Arbitrary, array, prelude::*};
use crate::{ use crate::{
keys::sprout,
parameters::Network, parameters::Network,
serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize}, serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize},
}; };
use super::keys;
/// Magic numbers used to identify what networks Sprout Shielded /// Magic numbers used to identify what networks Sprout Shielded
/// Addresses are associated with. /// Addresses are associated with.
mod magics { mod magics {
@ -24,8 +25,8 @@ mod magics {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct SproutShieldedAddress { pub struct SproutShieldedAddress {
network: Network, network: Network,
paying_key: sprout::PayingKey, paying_key: keys::PayingKey,
transmission_key: sprout::TransmissionKey, transmission_key: keys::TransmissionKey,
} }
impl fmt::Debug for SproutShieldedAddress { impl fmt::Debug for SproutShieldedAddress {
@ -80,8 +81,8 @@ impl ZcashDeserialize for SproutShieldedAddress {
Ok(SproutShieldedAddress { Ok(SproutShieldedAddress {
network, network,
paying_key: sprout::PayingKey(reader.read_32_bytes()?), paying_key: keys::PayingKey(reader.read_32_bytes()?),
transmission_key: sprout::TransmissionKey::from(reader.read_32_bytes()?), transmission_key: keys::TransmissionKey::from(reader.read_32_bytes()?),
}) })
} }
} }
@ -121,8 +122,8 @@ impl Arbitrary for SproutShieldedAddress {
) )
.prop_map(|(network, paying_key_bytes, transmission_key_bytes)| Self { .prop_map(|(network, paying_key_bytes, transmission_key_bytes)| Self {
network, network,
paying_key: sprout::PayingKey(paying_key_bytes), paying_key: keys::PayingKey(paying_key_bytes),
transmission_key: sprout::TransmissionKey::from(transmission_key_bytes), transmission_key: keys::TransmissionKey::from(transmission_key_bytes),
}) })
.boxed() .boxed()
} }

View File

@ -4,7 +4,7 @@
use sha2::{Digest, Sha256}; use sha2::{Digest, Sha256};
use crate::notes::sprout::Note; use super::note::Note;
/// The randomness used in the Pedersen Hash for note commitment. /// The randomness used in the Pedersen Hash for note commitment.
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]

View File

@ -6,15 +6,18 @@
#[cfg(test)] #[cfg(test)]
mod arbitrary; mod arbitrary;
mod ciphertexts; mod ciphertexts;
mod mac;
mod nullifiers; mod nullifiers;
use crate::{ use crate::{
amount::{Amount, NonNegative}, amount::{Amount, NonNegative},
commitments::sprout::CommitmentRandomness,
keys::sprout::PayingKey,
notes::memo::Memo, notes::memo::Memo,
}; };
use super::{commitment::CommitmentRandomness, keys::PayingKey};
pub use mac::MAC;
pub use ciphertexts::EncryptedCiphertext; pub use ciphertexts::EncryptedCiphertext;
pub use nullifiers::{Nullifier, NullifierSeed}; pub use nullifiers::{Nullifier, NullifierSeed};

View File

@ -1,8 +1,7 @@
use proptest::{arbitrary::any, collection::vec, prelude::*}; use proptest::{arbitrary::any, collection::vec, prelude::*};
use crate::notes::sprout;
impl Arbitrary for sprout::EncryptedCiphertext { impl Arbitrary for super::EncryptedCiphertext {
type Parameters = (); type Parameters = ();
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {

View File

@ -1,5 +1,3 @@
//! Newtype wrappers for primitive data types with semantic meaning.
#![allow(clippy::unit_arg)]
use crate::serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize}; use crate::serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize};
use std::io::{self, Read}; use std::io::{self, Read};

View File

@ -3,7 +3,7 @@
use byteorder::{ByteOrder, LittleEndian}; use byteorder::{ByteOrder, LittleEndian};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::keys::sprout::SpendingKey; use super::super::keys::SpendingKey;
/// PRF^nf is used to derive a Sprout nullifer from the receiver's /// PRF^nf is used to derive a Sprout nullifer from the receiver's
/// spending key a_sk and a nullifier seed ρ, instantiated using the /// spending key a_sk and a nullifier seed ρ, instantiated using the

View File

@ -2,9 +2,8 @@ use serde::{Deserialize, Serialize};
use crate::{ use crate::{
amount::{Amount, NonNegative}, amount::{Amount, NonNegative},
notes::sprout, sprout,
primitives::{ed25519, x25519, ZkSnarkProof}, primitives::{ed25519, x25519, ZkSnarkProof},
treestate,
}; };
/// A _JoinSplit Description_, as described in [protocol specification §7.2][ps]. /// A _JoinSplit Description_, as described in [protocol specification §7.2][ps].
@ -22,25 +21,25 @@ pub struct JoinSplit<P: ZkSnarkProof> {
/// A root of the Sprout note commitment tree at some block height in the /// A root of the Sprout note commitment tree at some block height in the
/// past, or the root produced by a previous JoinSplit transfer in this /// past, or the root produced by a previous JoinSplit transfer in this
/// transaction. /// transaction.
pub anchor: treestate::sprout::NoteTreeRootHash, pub anchor: sprout::tree::NoteTreeRootHash,
/// A nullifier for the input notes. /// A nullifier for the input notes.
pub nullifiers: [crate::notes::sprout::Nullifier; 2], pub nullifiers: [sprout::note::Nullifier; 2],
/// A note commitment for this output note. /// A note commitment for this output note.
pub commitments: [crate::commitments::sprout::NoteCommitment; 2], pub commitments: [sprout::commitment::NoteCommitment; 2],
/// An X25519 public key. /// An X25519 public key.
pub ephemeral_key: x25519::PublicKey, pub ephemeral_key: x25519::PublicKey,
/// A 256-bit seed that must be chosen independently at random for each /// A 256-bit seed that must be chosen independently at random for each
/// JoinSplit description. /// JoinSplit description.
pub random_seed: [u8; 32], pub random_seed: [u8; 32],
/// A message authentication tag. /// A message authentication tag.
pub vmacs: [crate::types::MAC; 2], pub vmacs: [sprout::note::MAC; 2],
/// A ZK JoinSplit proof, either a /// A ZK JoinSplit proof, either a
/// [`Groth16Proof`](crate::primitives::Groth16Proof) or a /// [`Groth16Proof`](crate::primitives::Groth16Proof) or a
/// [`Bctv14Proof`](crate::primitives::Bctv14Proof). /// [`Bctv14Proof`](crate::primitives::Bctv14Proof).
#[serde(bound(serialize = "P: ZkSnarkProof", deserialize = "P: ZkSnarkProof"))] #[serde(bound(serialize = "P: ZkSnarkProof", deserialize = "P: ZkSnarkProof"))]
pub zkproof: P, pub zkproof: P,
/// A ciphertext component for this output note. /// A ciphertext component for this output note.
pub enc_ciphertexts: [sprout::EncryptedCiphertext; 2], pub enc_ciphertexts: [sprout::note::EncryptedCiphertext; 2],
} }
// Because x25519_dalek::PublicKey does not impl PartialEq // Because x25519_dalek::PublicKey does not impl PartialEq

View File

@ -9,12 +9,11 @@ use std::{
}; };
use crate::{ use crate::{
commitments, notes,
primitives::{Script, ZkSnarkProof}, primitives::{Script, ZkSnarkProof},
serialization::{ serialization::{
ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize, ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize,
}, },
treestate, types, sprout,
}; };
use super::*; use super::*;
@ -276,25 +275,25 @@ impl<P: ZkSnarkProof> ZcashDeserialize for JoinSplit<P> {
Ok(JoinSplit::<P> { Ok(JoinSplit::<P> {
vpub_old: reader.read_u64::<LittleEndian>()?.try_into()?, vpub_old: reader.read_u64::<LittleEndian>()?.try_into()?,
vpub_new: reader.read_u64::<LittleEndian>()?.try_into()?, vpub_new: reader.read_u64::<LittleEndian>()?.try_into()?,
anchor: treestate::sprout::NoteTreeRootHash::from(reader.read_32_bytes()?), anchor: sprout::tree::NoteTreeRootHash::from(reader.read_32_bytes()?),
nullifiers: [ nullifiers: [
reader.read_32_bytes()?.into(), reader.read_32_bytes()?.into(),
reader.read_32_bytes()?.into(), reader.read_32_bytes()?.into(),
], ],
commitments: [ commitments: [
commitments::sprout::NoteCommitment::from(reader.read_32_bytes()?), sprout::commitment::NoteCommitment::from(reader.read_32_bytes()?),
commitments::sprout::NoteCommitment::from(reader.read_32_bytes()?), sprout::commitment::NoteCommitment::from(reader.read_32_bytes()?),
], ],
ephemeral_key: x25519_dalek::PublicKey::from(reader.read_32_bytes()?), ephemeral_key: x25519_dalek::PublicKey::from(reader.read_32_bytes()?),
random_seed: reader.read_32_bytes()?, random_seed: reader.read_32_bytes()?,
vmacs: [ vmacs: [
types::MAC::zcash_deserialize(&mut reader)?, sprout::note::MAC::zcash_deserialize(&mut reader)?,
types::MAC::zcash_deserialize(&mut reader)?, sprout::note::MAC::zcash_deserialize(&mut reader)?,
], ],
zkproof: P::zcash_deserialize(&mut reader)?, zkproof: P::zcash_deserialize(&mut reader)?,
enc_ciphertexts: [ enc_ciphertexts: [
notes::sprout::EncryptedCiphertext::zcash_deserialize(&mut reader)?, sprout::note::EncryptedCiphertext::zcash_deserialize(&mut reader)?,
notes::sprout::EncryptedCiphertext::zcash_deserialize(&mut reader)?, sprout::note::EncryptedCiphertext::zcash_deserialize(&mut reader)?,
], ],
}) })
} }

View File

@ -5,15 +5,13 @@ use proptest::{arbitrary::any, array, collection::vec, option, prelude::*};
use crate::{ use crate::{
amount::{Amount, NonNegative}, amount::{Amount, NonNegative},
block::BlockHeight, block::BlockHeight,
commitments,
notes::sprout,
primitives::{Bctv14Proof, Groth16Proof, Script, ZkSnarkProof}, primitives::{Bctv14Proof, Groth16Proof, Script, ZkSnarkProof},
sapling, sapling,
sprout,
transaction::{ transaction::{
CoinbaseData, JoinSplit, JoinSplitData, LockTime, OutPoint, Output, ShieldedData, Spend, CoinbaseData, JoinSplit, JoinSplitData, LockTime, OutPoint, Output, ShieldedData, Spend,
Transaction, TransparentInput, TransparentOutput, Transaction, TransparentInput, TransparentOutput,
}, },
treestate,
}; };
impl Transaction { impl Transaction {
@ -125,14 +123,14 @@ impl<P: ZkSnarkProof + Arbitrary + 'static> Arbitrary for JoinSplit<P> {
( (
any::<Amount<NonNegative>>(), any::<Amount<NonNegative>>(),
any::<Amount<NonNegative>>(), any::<Amount<NonNegative>>(),
any::<treestate::sprout::NoteTreeRootHash>(), any::<sprout::tree::NoteTreeRootHash>(),
array::uniform2(any::<sprout::Nullifier>()), array::uniform2(any::<sprout::note::Nullifier>()),
array::uniform2(any::<commitments::sprout::NoteCommitment>()), array::uniform2(any::<sprout::commitment::NoteCommitment>()),
array::uniform32(any::<u8>()), array::uniform32(any::<u8>()),
array::uniform32(any::<u8>()), array::uniform32(any::<u8>()),
array::uniform2(any::<crate::types::MAC>()), array::uniform2(any::<sprout::note::MAC>()),
any::<P>(), any::<P>(),
array::uniform2(any::<sprout::EncryptedCiphertext>()), array::uniform2(any::<sprout::note::EncryptedCiphertext>()),
) )
.prop_map( .prop_map(
|( |(

View File

@ -1,4 +0,0 @@
//! Treestate representations for Sprout and Sapling
// mod nullifier_set;
pub mod sprout;