diff --git a/src/merkle/store/mod.rs b/src/merkle/store/mod.rs index 99fb1ce..c98d1b3 100644 --- a/src/merkle/store/mod.rs +++ b/src/merkle/store/mod.rs @@ -2,6 +2,7 @@ use super::{ BTreeMap, BTreeSet, EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleTree, NodeIndex, RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word, }; +use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; #[cfg(test)] mod tests; @@ -430,3 +431,47 @@ impl MerkleStore { } } } + +// SERIALIZATION +// ================================================================================================ + +impl Serializable for Node { + fn write_into(&self, target: &mut W) { + self.left.write_into(target); + self.right.write_into(target); + } +} + +impl Deserializable for Node { + fn read_from(source: &mut R) -> Result { + let left = RpoDigest::read_from(source)?; + let right = RpoDigest::read_from(source)?; + Ok(Node { left, right }) + } +} + +impl Serializable for MerkleStore { + fn write_into(&self, target: &mut W) { + target.write_u64(self.nodes.len() as u64); + + for (k, v) in self.nodes.iter() { + k.write_into(target); + v.write_into(target); + } + } +} + +impl Deserializable for MerkleStore { + fn read_from(source: &mut R) -> Result { + let len = source.read_u64()?; + let mut nodes: BTreeMap = BTreeMap::new(); + + for _ in 0..len { + let key = RpoDigest::read_from(source)?; + let value = Node::read_from(source)?; + nodes.insert(key, value); + } + + Ok(MerkleStore { nodes }) + } +} diff --git a/src/merkle/store/tests.rs b/src/merkle/store/tests.rs index e29f8e7..ecfedb4 100644 --- a/src/merkle/store/tests.rs +++ b/src/merkle/store/tests.rs @@ -5,6 +5,9 @@ use crate::{ Felt, Word, }; +#[cfg(std)] +use std::error::Error; + const KEYS4: [u64; 4] = [0, 1, 2, 3]; const LEAVES4: [Word; 4] = [ int_to_node(1), @@ -554,3 +557,12 @@ fn test_constructors() -> Result<(), MerkleError> { Ok(()) } + +#[cfg(std)] +#[test] +fn test_serialization() -> Result<(), Box> { + let original = MerkleStore::new().with_merkle_tree(LEAVES4)?; + let decoded = MerkleStore::read_from_bytes(&original.to_bytes())?; + assert_eq!(original, decoded); + Ok(()) +}