pub mod property_tests;
mod tests;
use alloc::{string::ToString, vec::Vec};
use miden_field::{Felt, FeltFromIntError, Word};
use miden_serde_utils::{
ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable,
};
use crate::{
Map,
merkle::{
EmptySubtreeRoots,
smt::{SMT_DEPTH, SmtLeaf},
},
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct UniqueNodes {
pub root: Word,
pub nodes: Map<u8, Vec<(u64, NodeValue)>>,
pub leaves: Vec<(u64, SmtLeaf)>,
pub value_only_leaves: Vec<(u64, Word)>,
}
impl UniqueNodes {
pub fn empty() -> Self {
Self {
root: *EmptySubtreeRoots::entry(SMT_DEPTH, 0),
nodes: Map::default(),
leaves: Vec::default(),
value_only_leaves: Vec::default(),
}
}
}
impl Default for UniqueNodes {
fn default() -> Self {
Self::empty()
}
}
impl Serializable for UniqueNodes {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.root.write_into(target);
let node_count = self.nodes.len() as u64;
target.write(node_count);
for (depth, nodes) in self.nodes.iter() {
target.write(depth);
let node_count = nodes.len() as u64;
target.write(node_count);
target.write_many(nodes.iter());
}
let leaf_count = self.leaves.len() as u64;
target.write(leaf_count);
target.write_many(self.leaves.iter());
let value_only_leaf_count = self.value_only_leaves.len() as u64;
target.write(value_only_leaf_count);
target.write_many(self.value_only_leaves.iter());
}
}
impl Deserializable for UniqueNodes {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let root = Word::read_from(source)?;
let level_count = source.read_u64()?;
let mut nodes = Map::new();
for _ in 0..level_count {
let depth = source.read_u8()?;
let node_count = source.read_u64()?;
let level_nodes = source
.read_many_iter(node_count.try_into().map_err(|_| {
DeserializationError::InvalidValue(format!("Node count {node_count} overflow"))
})?)?
.collect::<Result<Vec<_>, _>>()?;
nodes.insert(depth, level_nodes);
}
let leaf_count = source.read_u64()?;
let mut leaves = Vec::new();
for _ in 0..leaf_count {
leaves.push(source.read()?);
}
let value_only_leaf_count = source.read_u64()?;
let mut value_only_leaves = Vec::new();
for _ in 0..value_only_leaf_count {
value_only_leaves.push(source.read()?);
}
Ok(Self { root, nodes, leaves, value_only_leaves })
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum NodeValue {
EmptySubtreeRoot,
Present(Word),
}
impl Serializable for NodeValue {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
match self {
NodeValue::EmptySubtreeRoot => target.write_u64(u64::MAX),
NodeValue::Present(w) => w.write_into(target),
}
}
}
impl Deserializable for NodeValue {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let first_value = source.read_u64()?;
let to_e = |e: FeltFromIntError| DeserializationError::InvalidValue(e.to_string());
if first_value == u64::MAX {
Ok(Self::EmptySubtreeRoot)
} else {
let remaining_values: [u64; Word::NUM_ELEMENTS - 1] = source.read()?;
let felts = [
Felt::new(first_value).map_err(to_e)?,
Felt::new(remaining_values[0]).map_err(to_e)?,
Felt::new(remaining_values[1]).map_err(to_e)?,
Felt::new(remaining_values[2]).map_err(to_e)?,
];
Ok(Self::Present(Word::new(felts)))
}
}
}