Skip to main content

mithril_common/crypto_helper/
merkle_map.rs

1//! Merkelized map and associated proof
2
3use anyhow::{Context, anyhow};
4use serde::{Deserialize, Serialize};
5use std::{
6    collections::{BTreeMap, BTreeSet, HashMap},
7    hash::Hash,
8    sync::Arc,
9};
10
11use crate::{StdError, StdResult};
12
13use super::{MKProof, MKTree, MKTreeNode, MKTreeStorer};
14
15/// The trait implemented by the keys of a MKMap
16pub trait MKMapKey: PartialEq + Eq + PartialOrd + Ord + Clone + Hash + Into<MKTreeNode> {}
17
18/// The trait implemented by the values of a MKMap
19pub trait MKMapValue<K: MKMapKey>: Clone + TryInto<MKTreeNode> + TryFrom<MKTreeNode> {
20    /// Get the root of the merkelized map value
21    fn compute_root(&self) -> StdResult<MKTreeNode>;
22
23    /// Check if the merkelized map value contains a leaf
24    fn contains<T: Into<MKTreeNode> + Clone>(&self, leaf: &T) -> bool;
25
26    /// Can the merkelized map value compute a proof
27    fn can_compute_proof(&self) -> bool;
28
29    /// Compute the proof for a set of values of the merkelized map
30    fn compute_proof<T: Into<MKTreeNode> + Clone>(
31        &self,
32        leaves: &[T],
33    ) -> StdResult<Option<MKMapProof<K>>>;
34}
35
36/// A map, where the keys and values are merkelized and provable
37pub struct MKMap<K: MKMapKey, V: MKMapValue<K>, S: MKTreeStorer> {
38    inner_map_values: BTreeMap<K, V>,
39    inner_merkle_tree: MKTree<S>,
40    provable_keys: BTreeSet<K>,
41}
42
43impl<K: MKMapKey, V: MKMapValue<K>, S: MKTreeStorer> MKMap<K, V, S> {
44    /// MKMap factory
45    pub fn new(entries: &[(K, V)]) -> StdResult<Self> {
46        Self::new_from_iter(entries.to_vec())
47    }
48
49    /// MKMap factory
50    pub fn new_from_iter<T: IntoIterator<Item = (K, V)>>(entries: T) -> StdResult<Self> {
51        let inner_map_values = BTreeMap::default();
52        let inner_merkle_tree = MKTree::<S>::new::<MKTreeNode>(&[])?;
53        let can_compute_proof_keys = BTreeSet::default();
54        let mut mk_map = Self {
55            inner_map_values,
56            inner_merkle_tree,
57            provable_keys: can_compute_proof_keys,
58        };
59        let sorted_entries = BTreeMap::from_iter(entries);
60        for (key, value) in sorted_entries {
61            mk_map.insert_unchecked(key, value)?;
62        }
63
64        Ok(mk_map)
65    }
66
67    /// Get the keys of the merkelized map
68    pub fn keys(&self) -> impl DoubleEndedIterator<Item = &K> {
69        self.inner_map_values.keys()
70    }
71
72    /// Insert a new key-value pair
73    /// Important: keys must be inserted in order to guarantee
74    /// that the same set of key/values results in the same computation for the root.
75    pub fn insert(&mut self, key: K, value: V) -> StdResult<()> {
76        if let Some(existing_value) = self.inner_map_values.get(&key) {
77            if existing_value.compute_root()? != value.compute_root()? {
78                return Err(anyhow!(
79                    "MKMap values should be replaced by entry with same root"
80                ));
81            }
82            return self.replace_unchecked(key, value);
83        } else {
84            let key_max = self.inner_map_values.keys().max();
85            if key_max > Some(&key) {
86                return Err(anyhow!("MKMap keys must be inserted in order"));
87            }
88        }
89
90        self.insert_unchecked(key, value)
91    }
92
93    /// Insert a new key-value pair without checking if the key is already present nor the order of insertion.
94    fn insert_unchecked(&mut self, key: K, value: V) -> StdResult<()> {
95        self.update_provable_keys(&key, &value)?;
96        self.inner_map_values.insert(key.clone(), value.clone());
97        let mktree_node_value = value
98            .try_into()
99            .map_err(|_| anyhow!("MKMap could not convert value to NKTreeNode"))
100            .with_context(|| "MKMap could not convert insert value")?;
101        let mktree_node_key: MKTreeNode = key.into();
102        self.inner_merkle_tree
103            .append(&[mktree_node_key + mktree_node_value])?;
104
105        Ok(())
106    }
107
108    /// Replace the value of an existing key
109    pub fn replace(&mut self, key: K, value: V) -> StdResult<()> {
110        match self.inner_map_values.get(&key) {
111            Some(existing_value) if existing_value.compute_root()? != value.compute_root()? => Err(
112                anyhow!("MKMap values should be replaced by entry with same root"),
113            ),
114            Some(_) => self.replace_unchecked(key, value),
115            None => Err(anyhow!("MKMap could not replace non-existing key")),
116        }
117    }
118
119    /// Replace the value of an existing key without checking if the key is already present
120    fn replace_unchecked(&mut self, key: K, value: V) -> StdResult<()> {
121        self.update_provable_keys(&key, &value)?;
122        self.inner_map_values.insert(key.clone(), value.clone());
123
124        Ok(())
125    }
126
127    /// Keep track of the keys that can compute a proof
128    fn update_provable_keys(&mut self, key: &K, value: &V) -> StdResult<()> {
129        if value.can_compute_proof() {
130            self.provable_keys.insert(key.clone());
131        } else if self.provable_keys.contains(key) {
132            self.provable_keys.remove(key);
133        }
134
135        Ok(())
136    }
137
138    #[cfg(test)]
139    /// Get the provable keys of the merkelized map
140    pub fn get_provable_keys(&self) -> &BTreeSet<K> {
141        &self.provable_keys
142    }
143
144    /// Check if the merkelized map contains a leaf (and returns the corresponding key and value if exists)
145    pub fn contains(&self, leaf: &MKTreeNode) -> Option<(&K, &V)> {
146        self.iter().find(|(_, v)| v.contains(leaf))
147    }
148
149    /// Get the value of the merkelized map for a given key
150    pub fn get(&self, key: &K) -> Option<&V> {
151        self.inner_map_values.get(key)
152    }
153
154    /// Get an iterator for the key and values of the merkelized map
155    pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
156        self.inner_map_values.iter()
157    }
158
159    /// Get the length of the merkelized map
160    pub fn len(&self) -> usize {
161        self.inner_map_values.len()
162    }
163
164    /// Check if the merkelized map is empty
165    pub fn is_empty(&self) -> bool {
166        self.inner_map_values.is_empty()
167    }
168
169    /// Compress the merkelized map
170    pub fn compress(&mut self) -> StdResult<()> {
171        let keys = self.provable_keys.clone();
172        for key in keys {
173            if let Some(value) = self.get(&key) {
174                let value = value
175                    .compute_root()?
176                    .try_into()
177                    .map_err(|_| anyhow!("Merkle root could not be converted to V"))?;
178                self.replace_unchecked(key.to_owned(), value)?;
179            }
180        }
181
182        Ok(())
183    }
184
185    /// Get the root of the merkle tree of the merkelized map
186    pub fn compute_root(&self) -> StdResult<MKTreeNode> {
187        self.inner_merkle_tree.compute_root()
188    }
189
190    /// Get the proof for a set of values of the merkelized map (recursively if needed)
191    pub fn compute_proof<T: Into<MKTreeNode> + Clone>(
192        &self,
193        leaves: &[T],
194    ) -> StdResult<MKMapProof<K>> {
195        if leaves.is_empty() {
196            return Err(anyhow!("MKMap could not compute proof for empty leaves"));
197        }
198
199        let leaves_by_keys = self.group_leaves_by_keys(leaves);
200        let mut sub_proofs = BTreeMap::<K, MKMapProof<K>>::default();
201        for (key, sub_leaves) in leaves_by_keys {
202            if let Some(value) = self.get(&key)
203                && let Some(proof) = value.compute_proof(&sub_leaves)?
204            {
205                sub_proofs.insert(key.to_owned(), proof);
206            }
207        }
208
209        let master_proof = self
210            .inner_merkle_tree
211            .compute_proof(
212                &sub_proofs
213                    .iter()
214                    .map(|(k, p)| k.to_owned().into() + p.compute_root().to_owned())
215                    .collect::<Vec<MKTreeNode>>(),
216            )
217            .with_context(|| "MKMap could not compute master proof")?;
218
219        Ok(MKMapProof::new(master_proof, sub_proofs))
220    }
221
222    /// Returns a map with the leaves (converted to Merkle tree nodes) grouped by keys
223    fn group_leaves_by_keys<T: Into<MKTreeNode> + Clone>(
224        &self,
225        leaves: &[T],
226    ) -> HashMap<K, Vec<MKTreeNode>> {
227        let can_compute_proof_map: HashMap<K, V> = self
228            .provable_keys
229            .iter()
230            .filter_map(|k| self.get(k).map(|v| (k.to_owned(), v.to_owned())))
231            .collect();
232        let leaves_by_keys: HashMap<K, Vec<MKTreeNode>> = can_compute_proof_map
233            .iter()
234            .map(|(key, value)| {
235                let leaves_found = leaves
236                    .iter()
237                    .filter_map(|leaf| value.contains(leaf).then_some(leaf.to_owned().into()))
238                    .collect::<Vec<_>>();
239
240                (key.to_owned(), leaves_found)
241            })
242            .fold(HashMap::default(), |mut acc, (key, leaves)| {
243                leaves.into_iter().for_each(|leaf| {
244                    acc.entry(key.to_owned()).or_default().push(leaf);
245                });
246
247                acc
248            });
249
250        leaves_by_keys
251    }
252}
253
254impl<K: MKMapKey, V: MKMapValue<K>, S: MKTreeStorer> Clone for MKMap<K, V, S> {
255    fn clone(&self) -> Self {
256        // Cloning should never fail so unwrap is safe
257        let mut clone = Self::new(&[]).unwrap();
258        for (k, v) in self.inner_map_values.iter() {
259            clone.insert(k.to_owned(), v.to_owned()).unwrap();
260        }
261
262        clone
263    }
264}
265
266impl<'a, K: MKMapKey, V: MKMapValue<K>, S: MKTreeStorer> From<&'a MKMap<K, V, S>>
267    for &'a MKTree<S>
268{
269    fn from(other: &'a MKMap<K, V, S>) -> Self {
270        &other.inner_merkle_tree
271    }
272}
273
274impl<K: MKMapKey, V: MKMapValue<K>, S: MKTreeStorer> TryFrom<MKMap<K, V, S>> for MKTreeNode {
275    type Error = StdError;
276    fn try_from(other: MKMap<K, V, S>) -> Result<Self, Self::Error> {
277        other.compute_root()
278    }
279}
280
281/// A MKMapProof that proves membership of an entry in the merkelized map
282#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
283pub struct MKMapProof<K: MKMapKey> {
284    master_proof: MKProof,
285    sub_proofs: Vec<(K, MKMapProof<K>)>,
286}
287
288impl<K: MKMapKey> MKMapProof<K> {
289    /// MKMapProof factory
290    pub fn new(master_proof: MKProof, sub_proofs: BTreeMap<K, MKMapProof<K>>) -> Self {
291        let sub_proofs = sub_proofs.into_iter().collect();
292        Self {
293            master_proof,
294            sub_proofs,
295        }
296    }
297
298    /// Get the root of the merkelized map proof
299    pub fn compute_root(&self) -> MKTreeNode {
300        self.master_proof.root().to_owned()
301    }
302
303    /// Verify the merkelized map proof
304    pub fn verify(&self) -> StdResult<()> {
305        for (_key, proof) in &self.sub_proofs {
306            proof
307                .verify()
308                .with_context(|| "MKMapProof could not verify sub proof")?;
309        }
310
311        self.master_proof
312            .verify()
313            .with_context(|| "MKMapProof could not verify master proof")?;
314        if !self.sub_proofs.is_empty() {
315            self.master_proof
316                .contains(
317                    &self
318                        .sub_proofs
319                        .iter()
320                        .map(|(k, p)| k.to_owned().into() + p.compute_root().to_owned())
321                        .collect::<Vec<_>>(),
322                )
323                .with_context(|| "MKMapProof could not match verified leaves of master proof")?;
324        }
325
326        Ok(())
327    }
328
329    /// Check if the merkelized map proof contains a leaf
330    pub fn contains(&self, leaf: &MKTreeNode) -> StdResult<()> {
331        let contains_leaf = {
332            self.master_proof.contains(&[leaf.to_owned()]).is_ok()
333                || self.sub_proofs.iter().any(|(_k, p)| p.contains(leaf).is_ok())
334        };
335
336        contains_leaf
337            .then_some(())
338            .with_context(|| format!("MKMapProof does not contain leaf {leaf:?}"))
339    }
340
341    /// List the leaves of the merkelized map proof
342    pub fn leaves(&self) -> Vec<MKTreeNode> {
343        if self.sub_proofs.is_empty() {
344            self.master_proof.leaves()
345        } else {
346            let mut leaves = vec![];
347            self.sub_proofs.iter().for_each(|(_k, p)| {
348                leaves.extend(p.leaves());
349            });
350
351            leaves
352        }
353    }
354}
355
356impl<K: MKMapKey + Serialize + for<'de> Deserialize<'de>> MKMapProof<K> {
357    /// Convert the proof to bytes
358    pub fn to_bytes(&self) -> StdResult<Vec<u8>> {
359        bincode::serde::encode_to_vec(self, bincode::config::standard()).map_err(|e| e.into())
360    }
361
362    /// Convert the proof from bytes
363    pub fn from_bytes(bytes: &[u8]) -> StdResult<Self> {
364        let (res, _) =
365            bincode::serde::decode_from_slice::<Self, _>(bytes, bincode::config::standard())?;
366
367        Ok(res)
368    }
369}
370
371impl<K: MKMapKey> From<MKProof> for MKMapProof<K> {
372    fn from(other: MKProof) -> Self {
373        MKMapProof::new(other, BTreeMap::default())
374    }
375}
376
377/// A merkelized map node that is used to represent multi layered merkelized map
378/// The MKMapNode can be either a MKMap (Merkle map), a MKTree (full Merkle tree) or a MKTreeNode (Merkle tree node, e.g the root of a Merkle tree)
379/// Both MKMap and MKTree can generate proofs of membership for elements that they contain, which allows for recursive proof generation for the multiple layers
380#[derive(Clone)]
381pub enum MKMapNode<K: MKMapKey, S: MKTreeStorer> {
382    /// A Merkle map
383    Map(Arc<MKMap<K, Self, S>>),
384
385    /// A full Merkle tree
386    Tree(Arc<MKTree<S>>),
387
388    /// A Merkle tree node
389    TreeNode(MKTreeNode),
390}
391
392impl<K: MKMapKey, S: MKTreeStorer> MKMapValue<K> for MKMapNode<K, S> {
393    fn compute_root(&self) -> StdResult<MKTreeNode> {
394        match self {
395            MKMapNode::Map(mk_map) => mk_map.compute_root(),
396            MKMapNode::Tree(merkle_tree) => merkle_tree.compute_root(),
397            MKMapNode::TreeNode(merkle_tree_node) => Ok(merkle_tree_node.to_owned()),
398        }
399    }
400
401    fn contains<T: Into<MKTreeNode> + Clone>(&self, leaf: &T) -> bool {
402        let leaf = leaf.to_owned().into();
403        match self {
404            MKMapNode::Map(mk_map) => mk_map.contains(&leaf).is_some(),
405            MKMapNode::Tree(merkle_tree) => merkle_tree.contains(&leaf),
406            MKMapNode::TreeNode(merkle_tree_node) => *merkle_tree_node == leaf,
407        }
408    }
409
410    fn can_compute_proof(&self) -> bool {
411        match self {
412            MKMapNode::Map(_) => true,
413            MKMapNode::Tree(_) => true,
414            MKMapNode::TreeNode(_) => false,
415        }
416    }
417
418    fn compute_proof<T: Into<MKTreeNode> + Clone>(
419        &self,
420        leaves: &[T],
421    ) -> StdResult<Option<MKMapProof<K>>> {
422        match self {
423            MKMapNode::Tree(value) => {
424                let proof = value
425                    .compute_proof(
426                        &leaves.iter().map(|leaf| leaf.to_owned().into()).collect::<Vec<_>>(),
427                    )
428                    .with_context(|| "MKMapValue could not compute sub proof for MKTree")?;
429                Ok(Some(proof.into()))
430            }
431            MKMapNode::Map(value) => {
432                let proof = value
433                    .compute_proof(
434                        &leaves.iter().map(|leaf| leaf.to_owned().into()).collect::<Vec<_>>(),
435                    )
436                    .with_context(|| "MKMapValue could not compute sub proof for MKMap")?;
437                Ok(Some(proof))
438            }
439            _ => Ok(None),
440        }
441    }
442}
443
444impl<K: MKMapKey, S: MKTreeStorer> From<MKMap<K, MKMapNode<K, S>, S>> for MKMapNode<K, S> {
445    fn from(other: MKMap<K, MKMapNode<K, S>, S>) -> Self {
446        MKMapNode::Map(Arc::new(other))
447    }
448}
449
450impl<K: MKMapKey, S: MKTreeStorer> From<MKTree<S>> for MKMapNode<K, S> {
451    fn from(other: MKTree<S>) -> Self {
452        MKMapNode::Tree(Arc::new(other))
453    }
454}
455
456impl<K: MKMapKey, S: MKTreeStorer> From<MKTreeNode> for MKMapNode<K, S> {
457    fn from(other: MKTreeNode) -> Self {
458        MKMapNode::TreeNode(other)
459    }
460}
461
462impl<K: MKMapKey, S: MKTreeStorer> TryFrom<MKMapNode<K, S>> for MKTreeNode {
463    type Error = StdError;
464    fn try_from(other: MKMapNode<K, S>) -> Result<Self, Self::Error> {
465        other.compute_root()
466    }
467}
468
469#[cfg(test)]
470mod tests {
471    use std::collections::BTreeSet;
472
473    use crate::{
474        crypto_helper::MKTreeStoreInMemory,
475        entities::{BlockNumber, BlockRange},
476        test::entities_extensions::BlockRangeTestExtension,
477    };
478
479    use super::*;
480
481    fn generate_merkle_trees(
482        total_leaves: u64,
483        block_range_length: u64,
484    ) -> Vec<(BlockRange, MKTree<MKTreeStoreInMemory>)> {
485        (0..total_leaves / block_range_length)
486            .map(|block_range_index| {
487                let block_range = BlockRange::from_block_number_and_length(
488                    BlockNumber(block_range_index),
489                    BlockNumber(block_range_length),
490                )
491                .unwrap();
492                let merkle_tree_block_range = generate_merkle_tree(&block_range);
493                (block_range, merkle_tree_block_range)
494            })
495            .collect::<Vec<_>>()
496    }
497
498    fn generate_merkle_tree(block_range: &BlockRange) -> MKTree<MKTreeStoreInMemory> {
499        let leaves = (*block_range.start..*block_range.end)
500            .map(|leaf_index| leaf_index.to_string())
501            .collect::<Vec<_>>();
502        MKTree::new(&leaves).unwrap()
503    }
504
505    fn generate_merkle_trees_for_ranges(
506        block_ranges: &[BlockRange],
507    ) -> Vec<(BlockRange, MKTree<MKTreeStoreInMemory>)> {
508        block_ranges
509            .iter()
510            .map(|block_range| (block_range.to_owned(), generate_merkle_tree(block_range)))
511            .collect()
512    }
513
514    fn into_mkmap_tree_entries(
515        entries: Vec<(BlockRange, MKTree<MKTreeStoreInMemory>)>,
516    ) -> Vec<(BlockRange, MKMapNode<BlockRange, MKTreeStoreInMemory>)> {
517        entries
518            .into_iter()
519            .map(|(range, mktree)| (range, MKMapNode::Tree(Arc::new(mktree))))
520            .collect()
521    }
522
523    fn into_mkmap_tree_node_entries(
524        entries: Vec<(BlockRange, MKTree<MKTreeStoreInMemory>)>,
525    ) -> Vec<(BlockRange, MKMapNode<BlockRange, MKTreeStoreInMemory>)> {
526        entries
527            .into_iter()
528            .map(|(range, mktree)| (range, MKMapNode::TreeNode(mktree.try_into().unwrap())))
529            .collect()
530    }
531
532    #[test]
533    fn get_keys() {
534        let keys = vec![BlockRange::new(0, 3), BlockRange::new(4, 6), BlockRange::new(7, 9)];
535        let entries = generate_merkle_trees_for_ranges(&keys);
536        let mk_map =
537            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
538
539        assert_eq!(keys.first(), mk_map.keys().next());
540        assert_eq!(keys.last(), mk_map.keys().next_back());
541        assert_eq!(keys, mk_map.keys().cloned().collect::<Vec<_>>());
542    }
543
544    #[test]
545    fn test_mk_map_should_compute_same_root_when_replacing_entry_with_equivalent() {
546        let entries = generate_merkle_trees(10, 3);
547        let mk_map_nodes =
548            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_node_entries(entries.clone()))
549                .unwrap();
550        let mk_map_full =
551            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
552
553        let mk_map_nodes_root = mk_map_nodes.compute_root().unwrap();
554        let mk_map_full_root = mk_map_full.compute_root().unwrap();
555
556        assert_eq!(mk_map_full_root, mk_map_nodes_root);
557    }
558
559    #[test]
560    fn test_mk_map_should_accept_replacement_with_same_root_value() {
561        let entries = generate_merkle_trees_for_ranges(&[
562            BlockRange::new(0, 3),
563            BlockRange::new(4, 6),
564            BlockRange::new(7, 9),
565        ]);
566        let mut mk_map =
567            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
568        let mk_map_root_expected = mk_map.compute_root().unwrap();
569        let block_range_replacement = BlockRange::new(0, 3);
570        let same_root_value = MKMapNode::TreeNode(
571            mk_map.get(&block_range_replacement).unwrap().compute_root().unwrap(),
572        );
573
574        mk_map.insert(block_range_replacement, same_root_value).unwrap();
575
576        assert_eq!(mk_map_root_expected, mk_map.compute_root().unwrap())
577    }
578
579    #[test]
580    fn test_mk_map_should_reject_replacement_with_different_root_value() {
581        let entries = generate_merkle_trees_for_ranges(&[
582            BlockRange::new(0, 3),
583            BlockRange::new(4, 6),
584            BlockRange::new(7, 9),
585        ]);
586        let mut mk_map =
587            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
588        let block_range_replacement = BlockRange::new(0, 3);
589        let value_replacement: MKTreeNode = "test-123".to_string().into();
590        let different_root_value = MKMapNode::TreeNode(value_replacement);
591
592        mk_map
593            .insert(block_range_replacement, different_root_value)
594            .expect_err("the MKMap should reject replacement with different root value");
595    }
596
597    #[test]
598    fn test_mk_map_replace_should_accept_replacement_with_same_root_value() {
599        let entries = generate_merkle_trees_for_ranges(&[
600            BlockRange::new(0, 3),
601            BlockRange::new(4, 6),
602            BlockRange::new(7, 9),
603        ]);
604        let mut mk_map =
605            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
606        let block_range_replacement = BlockRange::new(0, 3);
607        let same_root_value = MKMapNode::TreeNode(
608            mk_map.get(&block_range_replacement).unwrap().compute_root().unwrap(),
609        );
610        let mk_map_root_expected = mk_map.compute_root().unwrap();
611
612        assert!(matches!(
613            mk_map.get(&block_range_replacement).unwrap(),
614            MKMapNode::Tree(..)
615        ));
616
617        mk_map
618            .replace(block_range_replacement.clone(), same_root_value)
619            .unwrap();
620
621        assert_eq!(mk_map_root_expected, mk_map.compute_root().unwrap());
622        assert!(matches!(
623            mk_map.get(&block_range_replacement).unwrap(),
624            MKMapNode::TreeNode(..)
625        ));
626    }
627
628    #[test]
629    fn test_mk_map_replace_should_reject_replacement_if_key_doesnt_exist() {
630        let entries = generate_merkle_trees_for_ranges(&[
631            BlockRange::new(0, 3),
632            BlockRange::new(4, 6),
633            BlockRange::new(7, 9),
634        ]);
635        let mut mk_map =
636            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
637
638        let error = mk_map
639            .replace(
640                BlockRange::new(10, 12),
641                MKMapNode::TreeNode("whatever".into()),
642            )
643            .expect_err("the MKMap should reject replacement for nonexisting key");
644
645        assert!(
646            error.to_string().contains("MKMap could not replace non-existing key"),
647            "Invalid error message: `{error}`",
648        );
649    }
650
651    #[test]
652    fn test_mk_map_replace_should_reject_replacement_with_different_root_value() {
653        let entries = generate_merkle_trees_for_ranges(&[
654            BlockRange::new(0, 3),
655            BlockRange::new(4, 6),
656            BlockRange::new(7, 9),
657        ]);
658        let mut mk_map =
659            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
660
661        let error = mk_map
662            .replace(
663                BlockRange::new(0, 3),
664                MKMapNode::TreeNode("different_value".into()),
665            )
666            .expect_err("the MKMap should reject replacement with different root value");
667
668        assert!(
669            error
670                .to_string()
671                .contains("MKMap values should be replaced by entry with same root"),
672            "Invalid error message: `{error}`",
673        );
674    }
675
676    #[test]
677    fn test_mk_map_should_compress_correctly() {
678        let entries = generate_merkle_trees_for_ranges(&[
679            BlockRange::new(0, 3),
680            BlockRange::new(4, 6),
681            BlockRange::new(7, 9),
682        ]);
683        let mk_map =
684            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
685        let mk_map_root_expected = mk_map.compute_root().unwrap();
686        let mk_map_provable_keys = mk_map.get_provable_keys();
687        assert!(!mk_map_provable_keys.is_empty());
688
689        let mut mk_map_compressed = mk_map.clone();
690        mk_map_compressed.compress().unwrap();
691
692        let mk_map_compressed_root = mk_map_compressed.compute_root().unwrap();
693        let mk_map_compressed_provable_keys = mk_map_compressed.get_provable_keys();
694        assert_eq!(mk_map_root_expected, mk_map_compressed_root);
695        assert!(mk_map_compressed_provable_keys.is_empty());
696    }
697
698    #[test]
699    fn test_mk_map_should_reject_out_of_order_insertion() {
700        let entries = generate_merkle_trees_for_ranges(&[
701            BlockRange::new(0, 3),
702            BlockRange::new(4, 6),
703            BlockRange::new(7, 9),
704        ]);
705        let mut mk_map =
706            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_node_entries(entries))
707                .unwrap();
708        let out_of_order_entry = (
709            BlockRange::new(0, 25),
710            MKMapNode::TreeNode("test-123".into()),
711        );
712
713        mk_map
714            .insert(out_of_order_entry.0, out_of_order_entry.1)
715            .expect_err("the MKMap should reject out of order insertion");
716    }
717
718    #[test]
719    fn test_mk_map_should_list_keys_correctly() {
720        let entries = generate_merkle_trees_for_ranges(&[
721            BlockRange::new(0, 3),
722            BlockRange::new(4, 6),
723            BlockRange::new(7, 9),
724        ]);
725        let merkle_tree_entries = &into_mkmap_tree_node_entries(entries);
726        let mk_map =
727            MKMap::<_, _, MKTreeStoreInMemory>::new(merkle_tree_entries.as_slice()).unwrap();
728
729        let keys = mk_map.iter().map(|(k, _v)| k.to_owned()).collect::<Vec<_>>();
730        let expected_keys = merkle_tree_entries
731            .iter()
732            .map(|(k, _)| k)
733            .cloned()
734            .collect::<Vec<_>>();
735
736        assert_eq!(expected_keys, keys);
737    }
738
739    #[test]
740    fn test_mk_map_should_list_values_correctly() {
741        let entries = generate_merkle_trees_for_ranges(&[
742            BlockRange::new(0, 3),
743            BlockRange::new(4, 6),
744            BlockRange::new(7, 9),
745        ]);
746        let merkle_tree_entries = &into_mkmap_tree_node_entries(entries);
747        let mk_map =
748            MKMap::<_, _, MKTreeStoreInMemory>::new(merkle_tree_entries.as_slice()).unwrap();
749
750        let values = mk_map.iter().map(|(_k, v)| v.to_owned()).collect::<Vec<_>>();
751        let expected_values = merkle_tree_entries
752            .iter()
753            .map(|(_, v)| v)
754            .cloned()
755            .collect::<Vec<_>>();
756
757        assert_eq!(
758            BTreeSet::from_iter(expected_values.iter().map(|v| v.compute_root().unwrap())),
759            BTreeSet::from_iter(values.iter().map(|v| v.compute_root().unwrap()))
760        );
761    }
762
763    #[test]
764    fn test_mk_map_should_find_value_correctly() {
765        let entries = generate_merkle_trees_for_ranges(&[
766            BlockRange::new(0, 3),
767            BlockRange::new(4, 6),
768            BlockRange::new(7, 9),
769        ]);
770        let mktree_node_to_certify = entries[2].1.leaves()[1].clone();
771        let mk_map_full =
772            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
773
774        mk_map_full.contains(&mktree_node_to_certify).unwrap();
775    }
776
777    #[test]
778    fn test_mk_map_should_clone_and_compute_same_root() {
779        let entries = generate_merkle_trees_for_ranges(&[
780            BlockRange::new(0, 3),
781            BlockRange::new(4, 6),
782            BlockRange::new(7, 9),
783        ]);
784        let mk_map =
785            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
786
787        let mk_map_clone = mk_map.clone();
788
789        assert_eq!(
790            mk_map.compute_root().unwrap(),
791            mk_map_clone.compute_root().unwrap(),
792        );
793    }
794
795    #[test]
796    fn test_mk_map_should_not_compute_proof_for_no_leaves() {
797        let entries = generate_merkle_trees(10, 3);
798        let mktree_nodes_to_certify: &[MKTreeNode] = &[];
799        let mk_map_full =
800            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
801
802        mk_map_full
803            .compute_proof(mktree_nodes_to_certify)
804            .expect_err("MKMap should not compute proof for no leaves");
805    }
806
807    #[test]
808    fn test_mk_map_should_compute_and_verify_valid_proof() {
809        let entries = generate_merkle_trees(10, 3);
810        let mktree_nodes_to_certify = [
811            entries[0].1.leaves()[0].clone(),
812            entries[1].1.leaves()[0].clone(),
813            entries[1].1.leaves()[1].clone(),
814            entries[2].1.leaves()[1].clone(),
815        ];
816        let mk_map_full =
817            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
818        let mk_map_proof = mk_map_full.compute_proof(&mktree_nodes_to_certify).unwrap();
819
820        mk_map_proof.verify().unwrap();
821
822        let map_proof_root = mk_map_proof.compute_root();
823        let map_proof_root_expected = mk_map_full.compute_root().unwrap();
824        assert_eq!(map_proof_root, map_proof_root_expected);
825
826        let mk_proof_leaves = mk_map_proof.leaves();
827        assert_eq!(mktree_nodes_to_certify.to_vec(), mk_proof_leaves);
828    }
829
830    #[test]
831    fn test_mk_map_should_serialize_deserialize_proof() {
832        let entries = generate_merkle_trees(10, 3);
833        let mktree_nodes_to_certify = [
834            entries[0].1.leaves()[0].clone(),
835            entries[1].1.leaves()[0].clone(),
836            entries[1].1.leaves()[1].clone(),
837            entries[2].1.leaves()[1].clone(),
838        ];
839        let mk_map_full =
840            MKMap::<_, _, MKTreeStoreInMemory>::new(&into_mkmap_tree_entries(entries)).unwrap();
841        let mk_map_proof = mk_map_full.compute_proof(&mktree_nodes_to_certify).unwrap();
842
843        let serialized_mk_map_proof =
844            mk_map_proof.to_bytes().expect("Serialization should not fail");
845        let deserialized_mk_map_proof =
846            MKMapProof::<BlockRange>::from_bytes(&serialized_mk_map_proof)
847                .expect("Deserialization should not fail");
848        assert_eq!(
849            mk_map_proof, deserialized_mk_map_proof,
850            "Deserialized proof should match the original"
851        );
852    }
853
854    #[test]
855    fn test_mk_map_should_compute_and_verify_valid_proof_recursively() {
856        let entries = generate_merkle_trees(100, 3);
857        let mktree_nodes_to_certify = [
858            entries[0].1.leaves()[0].clone(),
859            entries[2].1.leaves()[1].clone(),
860            entries[3].1.leaves()[2].clone(),
861            entries[20].1.leaves()[0].clone(),
862            entries[30].1.leaves()[0].clone(),
863        ];
864        let merkle_tree_node_entries = &into_mkmap_tree_entries(entries)
865            .chunks(10)
866            .map(|entries| {
867                (
868                    entries.iter().fold(BlockRange::new(0, 0), |acc, (range, _)| {
869                        acc.try_add(range).unwrap()
870                    }),
871                    MKMapNode::Map(Arc::new(MKMap::new(entries).unwrap())),
872                )
873            })
874            .collect::<Vec<_>>();
875
876        let mk_map_full =
877            MKMap::<_, _, MKTreeStoreInMemory>::new(merkle_tree_node_entries.as_slice()).unwrap();
878
879        let mk_map_proof = mk_map_full.compute_proof(&mktree_nodes_to_certify).unwrap();
880
881        mk_map_proof.verify().unwrap();
882
883        let map_proof_root = mk_map_proof.compute_root();
884        let map_proof_root_expected = mk_map_full.compute_root().unwrap();
885        assert_eq!(map_proof_root, map_proof_root_expected);
886    }
887}