From e3abbf9a42f115fdc36616b45c35754a9ce855f2 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Thu, 17 Jun 2021 10:57:47 -0600 Subject: [PATCH] Add serde support for OrchardIncrementalTreeDigest --- Cargo.toml | 1 + src/tree.rs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 2d7326e9..3a9054bc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ pasta_curves = "0.1" proptest = { version = "1.0.0", optional = true } rand = "0.8" nonempty = "0.6" +serde = { version = "1.0", features = ["derive"] } subtle = "2.3" zcash_note_encryption = "0.0" incrementalmerkletree = { git = "https://github.com/nuttycom/incrementalmerkletree.git", branch = "merkle_bridge" } diff --git a/src/tree.rs b/src/tree.rs index 40746259..15c2ac73 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -10,6 +10,9 @@ use crate::{ use incrementalmerkletree::{Hashable, Level}; use pasta_curves::{arithmetic::FieldExt, pallas}; +use serde::{Serialize, Deserialize}; +use serde::ser::Serializer; +use serde::de::Deserializer; use ff::{Field, PrimeField, PrimeFieldBits}; use rand::RngCore; use std::iter; @@ -152,6 +155,12 @@ impl OrchardIncrementalTreeDigest { pub fn to_bytes(&self) -> Option<[u8; 32]> { >::from(self.0).map(|b| b.to_bytes()) } + + /// Parses a incremental tree leaf digest from the bytes of + /// a note commitment. + pub fn from_bytes(bytes: &[u8; 32]) -> Self { + OrchardIncrementalTreeDigest(pallas::Base::from_bytes(bytes)) + } } /// This instance is should only be used for hashtable key comparisons. @@ -188,6 +197,19 @@ impl Hashable for OrchardIncrementalTreeDigest { } } +impl Serialize for OrchardIncrementalTreeDigest { + fn serialize(&self, serializer: S) -> Result { + self.to_bytes().serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for OrchardIncrementalTreeDigest { + fn deserialize>(deserializer: D) -> Result { + let parsed = <[u8; 32]>::deserialize(deserializer)?; + Ok(Self::from_bytes(&parsed)) + } +} + /// Generators for property testing. #[cfg(any(test, feature = "test-dependencies"))] pub mod testing {