From d4d1cf8d7bb5a0c9a282d7c45b1e1dbd3c95992d Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Sat, 8 Feb 2020 17:45:07 -0500 Subject: [PATCH] Add memo type with Debug impl and some test cases --- zebra-chain/src/lib.rs | 1 + zebra-chain/src/note_encryption.rs | 47 +++++++++++++++++++ .../src/note_encryption/test_vectors.rs | 0 zebra-chain/src/note_encryption/tests.rs | 0 4 files changed, 48 insertions(+) create mode 100644 zebra-chain/src/note_encryption.rs create mode 100644 zebra-chain/src/note_encryption/test_vectors.rs create mode 100644 zebra-chain/src/note_encryption/tests.rs diff --git a/zebra-chain/src/lib.rs b/zebra-chain/src/lib.rs index a68a1127..87eec1b4 100644 --- a/zebra-chain/src/lib.rs +++ b/zebra-chain/src/lib.rs @@ -7,6 +7,7 @@ mod sha256d_writer; pub mod block; pub mod equihash_solution; pub mod note_commitment_tree; +pub mod note_encryption; pub mod proofs; pub mod serialization; pub mod transaction; diff --git a/zebra-chain/src/note_encryption.rs b/zebra-chain/src/note_encryption.rs new file mode 100644 index 00000000..66d4cc93 --- /dev/null +++ b/zebra-chain/src/note_encryption.rs @@ -0,0 +1,47 @@ +//! Note encryption types. + +use std::fmt; + +/// A 512-byte _Memo_ field associated with a note, as described in +/// [protocol specification ยง5.5][ps]. +/// +/// The usage of the memo field is by agreement between the sender and +/// recipient of the note. +/// +/// [ps]: https://zips.z.cash/protocol/protocol.pdf#spendencoding +#[derive(Clone, Copy)] +pub struct Memo([u8; 512]); + +impl Memo {} + +impl fmt::Debug for Memo { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let output: String; + + match String::from_utf8(self.0.to_vec()) { + Ok(memo) => output = memo, + _ => output = hex::encode(&self.0[..]), + } + + f.debug_tuple("Memo").field(&output).finish() + } +} + +#[test] +fn memo_fmt() { + let memo = Memo([0u8; 512]); + + println!("{:?}", memo); + + let memo2 = Memo( + *b"thiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis \ + iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis \ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ + veeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeryyyyyyyyyyyyyyyyyyyyyyyyyy \ + looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong \ + meeeeeeeeeeeeeeeeeeemooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo \ + but it's just short enough", + ); + + println!("{:?}", memo2); +} diff --git a/zebra-chain/src/note_encryption/test_vectors.rs b/zebra-chain/src/note_encryption/test_vectors.rs new file mode 100644 index 00000000..e69de29b diff --git a/zebra-chain/src/note_encryption/tests.rs b/zebra-chain/src/note_encryption/tests.rs new file mode 100644 index 00000000..e69de29b