arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
serde: for MerklePath, ValuePath, and RootPath
Augusto F. Hack hack.augusto@gmail.com
Mon, 04 Dec 2023 14:50:05 +0100
commit

7e13346e04f2cda97eaa7d981deff5c0ed584b34

parent

9a18ed6749cb82a865351fffe9cfa52b097d7b3c

1 files changed, 50 insertions(+), 0 deletions(-)

jump to
M src/merkle/path.rs → src/merkle/path.rs

@@ -1,5 +1,6 @@

use super::{vec, InnerNodeInfo, MerkleError, NodeIndex, Rpo256, RpoDigest, Vec}; use core::ops::{Deref, DerefMut}; +use winter_utils::{ByteReader, Deserializable, DeserializationError, Serializable}; // MERKLE PATH // ================================================================================================

@@ -17,6 +18,7 @@ // --------------------------------------------------------------------------------------------

/// Creates a new Merkle path from a list of nodes. pub fn new(nodes: Vec<RpoDigest>) -> Self { + assert!(nodes.len() <= u8::MAX.into(), "MerklePath may have at most 256 items"); Self { nodes } }

@@ -187,6 +189,54 @@ /// The node value opening for `path`.

pub root: RpoDigest, /// The path from `value` to `root` (exclusive). 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