From 312c66264a0267167b68883eb9050169cb33f6ad Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Sat, 15 Aug 2020 18:36:01 -0700 Subject: [PATCH] chain: extract sprout code into sprout module. --- zebra-chain/src/addresses.rs | 1 - zebra-chain/src/commitments.rs | 3 --- zebra-chain/src/keys.rs | 1 - zebra-chain/src/lib.rs | 3 --- zebra-chain/src/notes.rs | 2 -- zebra-chain/src/sprout.rs | 6 ++++++ .../{addresses/sprout.rs => sprout/address.rs} | 15 ++++++++------- .../sprout.rs => sprout/commitment.rs} | 2 +- .../src/{keys/sprout.rs => sprout/keys.rs} | 0 .../src/{notes/sprout.rs => sprout/note.rs} | 7 +++++-- .../{notes/sprout => sprout/note}/arbitrary.rs | 3 +-- .../sprout => sprout/note}/ciphertexts.rs | 0 .../src/{types.rs => sprout/note/mac.rs} | 2 -- .../{notes/sprout => sprout/note}/nullifiers.rs | 2 +- .../src/{treestate/sprout.rs => sprout/tree.rs} | 0 zebra-chain/src/transaction/joinsplit.rs | 13 ++++++------- zebra-chain/src/transaction/serialize.rs | 17 ++++++++--------- zebra-chain/src/transaction/tests/arbitrary.rs | 14 ++++++-------- zebra-chain/src/treestate.rs | 4 ---- 19 files changed, 42 insertions(+), 53 deletions(-) delete mode 100644 zebra-chain/src/commitments.rs rename zebra-chain/src/{addresses/sprout.rs => sprout/address.rs} (91%) rename zebra-chain/src/{commitments/sprout.rs => sprout/commitment.rs} (97%) rename zebra-chain/src/{keys/sprout.rs => sprout/keys.rs} (100%) rename zebra-chain/src/{notes/sprout.rs => sprout/note.rs} (93%) rename zebra-chain/src/{notes/sprout => sprout/note}/arbitrary.rs (85%) rename zebra-chain/src/{notes/sprout => sprout/note}/ciphertexts.rs (100%) rename zebra-chain/src/{types.rs => sprout/note/mac.rs} (89%) rename zebra-chain/src/{notes/sprout => sprout/note}/nullifiers.rs (98%) rename zebra-chain/src/{treestate/sprout.rs => sprout/tree.rs} (100%) delete mode 100644 zebra-chain/src/treestate.rs diff --git a/zebra-chain/src/addresses.rs b/zebra-chain/src/addresses.rs index de5b29f7..7e200d1b 100644 --- a/zebra-chain/src/addresses.rs +++ b/zebra-chain/src/addresses.rs @@ -1,4 +1,3 @@ //! Address types. -pub mod sprout; pub mod transparent; diff --git a/zebra-chain/src/commitments.rs b/zebra-chain/src/commitments.rs deleted file mode 100644 index 87a6fc68..00000000 --- a/zebra-chain/src/commitments.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! Note and value commitments and associated types. - -pub mod sprout; diff --git a/zebra-chain/src/keys.rs b/zebra-chain/src/keys.rs index 6590557b..3601c4f0 100644 --- a/zebra-chain/src/keys.rs +++ b/zebra-chain/src/keys.rs @@ -1,4 +1,3 @@ //! Key types. -pub mod sprout; pub mod transparent; diff --git a/zebra-chain/src/lib.rs b/zebra-chain/src/lib.rs index 075b106b..8f982899 100644 --- a/zebra-chain/src/lib.rs +++ b/zebra-chain/src/lib.rs @@ -14,11 +14,8 @@ extern crate serde; mod merkle_tree; pub mod addresses; -pub mod commitments; pub mod keys; pub mod notes; -pub mod treestate; -pub mod types; pub mod amount; pub mod block; diff --git a/zebra-chain/src/notes.rs b/zebra-chain/src/notes.rs index 4298fb20..24b15871 100644 --- a/zebra-chain/src/notes.rs +++ b/zebra-chain/src/notes.rs @@ -3,5 +3,3 @@ #[cfg(test)] mod arbitrary; pub mod memo; - -pub mod sprout; diff --git a/zebra-chain/src/sprout.rs b/zebra-chain/src/sprout.rs index 8b137891..c64c4cbc 100644 --- a/zebra-chain/src/sprout.rs +++ b/zebra-chain/src/sprout.rs @@ -1 +1,7 @@ +//! Sprout-related functionality. +pub mod address; +pub mod commitment; +pub mod keys; +pub mod note; +pub mod tree; diff --git a/zebra-chain/src/addresses/sprout.rs b/zebra-chain/src/sprout/address.rs similarity index 91% rename from zebra-chain/src/addresses/sprout.rs rename to zebra-chain/src/sprout/address.rs index 86218998..ccdf2653 100644 --- a/zebra-chain/src/addresses/sprout.rs +++ b/zebra-chain/src/sprout/address.rs @@ -6,11 +6,12 @@ use std::{fmt, io}; use proptest::{arbitrary::Arbitrary, array, prelude::*}; use crate::{ - keys::sprout, parameters::Network, serialization::{ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize}, }; +use super::keys; + /// Magic numbers used to identify what networks Sprout Shielded /// Addresses are associated with. mod magics { @@ -24,8 +25,8 @@ mod magics { #[derive(Copy, Clone)] pub struct SproutShieldedAddress { network: Network, - paying_key: sprout::PayingKey, - transmission_key: sprout::TransmissionKey, + paying_key: keys::PayingKey, + transmission_key: keys::TransmissionKey, } impl fmt::Debug for SproutShieldedAddress { @@ -80,8 +81,8 @@ impl ZcashDeserialize for SproutShieldedAddress { Ok(SproutShieldedAddress { network, - paying_key: sprout::PayingKey(reader.read_32_bytes()?), - transmission_key: sprout::TransmissionKey::from(reader.read_32_bytes()?), + paying_key: keys::PayingKey(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 { network, - paying_key: sprout::PayingKey(paying_key_bytes), - transmission_key: sprout::TransmissionKey::from(transmission_key_bytes), + paying_key: keys::PayingKey(paying_key_bytes), + transmission_key: keys::TransmissionKey::from(transmission_key_bytes), }) .boxed() } diff --git a/zebra-chain/src/commitments/sprout.rs b/zebra-chain/src/sprout/commitment.rs similarity index 97% rename from zebra-chain/src/commitments/sprout.rs rename to zebra-chain/src/sprout/commitment.rs index 2ac2ec5e..39895e99 100644 --- a/zebra-chain/src/commitments/sprout.rs +++ b/zebra-chain/src/sprout/commitment.rs @@ -4,7 +4,7 @@ use sha2::{Digest, Sha256}; -use crate::notes::sprout::Note; +use super::note::Note; /// The randomness used in the Pedersen Hash for note commitment. #[derive(Copy, Clone, Debug, PartialEq)] diff --git a/zebra-chain/src/keys/sprout.rs b/zebra-chain/src/sprout/keys.rs similarity index 100% rename from zebra-chain/src/keys/sprout.rs rename to zebra-chain/src/sprout/keys.rs diff --git a/zebra-chain/src/notes/sprout.rs b/zebra-chain/src/sprout/note.rs similarity index 93% rename from zebra-chain/src/notes/sprout.rs rename to zebra-chain/src/sprout/note.rs index b48b1bc6..bbcd532e 100644 --- a/zebra-chain/src/notes/sprout.rs +++ b/zebra-chain/src/sprout/note.rs @@ -6,15 +6,18 @@ #[cfg(test)] mod arbitrary; mod ciphertexts; +mod mac; mod nullifiers; use crate::{ amount::{Amount, NonNegative}, - commitments::sprout::CommitmentRandomness, - keys::sprout::PayingKey, notes::memo::Memo, }; +use super::{commitment::CommitmentRandomness, keys::PayingKey}; + +pub use mac::MAC; + pub use ciphertexts::EncryptedCiphertext; pub use nullifiers::{Nullifier, NullifierSeed}; diff --git a/zebra-chain/src/notes/sprout/arbitrary.rs b/zebra-chain/src/sprout/note/arbitrary.rs similarity index 85% rename from zebra-chain/src/notes/sprout/arbitrary.rs rename to zebra-chain/src/sprout/note/arbitrary.rs index becdc6e4..1e6e02ad 100644 --- a/zebra-chain/src/notes/sprout/arbitrary.rs +++ b/zebra-chain/src/sprout/note/arbitrary.rs @@ -1,8 +1,7 @@ use proptest::{arbitrary::any, collection::vec, prelude::*}; -use crate::notes::sprout; -impl Arbitrary for sprout::EncryptedCiphertext { +impl Arbitrary for super::EncryptedCiphertext { type Parameters = (); fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { diff --git a/zebra-chain/src/notes/sprout/ciphertexts.rs b/zebra-chain/src/sprout/note/ciphertexts.rs similarity index 100% rename from zebra-chain/src/notes/sprout/ciphertexts.rs rename to zebra-chain/src/sprout/note/ciphertexts.rs diff --git a/zebra-chain/src/types.rs b/zebra-chain/src/sprout/note/mac.rs similarity index 89% rename from zebra-chain/src/types.rs rename to zebra-chain/src/sprout/note/mac.rs index a006f646..20474465 100644 --- a/zebra-chain/src/types.rs +++ b/zebra-chain/src/sprout/note/mac.rs @@ -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 std::io::{self, Read}; diff --git a/zebra-chain/src/notes/sprout/nullifiers.rs b/zebra-chain/src/sprout/note/nullifiers.rs similarity index 98% rename from zebra-chain/src/notes/sprout/nullifiers.rs rename to zebra-chain/src/sprout/note/nullifiers.rs index 6e25c859..11d0edde 100644 --- a/zebra-chain/src/notes/sprout/nullifiers.rs +++ b/zebra-chain/src/sprout/note/nullifiers.rs @@ -3,7 +3,7 @@ use byteorder::{ByteOrder, LittleEndian}; 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 /// spending key a_sk and a nullifier seed ρ, instantiated using the diff --git a/zebra-chain/src/treestate/sprout.rs b/zebra-chain/src/sprout/tree.rs similarity index 100% rename from zebra-chain/src/treestate/sprout.rs rename to zebra-chain/src/sprout/tree.rs diff --git a/zebra-chain/src/transaction/joinsplit.rs b/zebra-chain/src/transaction/joinsplit.rs index bd474778..54ef5901 100644 --- a/zebra-chain/src/transaction/joinsplit.rs +++ b/zebra-chain/src/transaction/joinsplit.rs @@ -2,9 +2,8 @@ use serde::{Deserialize, Serialize}; use crate::{ amount::{Amount, NonNegative}, - notes::sprout, + sprout, primitives::{ed25519, x25519, ZkSnarkProof}, - treestate, }; /// A _JoinSplit Description_, as described in [protocol specification §7.2][ps]. @@ -22,25 +21,25 @@ pub struct JoinSplit { /// 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 /// transaction. - pub anchor: treestate::sprout::NoteTreeRootHash, + pub anchor: sprout::tree::NoteTreeRootHash, /// 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. - pub commitments: [crate::commitments::sprout::NoteCommitment; 2], + pub commitments: [sprout::commitment::NoteCommitment; 2], /// An X25519 public key. pub ephemeral_key: x25519::PublicKey, /// A 256-bit seed that must be chosen independently at random for each /// JoinSplit description. pub random_seed: [u8; 32], /// A message authentication tag. - pub vmacs: [crate::types::MAC; 2], + pub vmacs: [sprout::note::MAC; 2], /// A ZK JoinSplit proof, either a /// [`Groth16Proof`](crate::primitives::Groth16Proof) or a /// [`Bctv14Proof`](crate::primitives::Bctv14Proof). #[serde(bound(serialize = "P: ZkSnarkProof", deserialize = "P: ZkSnarkProof"))] pub zkproof: P, /// 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 diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index 20589971..ffb679a9 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -9,12 +9,11 @@ use std::{ }; use crate::{ - commitments, notes, primitives::{Script, ZkSnarkProof}, serialization::{ ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize, }, - treestate, types, + sprout, }; use super::*; @@ -276,25 +275,25 @@ impl ZcashDeserialize for JoinSplit

