1use 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
15pub trait MKMapKey: PartialEq + Eq + PartialOrd + Ord + Clone + Hash + Into<MKTreeNode> {}
17
18pub trait MKMapValue<K: MKMapKey>: Clone + TryInto<MKTreeNode> + TryFrom<MKTreeNode> {
20 fn compute_root(&self) -> StdResult<MKTreeNode>;
22
23 fn contains<T: Into<MKTreeNode> + Clone>(&self, leaf: &T) -> bool;
25
26 fn can_compute_proof(&self) -> bool;
28
29 fn compute_proof<T: Into<MKTreeNode> + Clone>(
31 &self,
32 leaves: &[T],
33 ) -> StdResult<Option<MKMapProof<K>>>;
34}
35
36pub 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 pub fn new(entries: &[(K, V)]) -> StdResult<Self> {
46 Self::new_from_iter(entries.to_vec())
47 }
48
49 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 pub fn keys(&self) -> impl DoubleEndedIterator<Item = &K> {
69 self.inner_map_values.keys()
70 }
71
72 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 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 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 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 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 pub fn get_provable_keys(&self) -> &BTreeSet<K> {
141 &self.provable_keys
142 }
143
144 pub fn contains(&self, leaf: &MKTreeNode) -> Option<(&K, &V)> {
146 self.iter().find(|(_, v)| v.contains(leaf))
147 }
148
149 pub fn get(&self, key: &K) -> Option<&V> {
151 self.inner_map_values.get(key)
152 }
153
154 pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
156 self.inner_map_values.iter()
157 }
158
159 pub fn len(&self) -> usize {
161 self.inner_map_values.len()
162 }
163
164 pub fn is_empty(&self) -> bool {
166 self.inner_map_values.is_empty()
167 }
168
169 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 pub fn compute_root(&self) -> StdResult<MKTreeNode> {
187 self.inner_merkle_tree.compute_root()
188 }
189
190 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 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 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#[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 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 pub fn compute_root(&self) -> MKTreeNode {
300 self.master_proof.root().to_owned()
301 }
302
303 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 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 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 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 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#[derive(Clone)]
381pub enum MKMapNode<K: MKMapKey, S: MKTreeStorer> {
382 Map(Arc<MKMap<K, Self, S>>),
384
385 Tree(Arc<MKTree<S>>),
387
388 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}