#[derive(Debug, Clone, PartialEq, Eq)]
pub struct IncrementalWitness<const DEPTH: usize, Node> {
note_commitment: Node,
note_position: u32,
merkle_path: Vec<Node>,
anchor: Node,
anchor_tree_size: u32,
anchor_frontier: Vec<Node>,
}
impl<const DEPTH: usize, Node> IncrementalWitness<DEPTH, Node> {
pub fn from_parts(
note_commitment: Node,
note_position: u32,
merkle_path: Vec<Node>,
anchor: Node,
anchor_tree_size: u32,
anchor_frontier: Vec<Node>,
) -> Self {
Self {
note_commitment,
note_position,
merkle_path,
anchor,
anchor_tree_size,
anchor_frontier,
}
}
pub fn note_commitment(&self) -> &Node {
&self.note_commitment
}
pub fn note_position(&self) -> u32 {
self.note_position
}
pub fn merkle_path(&self) -> &[Node] {
&self.merkle_path[..]
}
pub fn anchor(&self) -> &Node {
&self.anchor
}
pub fn anchor_tree_size(&self) -> u32 {
self.anchor_tree_size
}
pub fn anchor_frontier(&self) -> &[Node] {
&self.anchor_frontier
}
}
#[cfg(test)]
mod tests {
use bc_rand::rng_next_with_upper_bound;
use super::IncrementalWitness;
use crate::RandomInstance;
impl<const DEPTH: usize, Node: RandomInstance> RandomInstance for IncrementalWitness<DEPTH, Node> {
fn random() -> Self {
let mut rng = bc_rand::thread_rng();
let note_position = rng_next_with_upper_bound(&mut rng, u32::MAX / 4);
let anchor_tree_size =
note_position + rng_next_with_upper_bound(&mut rng, u32::MAX / 16);
Self {
note_commitment: Node::random(),
note_position,
merkle_path: Vec::random(), anchor: Node::random(),
anchor_tree_size,
anchor_frontier: Vec::random(),
}
}
}
}