diff --git a/zebra-chain/src/addresses/transparent.rs b/zebra-chain/src/addresses/transparent.rs index f6e227209..36dfee207 100644 --- a/zebra-chain/src/addresses/transparent.rs +++ b/zebra-chain/src/addresses/transparent.rs @@ -11,8 +11,8 @@ use proptest::{arbitrary::Arbitrary, collection::vec, prelude::*}; use crate::{ parameters::Network, + primitives::Script, serialization::{SerializationError, ZcashDeserialize, ZcashSerialize}, - types::Script, }; /// Magic numbers used to identify what networks Transparent Addresses @@ -247,8 +247,6 @@ mod tests { use secp256k1::PublicKey; - use crate::types::Script; - use super::*; #[test] diff --git a/zebra-chain/src/keys/sapling.rs b/zebra-chain/src/keys/sapling.rs index 7c12c8a9b..aa177e376 100644 --- a/zebra-chain/src/keys/sapling.rs +++ b/zebra-chain/src/keys/sapling.rs @@ -31,7 +31,7 @@ use proptest_derive::Arbitrary; use crate::{ parameters::Network, - redjubjub::{self, SpendAuth}, + primitives::redjubjub::{self, SpendAuth}, serialization::{ serde_helpers, ReadZcashExt, SerializationError, ZcashDeserialize, ZcashSerialize, }, diff --git a/zebra-chain/src/lib.rs b/zebra-chain/src/lib.rs index 0e678995c..981eb6723 100644 --- a/zebra-chain/src/lib.rs +++ b/zebra-chain/src/lib.rs @@ -20,12 +20,9 @@ pub mod commitments; pub mod keys; pub mod notes; pub mod parameters; -pub mod proofs; +pub mod primitives; pub mod serialization; pub mod transaction; pub mod treestate; pub mod types; pub mod work; - -pub use ed25519_zebra; -pub use redjubjub; diff --git a/zebra-chain/src/primitives.rs b/zebra-chain/src/primitives.rs new file mode 100644 index 000000000..6838dd003 --- /dev/null +++ b/zebra-chain/src/primitives.rs @@ -0,0 +1,15 @@ +//! Primitives used in Zcash structures. +//! +//! This contains re-exports of libraries used in the public API, as well as stub +//! definitions of primitive types which must be represented in this library but +//! whose functionality is implemented elsewhere. + +mod proofs; +mod script; + +pub use ed25519_zebra as ed25519; +pub use redjubjub; +pub use x25519_dalek as x25519; + +pub use proofs::{Bctv14Proof, Groth16Proof, ZkSnarkProof}; +pub use script::Script; diff --git a/zebra-chain/src/proofs.rs b/zebra-chain/src/primitives/proofs.rs similarity index 100% rename from zebra-chain/src/proofs.rs rename to zebra-chain/src/primitives/proofs.rs diff --git a/zebra-chain/src/proofs/bctv14.rs b/zebra-chain/src/primitives/proofs/bctv14.rs similarity index 100% rename from zebra-chain/src/proofs/bctv14.rs rename to zebra-chain/src/primitives/proofs/bctv14.rs diff --git a/zebra-chain/src/proofs/groth16.rs b/zebra-chain/src/primitives/proofs/groth16.rs similarity index 100% rename from zebra-chain/src/proofs/groth16.rs rename to zebra-chain/src/primitives/proofs/groth16.rs diff --git a/zebra-chain/src/primitives/script.rs b/zebra-chain/src/primitives/script.rs new file mode 100644 index 000000000..75d09e5f0 --- /dev/null +++ b/zebra-chain/src/primitives/script.rs @@ -0,0 +1,62 @@ +#![allow(clippy::unit_arg)] +use crate::serialization::{ + ReadZcashExt, SerializationError, WriteZcashExt, ZcashDeserialize, ZcashSerialize, +}; +use std::{ + fmt, + io::{self, Read}, +}; + +/// An encoding of a Bitcoin script. +#[derive(Clone, Eq, PartialEq, Serialize, Deserialize)] +#[cfg_attr(test, derive(proptest_derive::Arbitrary))] +pub struct Script(pub Vec); + +impl fmt::Debug for Script { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_tuple("Script") + .field(&hex::encode(&self.0)) + .finish() + } +} + +impl ZcashSerialize for Script { + fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { + writer.write_compactsize(self.0.len() as u64)?; + writer.write_all(&self.0[..])?; + Ok(()) + } +} + +impl ZcashDeserialize for Script { + fn zcash_deserialize(mut reader: R) -> Result { + // XXX what is the max length of a script? + let len = reader.read_compactsize()?; + let mut bytes = Vec::new(); + reader.take(len).read_to_end(&mut bytes)?; + Ok(Script(bytes)) + } +} + +#[cfg(test)] +mod proptests { + use std::io::Cursor; + + use proptest::prelude::*; + + use super::*; + use crate::serialization::{ZcashDeserialize, ZcashSerialize}; + + proptest! { + #[test] + fn script_roundtrip(script in any::