|
@ -1,5 +1,6 @@ |
|
|
use super::{vec, InnerNodeInfo, MerkleError, NodeIndex, Rpo256, RpoDigest, Vec};
|
|
|
use super::{vec, InnerNodeInfo, MerkleError, NodeIndex, Rpo256, RpoDigest, Vec};
|
|
|
use core::ops::{Deref, DerefMut};
|
|
|
use core::ops::{Deref, DerefMut};
|
|
|
|
|
|
use winter_utils::{ByteReader, Deserializable, DeserializationError, Serializable};
|
|
|
|
|
|
|
|
|
// MERKLE PATH
|
|
|
// MERKLE PATH
|
|
|
// ================================================================================================
|
|
|
// ================================================================================================
|
|
@ -17,6 +18,7 @@ impl MerklePath { |
|
|
|
|
|
|
|
|
/// Creates a new Merkle path from a list of nodes.
|
|
|
/// Creates a new Merkle path from a list of nodes.
|
|
|
pub fn new(nodes: Vec<RpoDigest>) -> Self {
|
|
|
pub fn new(nodes: Vec<RpoDigest>) -> Self {
|
|
|
|
|
|
assert!(nodes.len() <= u8::MAX.into(), "MerklePath may have at most 256 items");
|
|
|
Self { nodes }
|
|
|
Self { nodes }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
@ -189,6 +191,54 @@ pub struct RootPath { |
|
|
pub path: MerklePath,
|
|
|
pub path: MerklePath,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SERILIZATION
|
|
|
|
|
|
// ================================================================================================
|
|
|
|
|
|
impl Serializable for MerklePath {
|
|
|
|
|
|
fn write_into<W: winter_utils::ByteWriter>(&self, target: &mut W) {
|
|
|
|
|
|
assert!(self.nodes.len() <= u8::MAX.into(), "Length enforced in the construtor");
|
|
|
|
|
|
target.write_u8(self.nodes.len() as u8);
|
|
|
|
|
|
self.nodes.write_into(target);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Deserializable for MerklePath {
|
|
|
|
|
|
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
|
|
|
|
|
let count = source.read_u8()?.into();
|
|
|
|
|
|
let nodes = RpoDigest::read_batch_from(source, count)?;
|
|
|
|
|
|
Ok(Self { nodes })
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Serializable for ValuePath {
|
|
|
|
|
|
fn write_into<W: winter_utils::ByteWriter>(&self, target: &mut W) {
|
|
|
|
|
|
self.value.write_into(target);
|
|
|
|
|
|
self.path.write_into(target);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Deserializable for ValuePath {
|
|
|
|
|
|
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
|
|
|
|
|
let value = RpoDigest::read_from(source)?;
|
|
|
|
|
|
let path = MerklePath::read_from(source)?;
|
|
|
|
|
|
Ok(Self { value, path })
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Serializable for RootPath {
|
|
|
|
|
|
fn write_into<W: winter_utils::ByteWriter>(&self, target: &mut W) {
|
|
|
|
|
|
self.root.write_into(target);
|
|
|
|
|
|
self.path.write_into(target);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Deserializable for RootPath {
|
|
|
|
|
|
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
|
|
|
|
|
|
let root = RpoDigest::read_from(source)?;
|
|
|
|
|
|
let path = MerklePath::read_from(source)?;
|
|
|
|
|
|
Ok(Self { root, path })
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
// TESTS
|
|
|
// TESTS
|
|
|
// ================================================================================================
|
|
|
// ================================================================================================
|
|
|
|
|
|
|
|
|