1mod branch;
2mod node;
3
4use branch::{
5 Branch,
6 merge_branches,
7};
8use node::{
9 Node,
10 StorageNode,
11 StorageNodeError,
12};
13
14use crate::{
15 common::{
16 AsPathIterator,
17 Bytes32,
18 error::DeserializeError,
19 node::ChildError,
20 },
21 sparse::{
22 Primitive,
23 empty_sum,
24 proof::{
25 ExclusionLeaf,
26 ExclusionLeafData,
27 ExclusionProof,
28 InclusionProof,
29 Proof,
30 },
31 },
32 storage::{
33 Mappable,
34 StorageInspect,
35 StorageMutate,
36 },
37};
38use alloc::{
39 format,
40 vec::Vec,
41};
42use core::{
43 fmt::{
44 Debug,
45 Formatter,
46 },
47 iter,
48 marker::PhantomData,
49 ops::Deref,
50};
51
52#[derive(Debug, Clone, derive_more::Display)]
53pub enum MerkleTreeError<StorageError> {
54 #[display(
55 fmt = "cannot load node with key {}; the key is not found in storage",
56 "hex::encode(_0)"
57 )]
58 LoadError(Bytes32),
59
60 #[display(fmt = "{}", _0)]
61 StorageError(StorageError),
62
63 #[display(fmt = "{}", _0)]
64 DeserializeError(DeserializeError),
65
66 #[display(fmt = "{}", _0)]
67 ChildError(ChildError<Bytes32, StorageNodeError<StorageError>>),
68}
69
70impl<StorageError> From<StorageError> for MerkleTreeError<StorageError> {
71 fn from(err: StorageError) -> MerkleTreeError<StorageError> {
72 MerkleTreeError::StorageError(err)
73 }
74}
75
76#[derive(Clone, Copy, PartialEq, Eq, Hash)]
79#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
80pub struct MerkleTreeKey(Bytes32);
81
82impl MerkleTreeKey {
83 pub fn new<B>(storage_key: B) -> Self
86 where
87 B: AsRef<[u8]>,
88 {
89 use digest::Digest;
90 let mut hash = sha2::Sha256::new();
91 hash.update(storage_key.as_ref());
92 let hash = hash.finalize().into();
93
94 Self(hash)
95 }
96
97 pub unsafe fn convert<B>(storage_key: B) -> Self
105 where
106 B: Into<Bytes32>,
107 {
108 Self(storage_key.into())
109 }
110
111 #[cfg(any(test, feature = "test-helpers"))]
112 pub fn new_without_hash<B>(storage_key: B) -> Self
113 where
114 B: Into<Bytes32>,
115 {
116 unsafe { Self::convert(storage_key) }
117 }
118}
119
120impl Debug for MerkleTreeKey {
121 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
122 f.write_str(&format!("MerkleTreeKey({})", hex::encode(self.0)))
123 }
124}
125
126impl From<MerkleTreeKey> for Bytes32 {
127 fn from(value: MerkleTreeKey) -> Self {
128 value.0
129 }
130}
131
132impl AsRef<[u8]> for MerkleTreeKey {
133 fn as_ref(&self) -> &[u8] {
134 self.0.as_ref()
135 }
136}
137
138impl AsRef<Bytes32> for MerkleTreeKey {
139 fn as_ref(&self) -> &Bytes32 {
140 &self.0
141 }
142}
143
144impl Deref for MerkleTreeKey {
145 type Target = Bytes32;
146
147 fn deref(&self) -> &Self::Target {
148 &self.0
149 }
150}
151
152#[cfg(any(test, feature = "test-helpers"))]
153impl From<Bytes32> for MerkleTreeKey {
154 fn from(value: Bytes32) -> Self {
155 Self::new_without_hash(value)
156 }
157}
158
159#[derive(Debug)]
160pub struct MerkleTree<TableType, StorageType> {
161 root_node: Node,
162 storage: StorageType,
163 phantom_table: PhantomData<TableType>,
164}
165
166impl<TableType, StorageType> MerkleTree<TableType, StorageType> {
167 pub const fn empty_root() -> &'static Bytes32 {
168 empty_sum()
169 }
170
171 pub fn root(&self) -> Bytes32 {
172 *self.root_node().hash()
173 }
174
175 pub fn into_storage(self) -> StorageType {
176 self.storage
177 }
178
179 pub fn storage(&self) -> &StorageType {
180 &self.storage
181 }
182
183 fn root_node(&self) -> &Node {
184 &self.root_node
185 }
186
187 fn set_root_node(&mut self, node: Node) {
188 debug_assert!(node.is_leaf() || node.height() == Node::max_height());
189 self.root_node = node;
190 }
191}
192
193impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
194where
195 TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
196 StorageType: StorageInspect<TableType, Error = StorageError>,
197{
198 pub fn new(storage: StorageType) -> Self {
199 Self {
200 root_node: Node::create_placeholder(),
201 storage,
202 phantom_table: Default::default(),
203 }
204 }
205
206 pub fn load(
207 storage: StorageType,
208 root: &Bytes32,
209 ) -> Result<Self, MerkleTreeError<StorageError>> {
210 if root == Self::empty_root() {
211 let tree = Self::new(storage);
212 Ok(tree)
213 } else {
214 let primitive = storage
215 .get(root)?
216 .ok_or_else(|| MerkleTreeError::LoadError(*root))?
217 .into_owned();
218 let tree = Self {
219 root_node: primitive
220 .try_into()
221 .map_err(MerkleTreeError::DeserializeError)?,
222 storage,
223 phantom_table: Default::default(),
224 };
225 Ok(tree)
226 }
227 }
228
229 fn path_set(
230 &self,
231 leaf_key: &Bytes32,
232 ) -> Result<(Vec<Node>, Vec<Bytes32>), MerkleTreeError<StorageError>> {
233 let root_node = self.root_node().clone();
234 let root_storage_node = StorageNode::new(&self.storage, root_node);
235 let (mut path_nodes, mut side_nodes): (Vec<Node>, Vec<Bytes32>) =
236 root_storage_node
237 .as_path_iter(leaf_key)
238 .map(|(path_node, side_node)| {
239 Ok((
240 path_node.map_err(MerkleTreeError::ChildError)?.into_node(),
241 side_node.map_err(MerkleTreeError::ChildError)?,
242 ))
243 })
244 .collect::<Result<Vec<_>, MerkleTreeError<StorageError>>>()?
245 .into_iter()
246 .unzip();
247 path_nodes.reverse();
248 side_nodes.reverse();
249 side_nodes.pop(); Ok((path_nodes, side_nodes))
253 }
254}
255
256impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
257where
258 TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
259 StorageType: StorageMutate<TableType, Error = StorageError>,
260{
261 pub fn from_set<B, I, D>(
269 mut storage: StorageType,
270 set: I,
271 ) -> Result<Self, StorageError>
272 where
273 I: Iterator<Item = (B, D)>,
274 B: Into<Bytes32>,
275 D: AsRef<[u8]>,
276 {
277 let sorted = set
278 .into_iter()
279 .map(|(k, v)| (k.into(), v))
280 .collect::<alloc::collections::BTreeMap<Bytes32, D>>();
281 let mut branches = sorted
282 .iter()
283 .map(|(key, data)| Node::create_leaf(key, data))
284 .map(Into::<Branch>::into)
285 .collect::<Vec<_>>();
286
287 for branch in branches.iter() {
288 let leaf = &branch.node;
289 storage.insert(leaf.hash(), &leaf.as_ref().into())?;
290 }
291
292 if branches.is_empty() {
293 let tree = Self::new(storage);
294 return Ok(tree)
295 }
296
297 if branches.len() == 1 {
298 let leaf = branches.pop().expect("Expected at least 1 leaf").node;
299 let mut tree = Self::new(storage);
300 tree.set_root_node(leaf);
301 return Ok(tree)
302 }
303
304 let mut nodes = Vec::<Branch>::with_capacity(branches.len());
305 let mut proximities = Vec::<u32>::with_capacity(branches.len());
306
307 while let Some(left) = branches.pop() {
328 if let Some(current) = nodes.last() {
329 #[allow(clippy::cast_possible_truncation)] let left_proximity = current.node.common_path_length(&left.node) as u32;
331 while {
332 if let Some(right_proximity) = proximities.last() {
345 *right_proximity > left_proximity
346 } else {
347 false
348 }
349 } {
350 let current =
354 nodes.pop().expect("Expected current node to be present");
355 let right = nodes.pop().expect("Expected right node to be present");
356 let merged = merge_branches(&mut storage, current, right)?;
357 nodes.push(merged);
358
359 proximities.pop();
363 }
364 proximities.push(left_proximity);
365 }
366 nodes.push(left);
367 }
368
369 let top = {
375 let mut node = nodes
376 .pop()
377 .expect("Nodes stack must have at least 1 element");
378 while let Some(next) = nodes.pop() {
379 node = merge_branches(&mut storage, node, next)?;
380 }
381 node
382 };
383
384 let mut node = top.node;
389 let path = top.bits;
390 let height = node.height();
391 #[allow(clippy::arithmetic_side_effects)] let depth = Node::max_height() - height;
393 let placeholders = iter::repeat(Node::create_placeholder()).take(depth as usize);
394 for placeholder in placeholders {
395 node = Node::create_node_on_path(&path, &node, &placeholder);
396 storage.insert(node.hash(), &node.as_ref().into())?;
397 }
398
399 let tree = Self {
400 root_node: node,
401 storage,
402 phantom_table: Default::default(),
403 };
404 Ok(tree)
405 }
406
407 pub fn insert(
408 &mut self,
409 key: MerkleTreeKey,
410 data: &[u8],
411 ) -> Result<(), MerkleTreeError<StorageError>> {
412 let leaf_node = Node::create_leaf(key.as_ref(), data);
413 self.storage
414 .insert(leaf_node.hash(), &leaf_node.as_ref().into())?;
415
416 if self.root_node().is_placeholder() {
417 self.set_root_node(leaf_node);
418 } else {
419 let (path_nodes, side_nodes) = self.path_set(key.as_ref())?;
420 self.update_with_path_set(
421 &leaf_node,
422 path_nodes.as_slice(),
423 side_nodes.as_slice(),
424 )?;
425 }
426
427 Ok(())
428 }
429
430 pub fn delete(
431 &mut self,
432 key: MerkleTreeKey,
433 ) -> Result<(), MerkleTreeError<StorageError>> {
434 if self.root() == *Self::empty_root() {
435 return Ok(())
438 }
439
440 let (path_nodes, side_nodes): (Vec<Node>, Vec<_>) =
441 self.path_set(key.as_ref())?;
442
443 match path_nodes.first() {
444 Some(node) if *node.leaf_key() == key.as_ref() => {
445 self.delete_with_path_set(path_nodes.as_slice(), side_nodes.as_slice())?;
446 }
447 _ => {}
448 };
449
450 Ok(())
451 }
452
453 fn update_with_path_set(
454 &mut self,
455 requested_leaf_node: &Node,
456 path_nodes: &[Node],
457 side_nodes: &[Bytes32],
458 ) -> Result<(), StorageError> {
459 let path = requested_leaf_node.leaf_key();
460 let actual_leaf_node = &path_nodes[0];
461
462 if requested_leaf_node == actual_leaf_node {
463 return Ok(())
464 }
465
466 let mut current_node = requested_leaf_node.clone();
468
469 if requested_leaf_node.leaf_key() != actual_leaf_node.leaf_key() {
490 if !actual_leaf_node.is_placeholder() {
492 current_node =
493 Node::create_node_on_path(path, ¤t_node, actual_leaf_node);
494 self.storage
495 .insert(current_node.hash(), ¤t_node.as_ref().into())?;
496 }
497
498 let ancestor_depth = requested_leaf_node.common_path_length(actual_leaf_node);
500 #[allow(clippy::cast_possible_truncation)] let placeholders_count =
502 (ancestor_depth as usize).saturating_sub(side_nodes.len());
503 let placeholders =
504 iter::repeat(Node::create_placeholder()).take(placeholders_count);
505 for placeholder in placeholders {
506 current_node =
507 Node::create_node_on_path(path, ¤t_node, &placeholder);
508 self.storage
509 .insert(current_node.hash(), ¤t_node.as_ref().into())?;
510 }
511 } else {
512 self.storage.remove(actual_leaf_node.hash())?;
513 }
514
515 for (side_node, old_parent) in
517 side_nodes.iter().zip(path_nodes.iter().skip(1 ))
518 {
519 let new_parent = if old_parent.bytes_lo() == side_node {
520 Node::create_node_from_hashes(
521 *side_node,
522 *current_node.hash(),
523 old_parent.height(),
524 )
525 } else {
526 Node::create_node_from_hashes(
527 *current_node.hash(),
528 *side_node,
529 old_parent.height(),
530 )
531 };
532
533 current_node = new_parent;
534 self.storage
535 .insert(current_node.hash(), ¤t_node.as_ref().into())?;
536 self.storage.remove(old_parent.hash())?;
537 }
538
539 self.set_root_node(current_node);
540
541 Ok(())
542 }
543
544 fn delete_with_path_set(
545 &mut self,
546 path_nodes: &[Node],
547 side_nodes: &[Bytes32],
548 ) -> Result<(), MerkleTreeError<StorageError>> {
549 for node in path_nodes {
550 self.storage.remove(node.hash())?;
551 }
552
553 let mut side_nodes_iter = side_nodes.iter();
554 let mut path_nodes_iter = path_nodes.iter();
555 path_nodes_iter.next(); let mut current_node = Node::create_placeholder();
560
561 if let Some(first_side_node) = side_nodes.first() {
570 let first_side_node: Node = self
571 .storage
572 .get(first_side_node)?
573 .ok_or(MerkleTreeError::LoadError(*first_side_node))?
574 .into_owned()
575 .try_into()
576 .map_err(MerkleTreeError::DeserializeError)?;
577
578 if first_side_node.is_leaf() {
579 side_nodes_iter.next();
580 current_node = first_side_node.clone();
581
582 if let Some(side_node) = side_nodes_iter
596 .find(|side_node| *side_node != Node::Placeholder.hash())
597 {
598 if let Some(old_parent) = path_nodes_iter.find(|parent| {
600 parent.bytes_lo() == side_node || parent.bytes_hi() == side_node
601 }) {
602 let new_parent = if old_parent.bytes_lo() == side_node {
603 Node::create_node_from_hashes(
604 *side_node,
605 *current_node.hash(),
606 old_parent.height(),
607 )
608 } else {
609 Node::create_node_from_hashes(
610 *current_node.hash(),
611 *side_node,
612 old_parent.height(),
613 )
614 };
615 current_node = new_parent;
616 self.storage
617 .insert(current_node.hash(), ¤t_node.as_ref().into())?;
618 }
619 }
620 }
621 }
622
623 for (side_node, old_parent) in side_nodes_iter.zip(path_nodes_iter) {
625 let new_parent = if old_parent.bytes_lo() == side_node {
626 Node::create_node_from_hashes(
627 *side_node,
628 *current_node.hash(),
629 old_parent.height(),
630 )
631 } else {
632 Node::create_node_from_hashes(
633 *current_node.hash(),
634 *side_node,
635 old_parent.height(),
636 )
637 };
638
639 current_node = new_parent;
640 self.storage
641 .insert(current_node.hash(), ¤t_node.as_ref().into())?;
642 }
643
644 self.set_root_node(current_node);
645
646 Ok(())
647 }
648}
649
650impl<TableType, StorageType, StorageError> MerkleTree<TableType, StorageType>
651where
652 TableType: Mappable<Key = Bytes32, Value = Primitive, OwnedValue = Primitive>,
653 StorageType: StorageInspect<TableType, Error = StorageError>,
654{
655 pub fn generate_proof(
656 &self,
657 key: &MerkleTreeKey,
658 ) -> Result<Proof, MerkleTreeError<StorageError>> {
659 let path = key.as_ref();
660 let (path_nodes, side_nodes) = self.path_set(path)?;
661 let actual_leaf = &path_nodes[0];
673 let proof_set = side_nodes;
674 let proof = if !actual_leaf.is_placeholder() && actual_leaf.leaf_key() == path {
675 let inclusion_proof = InclusionProof { proof_set };
678 Proof::Inclusion(inclusion_proof)
679 } else {
680 let leaf = if actual_leaf.is_placeholder() {
703 ExclusionLeaf::Placeholder
704 } else {
705 ExclusionLeaf::Leaf(ExclusionLeafData {
706 leaf_key: *actual_leaf.leaf_key(),
707 leaf_value: *actual_leaf.leaf_data(),
708 })
709 };
710
711 let exclusion_proof = ExclusionProof { proof_set, leaf };
712 Proof::Exclusion(exclusion_proof)
713 };
714 Ok(proof)
715 }
716}
717
718#[cfg(test)]
719#[allow(non_snake_case)]
720mod test {
721 use super::Node;
722 use crate::{
723 common::{
724 Bytes32,
725 StorageMap,
726 sum,
727 },
728 sparse::{
729 MerkleTree,
730 MerkleTreeError,
731 MerkleTreeKey,
732 Primitive,
733 empty_sum,
734 },
735 };
736 use fuel_storage::Mappable;
737 use hex;
738
739 fn random_bytes32<R>(rng: &mut R) -> Bytes32
740 where
741 R: rand::Rng + ?Sized,
742 {
743 let mut bytes = [0u8; 32];
744 rng.fill(bytes.as_mut());
745 bytes
746 }
747
748 #[derive(Debug)]
749 struct TestTable;
750
751 impl Mappable for TestTable {
752 type Key = Self::OwnedKey;
753 type OwnedKey = Bytes32;
754 type OwnedValue = Primitive;
755 type Value = Self::OwnedValue;
756 }
757
758 fn key<B: AsRef<[u8]>>(data: B) -> MerkleTreeKey {
759 MerkleTreeKey::new(data.as_ref())
760 }
761
762 #[test]
763 fn test_empty_root() {
764 let mut storage = StorageMap::<TestTable>::new();
765 let tree = MerkleTree::new(&mut storage);
766 let root = tree.root();
767 let expected_root =
768 "0000000000000000000000000000000000000000000000000000000000000000";
769 assert_eq!(hex::encode(root), expected_root);
770 }
771
772 #[test]
773 fn test_update_1() {
774 let mut storage = StorageMap::<TestTable>::new();
775 let mut tree = MerkleTree::new(&mut storage);
776
777 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
778
779 let root = tree.root();
780 let expected_root =
781 "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
782 assert_eq!(hex::encode(root), expected_root);
783 }
784
785 #[test]
786 fn test_update_2() {
787 let mut storage = StorageMap::<TestTable>::new();
788 let mut tree = MerkleTree::new(&mut storage);
789
790 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
791 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
792
793 let root = tree.root();
794 let expected_root =
795 "8d0ae412ca9ca0afcb3217af8bcd5a673e798bd6fd1dfacad17711e883f494cb";
796 assert_eq!(hex::encode(root), expected_root);
797 }
798
799 #[test]
800 fn test_update_3() {
801 let mut storage = StorageMap::<TestTable>::new();
802 let mut tree = MerkleTree::new(&mut storage);
803
804 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
805 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
806 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
807
808 let root = tree.root();
809 let expected_root =
810 "52295e42d8de2505fdc0cc825ff9fead419cbcf540d8b30c7c4b9c9b94c268b7";
811 assert_eq!(hex::encode(root), expected_root);
812 }
813
814 #[test]
815 fn test_update_5() {
816 let mut storage = StorageMap::<TestTable>::new();
817 let mut tree = MerkleTree::new(&mut storage);
818
819 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
820 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
821 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
822 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
823 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
824
825 let root = tree.root();
826 let expected_root =
827 "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
828 assert_eq!(hex::encode(root), expected_root);
829 }
830
831 #[test]
832 fn test_update_10() {
833 let mut storage = StorageMap::<TestTable>::new();
834 let mut tree = MerkleTree::new(&mut storage);
835
836 for i in 0_u32..10 {
837 let key = key(i.to_be_bytes());
838 tree.insert(key, b"DATA").unwrap();
839 }
840
841 let root = tree.root();
842 let expected_root =
843 "21ca4917e99da99a61de93deaf88c400d4c082991cb95779e444d43dd13e8849";
844 assert_eq!(hex::encode(root), expected_root);
845 }
846
847 #[test]
848 fn test_update_100() {
849 let mut storage = StorageMap::<TestTable>::new();
850 let mut tree = MerkleTree::new(&mut storage);
851
852 for i in 0_u32..100 {
853 let key = key(i.to_be_bytes());
854 tree.insert(key, b"DATA").unwrap();
855 }
856
857 let root = tree.root();
858 let expected_root =
859 "82bf747d455a55e2f7044a03536fc43f1f55d43b855e72c0110c986707a23e4d";
860 assert_eq!(hex::encode(root), expected_root);
861 }
862
863 #[test]
864 fn test_update_with_repeated_inputs() {
865 let mut storage = StorageMap::<TestTable>::new();
866 let mut tree = MerkleTree::new(&mut storage);
867
868 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
869 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
870
871 let root = tree.root();
872 let expected_root =
873 "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
874 assert_eq!(hex::encode(root), expected_root);
875 }
876
877 #[test]
878 fn test_update_overwrite_key() {
879 let mut storage = StorageMap::<TestTable>::new();
880 let mut tree = MerkleTree::new(&mut storage);
881
882 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
883 tree.insert(key(b"\x00\x00\x00\x00"), b"CHANGE").unwrap();
884
885 let root = tree.root();
886 let expected_root =
887 "dd97174c80e5e5aa3a31c61b05e279c1495c8a07b2a08bca5dbc9fb9774f9457";
888 assert_eq!(hex::encode(root), expected_root);
889 }
890
891 #[test]
892 fn test_update_overwrite_key_2() {
893 let mut storage = StorageMap::<TestTable>::new();
894 let mut tree = MerkleTree::new(&mut storage);
895
896 for i in 0_u32..10 {
897 let key = key(i.to_be_bytes());
898 tree.insert(key, b"DATA").unwrap();
899 }
900
901 let root_hash_before = tree.root();
902
903 for i in 3_u32..7 {
904 let key = key(i.to_be_bytes());
905 tree.insert(key, b"DATA_2").unwrap();
906 }
907
908 for i in 3_u32..7 {
909 let key = key(i.to_be_bytes());
910 tree.insert(key, b"DATA").unwrap();
911 }
912
913 let root_hash_after = tree.root();
914
915 assert_eq!(root_hash_before, root_hash_after);
916 }
917
918 #[test]
919 fn test_update_union() {
920 let mut storage = StorageMap::<TestTable>::new();
921 let mut tree = MerkleTree::new(&mut storage);
922
923 for i in 0_u32..5 {
924 let key = key(i.to_be_bytes());
925 tree.insert(key, b"DATA").unwrap();
926 }
927
928 for i in 10_u32..15 {
929 let key = key(i.to_be_bytes());
930 tree.insert(key, b"DATA").unwrap();
931 }
932
933 for i in 20_u32..25 {
934 let key = key(i.to_be_bytes());
935 tree.insert(key, b"DATA").unwrap();
936 }
937
938 let root = tree.root();
939 let expected_root =
940 "7e6643325042cfe0fc76626c043b97062af51c7e9fc56665f12b479034bce326";
941 assert_eq!(hex::encode(root), expected_root);
942 }
943
944 #[test]
945 fn test_update_sparse_union() {
946 let mut storage = StorageMap::<TestTable>::new();
947 let mut tree = MerkleTree::new(&mut storage);
948
949 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
950 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
951 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
952 tree.insert(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
953 tree.insert(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
954
955 let root = tree.root();
956 let expected_root =
957 "e912e97abc67707b2e6027338292943b53d01a7fbd7b244674128c7e468dd696";
958 assert_eq!(hex::encode(root), expected_root);
959 }
960
961 #[test]
962 fn test_insert_empty_data_changes_root() {
963 let mut storage = StorageMap::<TestTable>::new();
964 let mut tree = MerkleTree::new(&mut storage);
965
966 tree.insert(key(b"\x00\x00\x00\x00"), b"").unwrap();
967
968 let root = tree.root();
969 let expected_root =
970 "3529664b414de6285270f7ebda7a43e20ae0ff6191c07d876b86282eb8ce93ce";
971 assert_eq!(hex::encode(root), expected_root);
972 }
973
974 #[test]
975 fn test_update_with_empty_data_changes_root() {
976 let mut storage = StorageMap::<TestTable>::new();
977 let mut tree = MerkleTree::new(&mut storage);
978
979 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
980 tree.insert(key(b"\x00\x00\x00\x00"), b"").unwrap();
981
982 let root = tree.root();
983 let expected_root =
984 "3529664b414de6285270f7ebda7a43e20ae0ff6191c07d876b86282eb8ce93ce";
985 assert_eq!(hex::encode(root), expected_root);
986 }
987
988 #[test]
989 fn test_update_1_delete_1() {
990 let mut storage = StorageMap::<TestTable>::new();
991 let mut tree = MerkleTree::new(&mut storage);
992
993 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
994 tree.delete(key(b"\x00\x00\x00\x00")).unwrap();
995
996 let root = tree.root();
997 let expected_root =
998 "0000000000000000000000000000000000000000000000000000000000000000";
999 assert_eq!(hex::encode(root), expected_root);
1000 }
1001
1002 #[test]
1003 fn test_update_2_delete_1() {
1004 let mut storage = StorageMap::<TestTable>::new();
1005 let mut tree = MerkleTree::new(&mut storage);
1006
1007 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1008 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1009 tree.delete(key(b"\x00\x00\x00\x01")).unwrap();
1010
1011 let root = tree.root();
1012 let expected_root =
1013 "39f36a7cb4dfb1b46f03d044265df6a491dffc1034121bc1071a34ddce9bb14b";
1014 assert_eq!(hex::encode(root), expected_root);
1015 }
1016
1017 #[test]
1018 fn test_update_10_delete_5() {
1019 let mut storage = StorageMap::<TestTable>::new();
1020 let mut tree = MerkleTree::new(&mut storage);
1021
1022 for i in 0_u32..10 {
1023 let key = key(i.to_be_bytes());
1024 tree.insert(key, b"DATA").unwrap();
1025 }
1026
1027 for i in 5_u32..10 {
1028 let key = key(i.to_be_bytes());
1029 tree.delete(key).unwrap();
1030 }
1031
1032 let root = tree.root();
1033 let expected_root =
1034 "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
1035 assert_eq!(hex::encode(root), expected_root);
1036 }
1037
1038 #[test]
1039 fn test_delete_non_existent_key() {
1040 let mut storage = StorageMap::<TestTable>::new();
1041 let mut tree = MerkleTree::new(&mut storage);
1042
1043 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1044 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1045 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1046 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1047 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1048 tree.delete(key(b"\x00\x00\x04\x00")).unwrap();
1049
1050 let root = tree.root();
1051 let expected_root =
1052 "108f731f2414e33ae57e584dc26bd276db07874436b2264ca6e520c658185c6b";
1053 assert_eq!(hex::encode(root), expected_root);
1054 }
1055
1056 #[test]
1057 fn test_interleaved_update_delete() {
1058 let mut storage = StorageMap::<TestTable>::new();
1059 let mut tree = MerkleTree::new(&mut storage);
1060
1061 for i in 0_u32..10 {
1062 let key = key(i.to_be_bytes());
1063 tree.insert(key, b"DATA").unwrap();
1064 }
1065
1066 for i in 5_u32..15 {
1067 let key = key(i.to_be_bytes());
1068 tree.delete(key).unwrap();
1069 }
1070
1071 for i in 10_u32..20 {
1072 let key = key(i.to_be_bytes());
1073 tree.insert(key, b"DATA").unwrap();
1074 }
1075
1076 for i in 15_u32..25 {
1077 let key = key(i.to_be_bytes());
1078 tree.delete(key).unwrap();
1079 }
1080
1081 for i in 20_u32..30 {
1082 let key = key(i.to_be_bytes());
1083 tree.insert(key, b"DATA").unwrap();
1084 }
1085
1086 for i in 25_u32..35 {
1087 let key = key(i.to_be_bytes());
1088 tree.delete(key).unwrap();
1089 }
1090
1091 let root = tree.root();
1092 let expected_root =
1093 "7e6643325042cfe0fc76626c043b97062af51c7e9fc56665f12b479034bce326";
1094 assert_eq!(hex::encode(root), expected_root);
1095 }
1096
1097 #[test]
1098 fn test_update_removes_old_entries() {
1099 let mut storage = StorageMap::<TestTable>::new();
1100 let mut tree = MerkleTree::new(&mut storage);
1101 let tenth_index = 9u32;
1102
1103 for i in 0_u32..tenth_index {
1104 let key = key(i.to_be_bytes());
1105 tree.insert(key, b"DATA").unwrap();
1106 }
1107 let size_before_tenth = tree.storage().len();
1108 let tenth_key = key(tenth_index.to_be_bytes());
1109
1110 tree.insert(tenth_key, b"DATA").unwrap();
1112 let size_after_tenth = tree.storage().len();
1113 assert_ne!(size_after_tenth, size_before_tenth);
1114
1115 tree.insert(tenth_key, b"ANOTHER_DATA").unwrap();
1117
1118 assert_eq!(tree.storage().len(), size_after_tenth);
1120 }
1121
1122 #[test]
1123 fn test_update_with_the_same_value_does_not_remove_old_entries() {
1124 let mut storage = StorageMap::<TestTable>::new();
1125 let mut tree = MerkleTree::new(&mut storage);
1126 let tenth_index = 9u32;
1127
1128 for i in 0_u32..tenth_index {
1129 let key = key(i.to_be_bytes());
1130 tree.insert(key, b"DATA").unwrap();
1131 }
1132 let size_before_tenth = tree.storage().len();
1133 let tenth_key = key(tenth_index.to_be_bytes());
1134
1135 tree.insert(tenth_key, b"DATA").unwrap();
1137 let size_after_tenth = tree.storage().len();
1138 assert_ne!(size_after_tenth, size_before_tenth);
1139
1140 tree.insert(tenth_key, b"DATA").unwrap();
1142
1143 assert_eq!(tree.storage().len(), size_after_tenth);
1145 }
1146
1147 #[test]
1148 fn test_delete_removes_path_entries() {
1149 let mut storage = StorageMap::<TestTable>::new();
1150 let mut tree = MerkleTree::new(&mut storage);
1151 let tenth_index = 9u32;
1152
1153 for i in 0_u32..tenth_index {
1154 let key = key(i.to_be_bytes());
1155 tree.insert(key, b"DATA").unwrap();
1156 }
1157 let size_before_tenth = tree.storage().len();
1158 let tenth_key = key(tenth_index.to_be_bytes());
1159
1160 tree.insert(tenth_key, b"DATA").unwrap();
1162 let size_after_tenth = tree.storage().len();
1163 assert_ne!(size_after_tenth, size_before_tenth);
1164
1165 tree.delete(tenth_key).unwrap();
1167
1168 assert_eq!(tree.storage().len(), size_before_tenth);
1170 }
1171
1172 #[test]
1173 fn test_delete_sparse_union() {
1174 let mut storage = StorageMap::<TestTable>::new();
1175 let mut tree = MerkleTree::new(&mut storage);
1176
1177 for i in 0_u32..10 {
1178 let key = key(i.to_be_bytes());
1179 tree.insert(key, b"DATA").unwrap();
1180 }
1181
1182 for i in 0_u32..5 {
1183 let key = key((i * 2 + 1).to_be_bytes());
1184 tree.delete(key).unwrap();
1185 }
1186
1187 let root = tree.root();
1188 let expected_root =
1189 "e912e97abc67707b2e6027338292943b53d01a7fbd7b244674128c7e468dd696";
1190 assert_eq!(hex::encode(root), expected_root);
1191 }
1192
1193 #[test]
1194 fn test_override_hash_key() {
1195 use fuel_storage::StorageInspect;
1196 let mut storage = StorageMap::<TestTable>::new();
1197 let mut tree = MerkleTree::new(&mut storage);
1198
1199 let leaf_1_key = key(b"\x00\x00\x00\x00");
1200 let leaf_1_data = b"DATA_1";
1201 let leaf_1 = Node::create_leaf(&leaf_1_key.0, leaf_1_data);
1202
1203 let leaf_2_key = MerkleTreeKey::new_without_hash(*leaf_1.hash());
1204 let leaf_2_data = b"DATA_2";
1205 let leaf_2 = Node::create_leaf(&leaf_2_key.0, leaf_2_data);
1206
1207 tree.insert(leaf_2_key, leaf_2_data).unwrap();
1208 tree.insert(leaf_1_key, leaf_1_data).unwrap();
1209 assert_eq!(
1210 tree.storage
1211 .get(leaf_2.hash())
1212 .unwrap()
1213 .unwrap()
1214 .into_owned(),
1215 leaf_2.as_ref().into()
1216 );
1217 assert_eq!(
1218 tree.storage
1219 .get(leaf_1.hash())
1220 .unwrap()
1221 .unwrap()
1222 .into_owned(),
1223 leaf_1.as_ref().into()
1224 );
1225 }
1226
1227 #[test]
1228 fn test_load_returns_a_valid_tree() {
1229 let (mut storage_to_load, root_to_load) = {
1236 let mut storage = StorageMap::<TestTable>::new();
1237 let mut tree = MerkleTree::new(&mut storage);
1238 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1239 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1240 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1241 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1242 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1243 let root = tree.root();
1244 (storage, root)
1245 };
1246
1247 let expected_root = {
1251 let mut storage = StorageMap::<TestTable>::new();
1252 let mut tree = MerkleTree::new(&mut storage);
1253 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1254 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1255 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1256 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1257 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1258 tree.insert(key(b"\x00\x00\x00\x05"), b"DATA").unwrap();
1259 tree.insert(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
1260 tree.insert(key(b"\x00\x00\x00\x07"), b"DATA").unwrap();
1261 tree.insert(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
1262 tree.insert(key(b"\x00\x00\x00\x09"), b"DATA").unwrap();
1263 tree.root()
1264 };
1265
1266 let root = {
1267 let mut tree = MerkleTree::load(&mut storage_to_load, &root_to_load).unwrap();
1269 tree.insert(key(b"\x00\x00\x00\x05"), b"DATA").unwrap();
1274 tree.insert(key(b"\x00\x00\x00\x06"), b"DATA").unwrap();
1275 tree.insert(key(b"\x00\x00\x00\x07"), b"DATA").unwrap();
1276 tree.insert(key(b"\x00\x00\x00\x08"), b"DATA").unwrap();
1277 tree.insert(key(b"\x00\x00\x00\x09"), b"DATA").unwrap();
1278 tree.root()
1279 };
1280
1281 assert_eq!(root, expected_root);
1282 }
1283
1284 #[test]
1285 fn test_load_returns_an_empty_tree_for_empty_sum_root() {
1286 let mut storage = StorageMap::<TestTable>::new();
1287 let tree = MerkleTree::load(&mut storage, empty_sum()).unwrap();
1288 let root = tree.root();
1289
1290 assert_eq!(root, *empty_sum());
1291 }
1292
1293 #[test]
1294 fn test_load_returns_a_load_error_if_the_storage_is_not_valid_for_the_root() {
1295 let mut storage = StorageMap::<TestTable>::new();
1296
1297 {
1298 let mut tree = MerkleTree::new(&mut storage);
1299 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1300 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1301 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1302 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1303 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1304 }
1305
1306 let root = &sum(b"\xff\xff\xff\xff");
1307 let err = MerkleTree::load(&mut storage, root)
1308 .expect_err("Expected load() to return Error; got Ok");
1309 assert!(matches!(err, MerkleTreeError::LoadError(_)));
1310 }
1311
1312 #[test]
1313 fn test_load_returns_a_deserialize_error_if_the_storage_is_corrupted() {
1314 use fuel_storage::StorageMutate;
1315
1316 let mut storage = StorageMap::<TestTable>::new();
1317
1318 let mut tree = MerkleTree::new(&mut storage);
1319 tree.insert(key(b"\x00\x00\x00\x00"), b"DATA").unwrap();
1320 tree.insert(key(b"\x00\x00\x00\x01"), b"DATA").unwrap();
1321 tree.insert(key(b"\x00\x00\x00\x02"), b"DATA").unwrap();
1322 tree.insert(key(b"\x00\x00\x00\x03"), b"DATA").unwrap();
1323 tree.insert(key(b"\x00\x00\x00\x04"), b"DATA").unwrap();
1324 let root = tree.root();
1325
1326 let primitive = (0xff, 0xff, [0xff; 32], [0xff; 32]);
1329 storage.insert(&root, &primitive).unwrap();
1330
1331 let err = MerkleTree::load(&mut storage, &root)
1332 .expect_err("Expected load() to return Error; got Ok");
1333 assert!(matches!(err, MerkleTreeError::DeserializeError(_)));
1334 }
1335
1336 #[test]
1337 fn test_from_set_yields_expected_root() {
1338 let rng = &mut rand::thread_rng();
1339 let generator = || {
1340 Some((
1341 MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1342 random_bytes32(rng),
1343 ))
1344 };
1345 let data = std::iter::from_fn(generator)
1346 .take(1_000)
1347 .collect::<Vec<_>>();
1348
1349 let expected_root = {
1350 let mut storage = StorageMap::<TestTable>::new();
1351 let mut tree = MerkleTree::new(&mut storage);
1352 let input = data.clone();
1353 for (key, value) in input.into_iter() {
1354 tree.insert(key, &value).unwrap();
1355 }
1356 tree.root()
1357 };
1358
1359 let root = {
1360 let mut storage = StorageMap::<TestTable>::new();
1361 let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1362 tree.root()
1363 };
1364
1365 assert_eq!(root, expected_root);
1366 }
1367
1368 #[test]
1369 fn test_from_empty_set_yields_expected_root() {
1370 let rng = &mut rand::thread_rng();
1371 let generator = || {
1372 Some((
1373 MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1374 random_bytes32(rng),
1375 ))
1376 };
1377 let data = std::iter::from_fn(generator).take(0).collect::<Vec<_>>();
1378
1379 let expected_root = {
1380 let mut storage = StorageMap::<TestTable>::new();
1381 let mut tree = MerkleTree::new(&mut storage);
1382 let input = data.clone();
1383 for (key, value) in input.into_iter() {
1384 tree.insert(key, &value).unwrap();
1385 }
1386 tree.root()
1387 };
1388
1389 let root = {
1390 let mut storage = StorageMap::<TestTable>::new();
1391 let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1392 tree.root()
1393 };
1394
1395 assert_eq!(root, expected_root);
1396 }
1397
1398 #[test]
1399 fn test_from_unit_set_yields_expected_root() {
1400 let rng = &mut rand::thread_rng();
1401 let generator = || {
1402 Some((
1403 MerkleTreeKey::new_without_hash(random_bytes32(rng)),
1404 random_bytes32(rng),
1405 ))
1406 };
1407 let data = std::iter::from_fn(generator).take(1).collect::<Vec<_>>();
1408
1409 let expected_root = {
1410 let mut storage = StorageMap::<TestTable>::new();
1411 let mut tree = MerkleTree::new(&mut storage);
1412 let input = data.clone();
1413 for (key, value) in input.into_iter() {
1414 tree.insert(key, &value).unwrap();
1415 }
1416 tree.root()
1417 };
1418
1419 let root = {
1420 let mut storage = StorageMap::<TestTable>::new();
1421 let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1422 tree.root()
1423 };
1424
1425 assert_eq!(root, expected_root);
1426 }
1427
1428 #[test]
1429 fn test_from_set_with_duplicate_keys_yields_expected_root() {
1430 let rng = &mut rand::thread_rng();
1431 let keys = [
1432 key(b"\x00\x00\x00\x00"),
1433 key(b"\x00\x00\x00\x01"),
1434 key(b"\x00\x00\x00\x02"),
1435 ];
1436 let data = [
1437 (keys[0], random_bytes32(rng)),
1438 (keys[1], random_bytes32(rng)),
1439 (keys[2], random_bytes32(rng)),
1440 (keys[0], random_bytes32(rng)),
1441 (keys[1], random_bytes32(rng)),
1442 (keys[2], random_bytes32(rng)),
1443 ];
1444
1445 let expected_root = {
1446 let mut storage = StorageMap::<TestTable>::new();
1447 let mut tree = MerkleTree::new(&mut storage);
1448 let input = data;
1449 for (key, value) in input.into_iter() {
1450 tree.insert(key, &value).unwrap();
1451 }
1452 tree.root()
1453 };
1454
1455 let root = {
1456 let mut storage = StorageMap::<TestTable>::new();
1457 let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1458 tree.root()
1459 };
1460
1461 assert_eq!(root, expected_root);
1462 }
1463
1464 #[test]
1465 fn test_from_set_with_empty_data_yields_expected_root() {
1466 let rng = &mut rand::thread_rng();
1467 let keys = [
1468 key(b"\x00\x00\x00\x00"),
1469 key(b"\x00\x00\x00\x01"),
1470 key(b"\x00\x00\x00\x02"),
1471 ];
1472 let data = [
1473 (keys[0], random_bytes32(rng).to_vec()),
1474 (keys[1], random_bytes32(rng).to_vec()),
1475 (keys[2], random_bytes32(rng).to_vec()),
1476 (keys[0], b"".to_vec()),
1477 (keys[1], b"".to_vec()),
1478 (keys[2], b"".to_vec()),
1479 ];
1480
1481 let expected_root = {
1482 let mut storage = StorageMap::<TestTable>::new();
1483 let mut tree = MerkleTree::new(&mut storage);
1484 let input = data.clone();
1485 for (key, value) in input.into_iter() {
1486 tree.insert(key, &value).unwrap();
1487 }
1488 tree.root()
1489 };
1490
1491 let root = {
1492 let mut storage = StorageMap::<TestTable>::new();
1493 let tree = MerkleTree::from_set(&mut storage, data.into_iter()).unwrap();
1494 tree.root()
1495 };
1496
1497 assert_eq!(root, expected_root);
1498 }
1499
1500 #[test]
1501 fn merkle_tree__generate_proof__returns_proof_with_proof_set_for_given_key() {
1502 let mut storage = StorageMap::<TestTable>::new();
1504 let mut tree = MerkleTree::new(&mut storage);
1505
1506 let k0 = [0u8; 32];
1520 let v0 = sum(b"DATA");
1521 tree.insert(MerkleTreeKey::new_without_hash(k0), &v0)
1522 .expect("Expected successful update");
1523
1524 let mut k1 = [0u8; 32];
1525 k1[0] = 0b01000000;
1526 let v1 = sum(b"DATA");
1527 tree.insert(MerkleTreeKey::new_without_hash(k1), &v1)
1528 .expect("Expected successful update");
1529
1530 let mut k2 = [0u8; 32];
1531 k2[0] = 0b01100000;
1532 let v2 = sum(b"DATA");
1533 tree.insert(MerkleTreeKey::new_without_hash(k2), &v2)
1534 .expect("Expected successful update");
1535
1536 let mut k3 = [0u8; 32];
1537 k3[0] = 0b01001000;
1538 let v3 = sum(b"DATA");
1539 tree.insert(MerkleTreeKey::new_without_hash(k3), &v3)
1540 .expect("Expected successful update");
1541
1542 let l0 = Node::create_leaf(&k0, v0);
1543 let l1 = Node::create_leaf(&k1, v1);
1544 let l2 = Node::create_leaf(&k2, v2);
1545 let l3 = Node::create_leaf(&k3, v3);
1546 let n0 = Node::create_node(&l1, &l3, 252);
1547 let n1 = Node::create_node(&n0, &Node::create_placeholder(), 253);
1548 let n2 = Node::create_node(&n1, &l2, 254);
1549 let n3 = Node::create_node(&l0, &n2, 255);
1550
1551 {
1552 let proof = tree.generate_proof(&k0.into()).expect("Expected proof");
1554 let expected_proof_set = [*n2.hash(), *Node::create_placeholder().hash()];
1555
1556 assert_eq!(*proof.proof_set(), expected_proof_set);
1558 }
1559
1560 {
1561 let proof = tree.generate_proof(&k1.into()).expect("Expected proof");
1563 let expected_proof_set = [
1564 *l3.hash(),
1565 *Node::create_placeholder().hash(),
1566 *l2.hash(),
1567 *l0.hash(),
1568 *Node::create_placeholder().hash(),
1569 ];
1570
1571 assert_eq!(*proof.proof_set(), expected_proof_set);
1573 }
1574
1575 {
1576 let proof = tree.generate_proof(&k2.into()).expect("Expected proof");
1578 let expected_proof_set =
1579 [*n1.hash(), *l0.hash(), *Node::create_placeholder().hash()];
1580
1581 assert_eq!(*proof.proof_set(), expected_proof_set);
1583 }
1584
1585 {
1586 let proof = tree.generate_proof(&k3.into()).expect("Expected proof");
1588 let expected_proof_set = [
1589 *l1.hash(),
1590 *Node::create_placeholder().hash(),
1591 *l2.hash(),
1592 *l0.hash(),
1593 *Node::create_placeholder().hash(),
1594 ];
1595
1596 assert_eq!(*proof.proof_set(), expected_proof_set);
1598 }
1599
1600 {
1601 let key = [255u8; 32];
1606 let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1607 let expected_proof_set = [*n3.hash()];
1608
1609 assert_eq!(*proof.proof_set(), expected_proof_set);
1611 }
1612 }
1613
1614 #[test]
1615 fn merkle_tree__generate_proof__returns_inclusion_proof_for_included_key() {
1616 let mut storage = StorageMap::<TestTable>::new();
1618 let mut tree = MerkleTree::new(&mut storage);
1619
1620 let k0 = [0u8; 32];
1634 let v0 = sum(b"DATA");
1635 tree.insert(MerkleTreeKey::new_without_hash(k0), &v0)
1636 .expect("Expected successful update");
1637
1638 let mut k1 = [0u8; 32];
1639 k1[0] = 0b01000000;
1640 let v1 = sum(b"DATA");
1641 tree.insert(MerkleTreeKey::new_without_hash(k1), &v1)
1642 .expect("Expected successful update");
1643
1644 let mut k2 = [0u8; 32];
1645 k2[0] = 0b01100000;
1646 let v2 = sum(b"DATA");
1647 tree.insert(MerkleTreeKey::new_without_hash(k2), &v2)
1648 .expect("Expected successful update");
1649
1650 let mut k3 = [0u8; 32];
1651 k3[0] = 0b01001000;
1652 let v3 = sum(b"DATA");
1653 tree.insert(MerkleTreeKey::new_without_hash(k3), &v3)
1654 .expect("Expected successful update");
1655
1656 let proof = tree.generate_proof(&k1.into()).expect("Expected proof");
1658
1659 assert!(proof.is_inclusion());
1661 }
1662
1663 #[test]
1664 fn merkle_tree__generate_proof__returns_exclusion_proof_for_excluded_key() {
1665 let mut storage = StorageMap::<TestTable>::new();
1667 let mut tree = MerkleTree::new(&mut storage);
1668
1669 let k0 = [0u8; 32];
1683 let v0 = sum(b"DATA");
1684 tree.insert(MerkleTreeKey::new_without_hash(k0), &v0)
1685 .expect("Expected successful update");
1686
1687 let mut k1 = [0u8; 32];
1688 k1[0] = 0b01000000;
1689 let v1 = sum(b"DATA");
1690 tree.insert(MerkleTreeKey::new_without_hash(k1), &v1)
1691 .expect("Expected successful update");
1692
1693 let mut k2 = [0u8; 32];
1694 k2[0] = 0b01100000;
1695 let v2 = sum(b"DATA");
1696 tree.insert(MerkleTreeKey::new_without_hash(k2), &v2)
1697 .expect("Expected successful update");
1698
1699 let mut k3 = [0u8; 32];
1700 k3[0] = 0b01001000;
1701 let v3 = sum(b"DATA");
1702 tree.insert(MerkleTreeKey::new_without_hash(k3), &v3)
1703 .expect("Expected successful update");
1704
1705 let key = [255u8; 32];
1707 let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1708
1709 assert!(proof.is_exclusion());
1711 }
1712}