{ Ok(JoinSplit::

{ vpub_old: reader.read_u64::()?.try_into()?, vpub_new: reader.read_u64::()?.try_into()?, - anchor: treestate::sprout::NoteTreeRootHash::from(reader.read_32_bytes()?), + anchor: sprout::tree::NoteTreeRootHash::from(reader.read_32_bytes()?), nullifiers: [ reader.read_32_bytes()?.into(), reader.read_32_bytes()?.into(), ], commitments: [ - commitments::sprout::NoteCommitment::from(reader.read_32_bytes()?), - commitments::sprout::NoteCommitment::from(reader.read_32_bytes()?), + sprout::commitment::NoteCommitment::from(reader.read_32_bytes()?), + sprout::commitment::NoteCommitment::from(reader.read_32_bytes()?), ], ephemeral_key: x25519_dalek::PublicKey::from(reader.read_32_bytes()?), random_seed: reader.read_32_bytes()?, vmacs: [ - types::MAC::zcash_deserialize(&mut reader)?, - types::MAC::zcash_deserialize(&mut reader)?, + sprout::note::MAC::zcash_deserialize(&mut reader)?, + sprout::note::MAC::zcash_deserialize(&mut reader)?, ], zkproof: P::zcash_deserialize(&mut reader)?, enc_ciphertexts: [ - notes::sprout::EncryptedCiphertext::zcash_deserialize(&mut reader)?, - notes::sprout::EncryptedCiphertext::zcash_deserialize(&mut reader)?, + sprout::note::EncryptedCiphertext::zcash_deserialize(&mut reader)?, + sprout::note::EncryptedCiphertext::zcash_deserialize(&mut reader)?, ], }) } diff --git a/zebra-chain/src/transaction/tests/arbitrary.rs b/zebra-chain/src/transaction/tests/arbitrary.rs index dc3fcef5..d22c39e4 100644 --- a/zebra-chain/src/transaction/tests/arbitrary.rs +++ b/zebra-chain/src/transaction/tests/arbitrary.rs @@ -5,15 +5,13 @@ use proptest::{arbitrary::any, array, collection::vec, option, prelude::*}; use crate::{ amount::{Amount, NonNegative}, block::BlockHeight, - commitments, - notes::sprout, primitives::{Bctv14Proof, Groth16Proof, Script, ZkSnarkProof}, sapling, + sprout, transaction::{ CoinbaseData, JoinSplit, JoinSplitData, LockTime, OutPoint, Output, ShieldedData, Spend, Transaction, TransparentInput, TransparentOutput, }, - treestate, }; impl Transaction { @@ -125,14 +123,14 @@ impl Arbitrary for JoinSplit

{ ( any::>(), any::>(), - any::(), - array::uniform2(any::()), - array::uniform2(any::()), + any::(), + array::uniform2(any::()), + array::uniform2(any::()), array::uniform32(any::()), array::uniform32(any::()), - array::uniform2(any::()), + array::uniform2(any::()), any::

(), - array::uniform2(any::()), + array::uniform2(any::()), ) .prop_map( |( diff --git a/zebra-chain/src/treestate.rs b/zebra-chain/src/treestate.rs deleted file mode 100644 index 8cb30bd4..00000000 --- a/zebra-chain/src/treestate.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! Treestate representations for Sprout and Sapling - -// mod nullifier_set; -pub mod sprout;