fuel_merkle/binary/
in_memory.rs1use crate::{
2 binary::{
3 self,
4 Primitive,
5 },
6 common::{
7 Bytes32,
8 ProofSet,
9 StorageMap,
10 },
11 storage::Mappable,
12};
13
14#[derive(Debug, Clone)]
18pub struct NodesTable;
19
20impl Mappable for NodesTable {
21 type Key = Self::OwnedKey;
22 type OwnedKey = u64;
23 type OwnedValue = Primitive;
24 type Value = Self::OwnedValue;
25}
26
27type Storage = StorageMap<NodesTable>;
28type BinaryMerkleTree = binary::MerkleTree<NodesTable, Storage>;
29
30#[derive(Debug, Clone)]
31pub struct MerkleTree {
32 tree: BinaryMerkleTree,
33}
34
35impl MerkleTree {
36 pub fn new() -> Self {
37 Self {
38 tree: BinaryMerkleTree::new(Storage::new()),
39 }
40 }
41
42 pub fn push(&mut self, data: &[u8]) {
43 let _ = self.tree.push(data);
44 }
45
46 pub fn root(&self) -> Bytes32 {
47 self.tree.root()
48 }
49
50 pub fn prove(&self, proof_index: u64) -> Option<(Bytes32, ProofSet)> {
51 self.tree.prove(proof_index).ok()
52 }
53
54 pub fn reset(&mut self) {
55 self.tree.reset();
56 }
57}
58
59impl Default for MerkleTree {
60 fn default() -> Self {
61 Self::new()
62 }
63}
64
65#[cfg(test)]
66mod test {
67 use super::*;
68 use binary::{
69 empty_sum,
70 leaf_sum,
71 node_sum,
72 };
73 use fuel_merkle_test_helpers::TEST_DATA;
74
75 #[test]
76 fn root_returns_the_empty_root_for_0_leaves() {
77 let tree = MerkleTree::new();
78
79 let root = tree.root();
80 assert_eq!(root, empty_sum().clone());
81 }
82
83 #[test]
84 fn root_returns_the_merkle_root_for_1_leaf() {
85 let mut tree = MerkleTree::new();
86
87 let data = &TEST_DATA[0..1]; for datum in data.iter() {
89 tree.push(datum);
90 }
91
92 let leaf_0 = leaf_sum(data[0]);
93
94 let root = tree.root();
95 assert_eq!(root, leaf_0);
96 }
97
98 #[test]
99 fn root_returns_the_merkle_root_for_7_leaves() {
100 let mut tree = MerkleTree::new();
101
102 let data = &TEST_DATA[0..7]; for datum in data.iter() {
104 tree.push(datum);
105 }
106
107 let leaf_0 = leaf_sum(data[0]);
123 let leaf_1 = leaf_sum(data[1]);
124 let leaf_2 = leaf_sum(data[2]);
125 let leaf_3 = leaf_sum(data[3]);
126 let leaf_4 = leaf_sum(data[4]);
127 let leaf_5 = leaf_sum(data[5]);
128 let leaf_6 = leaf_sum(data[6]);
129
130 let node_1 = node_sum(&leaf_0, &leaf_1);
131 let node_5 = node_sum(&leaf_2, &leaf_3);
132 let node_3 = node_sum(&node_1, &node_5);
133 let node_9 = node_sum(&leaf_4, &leaf_5);
134 let node_11 = node_sum(&node_9, &leaf_6);
135 let node_7 = node_sum(&node_3, &node_11);
136
137 let root = tree.root();
138 assert_eq!(root, node_7);
139 }
140
141 #[test]
142 fn prove_returns_none_for_0_leaves() {
143 let tree = MerkleTree::new();
144
145 let proof = tree.prove(0);
146 assert!(proof.is_none());
147 }
148
149 #[test]
150 fn prove_returns_none_when_index_is_greater_than_number_of_leaves() {
151 let mut tree = MerkleTree::new();
152
153 let data = &TEST_DATA[0..5]; for datum in data.iter() {
155 tree.push(datum);
156 }
157
158 let proof = tree.prove(10);
159 assert!(proof.is_none());
160 }
161
162 #[test]
163 fn prove_returns_the_merkle_root_and_proof_set_for_1_leaf() {
164 let mut tree = MerkleTree::new();
165
166 let data = &TEST_DATA[0..1]; for datum in data.iter() {
168 tree.push(datum);
169 }
170
171 let leaf_0 = leaf_sum(data[0]);
172
173 {
174 let (root, proof_set) = tree.prove(0).unwrap();
175 assert_eq!(root, leaf_0);
176 assert!(proof_set.is_empty());
177 }
178 }
179
180 #[test]
181 fn prove_returns_the_merkle_root_and_proof_set_for_7_leaves() {
182 let mut tree = MerkleTree::new();
183
184 let data = &TEST_DATA[0..7]; for datum in data.iter() {
186 tree.push(datum);
187 }
188
189 let leaf_0 = leaf_sum(data[0]);
205 let leaf_1 = leaf_sum(data[1]);
206 let leaf_2 = leaf_sum(data[2]);
207 let leaf_3 = leaf_sum(data[3]);
208 let leaf_4 = leaf_sum(data[4]);
209 let leaf_5 = leaf_sum(data[5]);
210 let leaf_6 = leaf_sum(data[6]);
211
212 let node_1 = node_sum(&leaf_0, &leaf_1);
213 let node_5 = node_sum(&leaf_2, &leaf_3);
214 let node_3 = node_sum(&node_1, &node_5);
215 let node_9 = node_sum(&leaf_4, &leaf_5);
216 let node_11 = node_sum(&node_9, &leaf_6);
217 let node_7 = node_sum(&node_3, &node_11);
218
219 {
220 let (root, proof_set) = tree.prove(0).unwrap();
221 assert_eq!(root, node_7);
222 assert_eq!(proof_set[0], leaf_1);
223 assert_eq!(proof_set[1], node_5);
224 assert_eq!(proof_set[2], node_11);
225 }
226 {
227 let (root, proof_set) = tree.prove(1).unwrap();
228 assert_eq!(root, node_7);
229 assert_eq!(proof_set[0], leaf_0);
230 assert_eq!(proof_set[1], node_5);
231 assert_eq!(proof_set[2], node_11);
232 }
233 {
234 let (root, proof_set) = tree.prove(2).unwrap();
235 assert_eq!(root, node_7);
236 assert_eq!(proof_set[0], leaf_3);
237 assert_eq!(proof_set[1], node_1);
238 assert_eq!(proof_set[2], node_11);
239 }
240 {
241 let (root, proof_set) = tree.prove(3).unwrap();
242 assert_eq!(root, node_7);
243 assert_eq!(proof_set[0], leaf_2);
244 assert_eq!(proof_set[1], node_1);
245 assert_eq!(proof_set[2], node_11);
246 }
247 {
248 let (root, proof_set) = tree.prove(4).unwrap();
249 assert_eq!(root, node_7);
250 assert_eq!(proof_set[0], leaf_5);
251 assert_eq!(proof_set[1], leaf_6);
252 assert_eq!(proof_set[2], node_3);
253 }
254 {
255 let (root, proof_set) = tree.prove(5).unwrap();
256 assert_eq!(root, node_7);
257 assert_eq!(proof_set[0], leaf_4);
258 assert_eq!(proof_set[1], leaf_6);
259 assert_eq!(proof_set[2], node_3);
260 }
261 {
262 let (root, proof_set) = tree.prove(6).unwrap();
263 assert_eq!(root, node_7);
264 assert_eq!(proof_set[0], node_9);
265 assert_eq!(proof_set[1], node_3);
266 }
267 }
268}