miden_crypto/merkle/mmr/
proof.rs1use super::super::MerklePath;
3use super::forest::Forest;
4
5#[derive(Debug, Clone, PartialEq)]
9#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
10pub struct MmrProof {
11 pub forest: Forest,
13
14 pub position: usize,
16
17 pub merkle_path: MerklePath,
20}
21
22impl MmrProof {
23 pub fn relative_pos(&self) -> usize {
26 self.forest
27 .leaf_relative_position(self.position)
28 .expect("position must be part of the forest")
29 }
30
31 pub fn peak_index(&self) -> usize {
33 self.forest.tree_index(self.position)
34 }
35}
36
37#[cfg(test)]
41mod tests {
42 use super::{MerklePath, MmrProof};
43 use crate::merkle::mmr::forest::Forest;
44
45 #[test]
46 fn test_peak_index() {
47 let forest = Forest::new(11);
49
50 for position in 0..8 {
52 let proof = make_dummy_proof(forest, position);
53 assert_eq!(proof.peak_index(), 0);
54 }
55
56 let forest = Forest::new(11);
58
59 for position in 0..8 {
61 let proof = make_dummy_proof(forest, position);
62 assert_eq!(proof.peak_index(), 0);
63 }
64
65 for position in 8..10 {
67 let proof = make_dummy_proof(forest, position);
68 assert_eq!(proof.peak_index(), 1);
69 }
70
71 let proof = make_dummy_proof(forest, 10);
73 assert_eq!(proof.peak_index(), 2);
74
75 let forest = Forest::new(7);
77
78 for position in 0..4 {
80 let proof = make_dummy_proof(forest, position);
81 assert_eq!(proof.peak_index(), 0);
82 }
83
84 for position in 4..6 {
86 let proof = make_dummy_proof(forest, position);
87 assert_eq!(proof.peak_index(), 1);
88 }
89
90 let proof = make_dummy_proof(forest, 6);
92 assert_eq!(proof.peak_index(), 2);
93 }
94
95 fn make_dummy_proof(forest: Forest, position: usize) -> MmrProof {
96 MmrProof {
97 forest,
98 position,
99 merkle_path: MerklePath::default(),
100 }
101 }
102}