Add blanket implementation of Hashable for incrementalmerkletree::Hashable + HashSer
This commit is contained in:
parent
837ad19262
commit
7b953283ce
|
@ -1,7 +1,7 @@
|
||||||
//! Implementation of a Merkle tree of commitments used to prove the existence of notes.
|
//! Implementation of a Merkle tree of commitments used to prove the existence of notes.
|
||||||
|
|
||||||
use byteorder::{LittleEndian, ReadBytesExt};
|
use byteorder::{LittleEndian, ReadBytesExt};
|
||||||
use incrementalmerkletree::bridgetree;
|
use incrementalmerkletree::{self, bridgetree, Altitude};
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
|
|
||||||
|
@ -29,6 +29,45 @@ pub trait Hashable: Clone + Copy {
|
||||||
fn empty_root(_: usize) -> Self;
|
fn empty_root(_: usize) -> Self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A hashable node within a Merkle tree.
|
||||||
|
pub trait HashSer {
|
||||||
|
/// Parses a node from the given byte source.
|
||||||
|
fn read<R: Read>(reader: R) -> io::Result<Self>
|
||||||
|
where
|
||||||
|
Self: Sized;
|
||||||
|
|
||||||
|
/// Serializes this node.
|
||||||
|
fn write<W: Write>(&self, writer: W) -> io::Result<()>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Hashable for T where T: incrementalmerkletree::Hashable + HashSer + Copy {
|
||||||
|
/// Parses a node from the given byte source.
|
||||||
|
fn read<R: Read>(reader: R) -> io::Result<Self> {
|
||||||
|
<Self as HashSer>::read(reader)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Serializes this node.
|
||||||
|
fn write<W: Write>(&self, writer: W) -> io::Result<()> {
|
||||||
|
<Self as HashSer>::write(self, writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the parent node within the tree of the two given nodes.
|
||||||
|
fn combine(alt: usize, lhs: &Self, rhs: &Self) -> Self {
|
||||||
|
<Self as incrementalmerkletree::Hashable>::combine(Altitude::from(alt as u8), lhs, rhs)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a blank leaf node.
|
||||||
|
fn blank() -> Self {
|
||||||
|
<Self as incrementalmerkletree::Hashable>::empty_leaf()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the empty root for the given depth.
|
||||||
|
fn empty_root(alt: usize) -> Self {
|
||||||
|
<Self as incrementalmerkletree::Hashable>::empty_root(Altitude::from(alt as u8))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct PathFiller<Node: Hashable> {
|
struct PathFiller<Node: Hashable> {
|
||||||
queue: VecDeque<Node>,
|
queue: VecDeque<Node>,
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,22 +13,11 @@ use incrementalmerkletree::{
|
||||||
};
|
};
|
||||||
use orchard::tree::MerkleCrhOrchardOutput;
|
use orchard::tree::MerkleCrhOrchardOutput;
|
||||||
|
|
||||||
use super::CommitmentTree;
|
use super::{CommitmentTree, HashSer};
|
||||||
use crate::serialize::{Optional, Vector};
|
use crate::serialize::{Optional, Vector};
|
||||||
|
|
||||||
pub const SER_V1: u8 = 1;
|
pub const SER_V1: u8 = 1;
|
||||||
|
|
||||||
/// A hashable node within a Merkle tree.
|
|
||||||
pub trait HashSer {
|
|
||||||
/// Parses a node from the given byte source.
|
|
||||||
fn read<R: Read>(reader: R) -> io::Result<Self>
|
|
||||||
where
|
|
||||||
Self: Sized;
|
|
||||||
|
|
||||||
/// Serializes this node.
|
|
||||||
fn write<W: Write>(&self, writer: W) -> io::Result<()>;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn read_frontier_v0<H: Hashable + super::Hashable, R: Read>(
|
pub fn read_frontier_v0<H: Hashable + super::Hashable, R: Read>(
|
||||||
mut reader: R,
|
mut reader: R,
|
||||||
) -> io::Result<Frontier<H, 32>> {
|
) -> io::Result<Frontier<H, 32>> {
|
||||||
|
|
|
@ -23,7 +23,7 @@ use subtle::{Choice, ConstantTimeEq};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
constants::{self, SPENDING_KEY_GENERATOR},
|
constants::{self, SPENDING_KEY_GENERATOR},
|
||||||
merkle_tree::Hashable,
|
merkle_tree::{Hashable, HashSer},
|
||||||
transaction::components::amount::MAX_MONEY,
|
transaction::components::amount::MAX_MONEY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,34 +83,6 @@ impl Node {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Hashable for Node {
|
|
||||||
fn read<R: Read>(mut reader: R) -> io::Result<Self> {
|
|
||||||
let mut repr = [0u8; 32];
|
|
||||||
reader.read_exact(&mut repr)?;
|
|
||||||
Ok(Node::new(repr))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write<W: Write>(&self, mut writer: W) -> io::Result<()> {
|
|
||||||
writer.write_all(self.repr.as_ref())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn combine(depth: usize, lhs: &Self, rhs: &Self) -> Self {
|
|
||||||
Node {
|
|
||||||
repr: merkle_hash(depth, &lhs.repr, &rhs.repr),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn blank() -> Self {
|
|
||||||
Node {
|
|
||||||
repr: Note::uncommitted().to_repr(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn empty_root(depth: usize) -> Self {
|
|
||||||
EMPTY_ROOTS[depth]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl incrementalmerkletree::Hashable for Node {
|
impl incrementalmerkletree::Hashable for Node {
|
||||||
fn empty_leaf() -> Self {
|
fn empty_leaf() -> Self {
|
||||||
Node {
|
Node {
|
||||||
|
@ -129,7 +101,7 @@ impl incrementalmerkletree::Hashable for Node {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl crate::merkle_tree::incremental::HashSer for Node {
|
impl HashSer for Node {
|
||||||
fn read<R: Read>(mut reader: R) -> io::Result<Self> {
|
fn read<R: Read>(mut reader: R) -> io::Result<Self> {
|
||||||
let mut repr = [0u8; 32];
|
let mut repr = [0u8; 32];
|
||||||
reader.read_exact(&mut repr)?;
|
reader.read_exact(&mut repr)?;
|
||||||
|
|
Loading…
Reference in New Issue