fuel_merkle/sparse/
merkle_tree.rs

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/// The safe Merkle tree storage key prevents Merkle tree structure manipulations.
77/// The type contains only one constructor that hashes the storage key.
78#[derive(Clone, Copy, PartialEq, Eq, Hash)]
79#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
80pub struct MerkleTreeKey(Bytes32);
81
82impl MerkleTreeKey {
83    /// The safe way to create a `Self`. It hashes the `storage_key`, making
84    /// it entirely random and preventing SMT structure manipulation.
85    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    /// Unsafe analog to create a `Self` that doesn't hash the `storage_key` unlike
98    /// `Self::new`.
99    ///
100    /// # Safety
101    ///
102    /// It is safe to use this method if you know that `storage_key`
103    /// was randomly generated like `ContractId` or `AssetId`.
104    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(); // The last element in the side nodes list is the
250        // root; remove it.
251
252        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    /// Build a sparse Merkle tree from a set of key-value pairs. This is
262    /// equivalent to creating an empty sparse Merkle tree and sequentially
263    /// calling [update](Self::update) for each key-value pair. This constructor
264    /// is more performant than calling individual sequential updates and is the
265    /// preferred approach when the key-values are known upfront. Leaves can be
266    /// appended to the returned tree using `update` to further accumulate leaf
267    /// data.
268    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        // Building the tree starts by merging all leaf nodes where possible.
308        // Given a set of leaf nodes sorted left to right (i.e., keys are sorted
309        // in lexical order), we scan the leaf set right to left, and analyze a
310        // moving window of three leaves: a center (or "current") leaf, its left
311        // neighbor, and its right neighbor.
312        //
313        // When merging leaf nodes, we analyze this three-node window to
314        // determine if the condition for merging is met: When the current node
315        // is closer to its right neighbor than it is to its left neighbor, we
316        // merge the current node with its right neighbor. The merged node then
317        // becomes the center of the window, and we must check the merge
318        // condition again. We calculate proximity using the common path length
319        // between two nodes, which is also the depth of their shared ancestor
320        // in the tree.
321        //
322        // This three-node window is centered around a current node, and moves
323        // leftward: At the next iteration, the current node is now the right
324        // node, the left node is now the current node, and so on. When we have
325        // checked all windows, we know that we have merged all leaf nodes where
326        // possible.
327        while let Some(left) = branches.pop() {
328            if let Some(current) = nodes.last() {
329                #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
330                let left_proximity = current.node.common_path_length(&left.node) as u32;
331                while {
332                    // The current node's proximity to its right neighbor was
333                    // stored previously. We now compare the distances between
334                    // the current node's left and right neighbors. If, and only
335                    // if, the current node is closer to its right neighbor, we
336                    // merge these nodes to form an ancestor node. We then
337                    // reform the window, using the ancestor node in the center,
338                    // to check if we must merge again.
339                    //
340                    // If the current node is closer to its left, we do not have
341                    // enough information to merge nodes, and we must continue
342                    // scanning the leaf set leftwards to find a configuration
343                    // that satisfies the merge condition.
344                    if let Some(right_proximity) = proximities.last() {
345                        *right_proximity > left_proximity
346                    } else {
347                        false
348                    }
349                } {
350                    // The current node is closer to its right neighbor than its
351                    // left neighbor. We now merge the current node with its
352                    // right neighbor.
353                    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                    // Now that the current node and its right neighbour are
360                    // merged, the distance between them has collapsed and their
361                    // proximity is no longer needed.
362                    proximities.pop();
363                }
364                proximities.push(left_proximity);
365            }
366            nodes.push(left);
367        }
368
369        // Where possible, all the leaves have been merged. The remaining leaves
370        // and nodes are stacked in order of height descending. This means that
371        // they are also ordered with the leftmost leaves at the top and the
372        // rightmost nodes at the bottom. We can iterate through the stack and
373        // merge them left to right.
374        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        // Lastly, all leaves and nodes are merged into one. The resulting node
385        // may still be an ancestor node below the root. To calculate the final
386        // root, we merge placeholder nodes along the path until the resulting
387        // node has the final height and forms the root node.
388        let mut node = top.node;
389        let path = top.bits;
390        let height = node.height();
391        #[allow(clippy::arithmetic_side_effects)] // height <= max_height
392        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            // The zero root signifies that all leaves are empty, including the
436            // given key.
437            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        // Build the tree upwards starting with the requested leaf node.
467        let mut current_node = requested_leaf_node.clone();
468
469        // If we are creating a new leaf node, the corresponding side node will
470        // be the first node in the path set. The side node will be the leaf
471        // node currently closest to the requested new leaf node. When creating
472        // a new leaf node, we must merge the leaf node with its corresponding
473        // side node to create a common ancestor. We then continue building the
474        // tree upwards from this ancestor node. This may require creating new
475        // placeholder side nodes, in addition to the existing side node set.
476        //
477        // If we are updating an existing leaf node, the leaf node we are
478        // updating is the first node in the path set. The side node set will
479        // already include all the side nodes needed to build up the tree from
480        // the requested leaf node, since these side nodes were already built
481        // during the creation of the leaf node.
482        //
483        // We can determine if we are updating an existing leaf node, or if we
484        // are creating a new leaf node, by comparing the paths of the requested
485        // leaf node and the leaf node at the start of the path set. When the
486        // paths are equal, it means the leaf nodes occupy the same location,
487        // and we are updating an existing leaf. Otherwise, it means we are
488        // adding a new leaf node.
489        if requested_leaf_node.leaf_key() != actual_leaf_node.leaf_key() {
490            // Merge leaves
491            if !actual_leaf_node.is_placeholder() {
492                current_node =
493                    Node::create_node_on_path(path, &current_node, actual_leaf_node);
494                self.storage
495                    .insert(current_node.hash(), &current_node.as_ref().into())?;
496            }
497
498            // Merge placeholders
499            let ancestor_depth = requested_leaf_node.common_path_length(actual_leaf_node);
500            #[allow(clippy::cast_possible_truncation)] // Key is 32 bytes
501            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, &current_node, &placeholder);
508                self.storage
509                    .insert(current_node.hash(), &current_node.as_ref().into())?;
510            }
511        } else {
512            self.storage.remove(actual_leaf_node.hash())?;
513        }
514
515        // Merge side nodes
516        for (side_node, old_parent) in
517            side_nodes.iter().zip(path_nodes.iter().skip(1 /* leaf */))
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(), &current_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(); // Skip the requested leaf node
556
557        // The deleted leaf is replaced by a placeholder. Build the tree upwards
558        // starting with the placeholder.
559        let mut current_node = Node::create_placeholder();
560
561        // If the first side node is a leaf, it means the ancestor node is now
562        // parent to a placeholder (the deleted leaf node) and a leaf node (the
563        // first side node). We can immediately discard the ancestor node from
564        // further calculation and attach the orphaned leaf node to its next
565        // ancestor. Any subsequent ancestor nodes composed of this leaf node
566        // and a placeholder must be similarly discarded from further
567        // calculation. We then create a valid ancestor node for the orphaned
568        // leaf node by joining it with the earliest non-placeholder side node.
569        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                // Advance the side node iterator to the next non-placeholder
583                // node. This may be either another leaf node or an internal
584                // node. If only placeholder nodes exist beyond the first leaf
585                // node, then that leaf node is, in fact, the new root node.
586                //
587                // Using `find(..)` advances the iterator beyond the next
588                // non-placeholder side node and returns it. Therefore, we must
589                // consume the side node at this point. If another non-
590                // placeholder node was found in the side node collection, merge
591                // it with the first side node. This guarantees that the current
592                // node will be an internal node, and not a leaf, by the time we
593                // start merging the remaining side nodes.
594                // See https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.find.
595                if let Some(side_node) = side_nodes_iter
596                    .find(|side_node| *side_node != Node::Placeholder.hash())
597                {
598                    // Skip parents until the parent of the first side node is found
599                    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(), &current_node.as_ref().into())?;
618                    }
619                }
620            }
621        }
622
623        // Merge side nodes
624        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(), &current_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        // Identify the closest leaf that is included in the tree to the
662        // requested leaf. The closest leaf, as returned by the path set
663        // corresponding to the requested leaf, will be the requested leaf
664        // itself, a different leaf than requested, or a placeholder.
665        //
666        // If the closest leaf is the requested leaf, then the requested leaf is
667        // included in the tree, and we are requesting an inclusion proof.
668        // Otherwise (i.e, the closest leaf is either another leaf or a
669        // placeholder), the requested leaf is not in the tree, and we are
670        // requesting an exclusion proof.
671        //
672        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            // If the requested key is part of the tree, build an inclusion
676            // proof.
677            let inclusion_proof = InclusionProof { proof_set };
678            Proof::Inclusion(inclusion_proof)
679        } else {
680            // If the requested key is not part of the tree, we are verifying
681            // that the given key is a placeholder, and we must build an
682            // exclusion proof. When building an exclusion proof, the requested
683            // leaf is unset and is currently a placeholder. The path to this
684            // placeholder is designated by the requested leaf's key.
685            //
686            // If the closest leaf is a real leaf, and not a placeholder, we can
687            // build the root upwards using this leaf's key and value. If the
688            // closest leaf is a placeholder, it has a leaf key and a
689            // placeholder value (the zero sum). The leaf key of this
690            // placeholder leaf is unknown (since placeholders do not store
691            // their leaf key), and by extension, the path from the root to the
692            // placeholder is also unknown.
693            //
694            // However, in both cases, the path defined by the requested
695            // placeholder is sufficiently close: All branches stemming from the
696            // point where the paths of the requested placeholder and closest
697            // leaf diverge are saturated with the closest leaf's hash. In the
698            // case where the closest leaf is a placeholder, this hash is simply
699            // the zero sum. The hash of any placeholder under this point of
700            // divergence equates to this hash.
701            //
702            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        // Given
1111        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        // When
1116        tree.insert(tenth_key, b"ANOTHER_DATA").unwrap();
1117
1118        // Then
1119        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        // Given
1136        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        // When
1141        tree.insert(tenth_key, b"DATA").unwrap();
1142
1143        // Then
1144        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        // Given
1161        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        // When
1166        tree.delete(tenth_key).unwrap();
1167
1168        // Then
1169        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        // Instantiate a new key-value storage backing and populate it using a sparse
1230        // Merkle tree. The root of the Merkle tree is the key that maps to the buffer
1231        // of the root node in the storage. When loading a Merkle tree from storage, we
1232        // need a reference to the storage object, as well as the root that allows us to
1233        // look up the buffer of the root node. We will later use this storage backing
1234        // and root to load a Merkle tree.
1235        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        // Generate an expected root for this test by using both the set of `update`
1248        // data used when generating the loadable storage above and an additional set of
1249        // `update` data.
1250        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            // Create a Merkle tree by loading the generated storage and root.
1268            let mut tree = MerkleTree::load(&mut storage_to_load, &root_to_load).unwrap();
1269            // Build up the loaded tree using the additional set of `update` data so its
1270            // root matches the expected root. This verifies that the loaded tree has
1271            // successfully wrapped the given storage backing and assumed the correct
1272            // state so that future updates can be made seamlessly.
1273            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        // Overwrite the root key-value with an invalid primitive to create a
1327        // DeserializeError.
1328        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        // Given
1503        let mut storage = StorageMap::<TestTable>::new();
1504        let mut tree = MerkleTree::new(&mut storage);
1505
1506        // 256:           N4
1507        //               /  \
1508        // 255:         N3   \
1509        //             /  \   \
1510        // 254:       /   N2   \
1511        //           /   /  \   \
1512        // 253:     /   N1   \   \
1513        //         /   /  \   \   \
1514        // 252:   /   N0   \   \   \
1515        // ...   /   /  \   \   \   \
1516        //   0: L0  L1  L3  P1  L2  P0
1517        //      K0  K1  K3      K2
1518
1519        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            // When
1553            let proof = tree.generate_proof(&k0.into()).expect("Expected proof");
1554            let expected_proof_set = [*n2.hash(), *Node::create_placeholder().hash()];
1555
1556            // Then
1557            assert_eq!(*proof.proof_set(), expected_proof_set);
1558        }
1559
1560        {
1561            // When
1562            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            // Then
1572            assert_eq!(*proof.proof_set(), expected_proof_set);
1573        }
1574
1575        {
1576            // When
1577            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            // Then
1582            assert_eq!(*proof.proof_set(), expected_proof_set);
1583        }
1584
1585        {
1586            // When
1587            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            // Then
1597            assert_eq!(*proof.proof_set(), expected_proof_set);
1598        }
1599
1600        {
1601            // Test that supplying an arbitrary leaf "outside" the range of
1602            // leaves produces a valid proof set
1603
1604            // When
1605            let key = [255u8; 32];
1606            let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1607            let expected_proof_set = [*n3.hash()];
1608
1609            // Then
1610            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        // Given
1617        let mut storage = StorageMap::<TestTable>::new();
1618        let mut tree = MerkleTree::new(&mut storage);
1619
1620        // 256:           N4
1621        //               /  \
1622        // 255:         N3   \
1623        //             /  \   \
1624        // 254:       /   N2   \
1625        //           /   /  \   \
1626        // 253:     /   N1   \   \
1627        //         /   /  \   \   \
1628        // 252:   /   N0   \   \   \
1629        // ...   /   /  \   \   \   \
1630        //   0: L0  L1  L3  P1  L2  P0
1631        //      K0  K1  K3      K2
1632
1633        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        // When
1657        let proof = tree.generate_proof(&k1.into()).expect("Expected proof");
1658
1659        // Then
1660        assert!(proof.is_inclusion());
1661    }
1662
1663    #[test]
1664    fn merkle_tree__generate_proof__returns_exclusion_proof_for_excluded_key() {
1665        // Given
1666        let mut storage = StorageMap::<TestTable>::new();
1667        let mut tree = MerkleTree::new(&mut storage);
1668
1669        // 256:           N4
1670        //               /  \
1671        // 255:         N3   \
1672        //             /  \   \
1673        // 254:       /   N2   \
1674        //           /   /  \   \
1675        // 253:     /   N1   \   \
1676        //         /   /  \   \   \
1677        // 252:   /   N0   \   \   \
1678        // ...   /   /  \   \   \   \
1679        //   0: L0  L1  L3  P1  L2  P0
1680        //      K0  K1  K3      K2
1681
1682        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        // When
1706        let key = [255u8; 32];
1707        let proof = tree.generate_proof(&key.into()).expect("Expected proof");
1708
1709        // Then
1710        assert!(proof.is_exclusion());
1711    }
1712}