Add serde support for OrchardIncrementalTreeDigest

This commit is contained in:
Kris Nuttycombe 2021-06-17 10:57:47 -06:00
parent 7e79fd4b1c
commit e3abbf9a42
2 changed files with 23 additions and 0 deletions

View File

@ -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" }

View File

@ -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]> {
<Option<pallas::Base>>::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<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.to_bytes().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for OrchardIncrementalTreeDigest {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let parsed = <[u8; 32]>::deserialize(deserializer)?;
Ok(Self::from_bytes(&parsed))
}
}
/// Generators for property testing.
#[cfg(any(test, feature = "test-dependencies"))]
pub mod testing {