feat: added MerkleStore serde
This commit is contained in:
parent
854892ba9d
commit
7957cc929a
2 changed files with 57 additions and 0 deletions
|
@ -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<W: ByteWriter>(&self, target: &mut W) {
|
||||
self.left.write_into(target);
|
||||
self.right.write_into(target);
|
||||
}
|
||||
}
|
||||
|
||||
impl Deserializable for Node {
|
||||
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
||||
let left = RpoDigest::read_from(source)?;
|
||||
let right = RpoDigest::read_from(source)?;
|
||||
Ok(Node { left, right })
|
||||
}
|
||||
}
|
||||
|
||||
impl Serializable for MerkleStore {
|
||||
fn write_into<W: ByteWriter>(&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<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
||||
let len = source.read_u64()?;
|
||||
let mut nodes: BTreeMap<RpoDigest, Node> = 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 })
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<dyn Error>> {
|
||||
let original = MerkleStore::new().with_merkle_tree(LEAVES4)?;
|
||||
let decoded = MerkleStore::read_from_bytes(&original.to_bytes())?;
|
||||
assert_eq!(original, decoded);
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue