//! A binary hash tree of SHA256d (two rounds of SHA256) hashes for //! node values. #![allow(clippy::unit_arg)] use std::{fmt, io}; #[cfg(test)] use proptest_derive::Arbitrary; use crate::serialization::{SerializationError, ZcashDeserialize, ZcashSerialize}; use crate::sha256d_writer::Sha256dWriter; use crate::transaction::Transaction; /// A binary hash tree of SHA256d (two rounds of SHA256) hashes for /// node values. #[derive(Default)] pub struct MerkleTree { _leaves: Vec, } impl ZcashSerialize for MerkleTree { fn zcash_serialize(&self, _writer: W) -> Result<(), io::Error> { unimplemented!(); } } impl ZcashDeserialize for MerkleTree { fn zcash_deserialize(_reader: R) -> Result { unimplemented!(); } } /// A SHA-256d hash of the root node of a merkle tree of SHA256-d /// hashed transactions in a block. #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize)] #[cfg_attr(test, derive(Arbitrary))] pub struct MerkleTreeRootHash(pub [u8; 32]); impl From> for MerkleTreeRootHash { fn from(merkle_tree: MerkleTree) -> Self { let mut hash_writer = Sha256dWriter::default(); merkle_tree .zcash_serialize(&mut hash_writer) .expect("Sha256dWriter is infallible"); Self(hash_writer.finish()) } } impl fmt::Debug for MerkleTreeRootHash { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_tuple("MerkleTreeRootHash") .field(&hex::encode(&self.0)) .finish() } }