Browse Source

feat: added MerkleStore serde

al-gkr-basic-workflow
Augusto F. Hack 2 years ago
parent
commit
7957cc929a
No known key found for this signature in database GPG Key ID: 3F3584B7FB1DFB76
2 changed files with 57 additions and 0 deletions
  1. +45
    -0
      src/merkle/store/mod.rs
  2. +12
    -0
      src/merkle/store/tests.rs

+ 45
- 0
src/merkle/store/mod.rs

@ -2,6 +2,7 @@ use super::{
BTreeMap, BTreeSet, EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleTree, BTreeMap, BTreeSet, EmptySubtreeRoots, MerkleError, MerklePath, MerklePathSet, MerkleTree,
NodeIndex, RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word, NodeIndex, RootPath, Rpo256, RpoDigest, SimpleSmt, ValuePath, Vec, Word,
}; };
use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
#[cfg(test)] #[cfg(test)]
mod tests; 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 })
}
}

+ 12
- 0
src/merkle/store/tests.rs

@ -5,6 +5,9 @@ use crate::{
Felt, Word, Felt, Word,
}; };
#[cfg(std)]
use std::error::Error;
const KEYS4: [u64; 4] = [0, 1, 2, 3]; const KEYS4: [u64; 4] = [0, 1, 2, 3];
const LEAVES4: [Word; 4] = [ const LEAVES4: [Word; 4] = [
int_to_node(1), int_to_node(1),
@ -554,3 +557,12 @@ fn test_constructors() -> Result<(), MerkleError> {
Ok(()) 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…
Cancel
Save