@@ -63,6 +63,8 @@ impl<K: MKMapKey, V: MKMapValue<K>> MKMap<K, V> {
63
63
"MKMap values should be replaced by entry with same root"
64
64
) ) ;
65
65
}
66
+ self . inner_map_values . insert ( key. clone ( ) , value. clone ( ) ) ;
67
+ return Ok ( ( ) ) ;
66
68
} else {
67
69
let key_max = self . inner_map_values . keys ( ) . max ( ) ;
68
70
if key_max > Some ( & key) {
@@ -253,16 +255,18 @@ impl<K: MKMapKey> From<MKProof> for MKMapProof<K> {
253
255
}
254
256
}
255
257
256
- /// A MKMap node
258
+ /// A merkelized map node that is used to represent multi layered merkelized map
259
+ /// 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)
260
+ /// Both MKMap and MKTree can generate proofs of membership for elements that they contain, which allows for recursive proof generation for the multiple layers
257
261
#[ derive( Clone ) ]
258
262
pub enum MKMapNode < K : MKMapKey > {
259
- /// A MKMap node
263
+ /// A Merkle map
260
264
Map ( Rc < MKMap < K , Self > > ) ,
261
265
262
- /// A MKTree node
266
+ /// A full Merkle tree
263
267
Tree ( Rc < MKTree > ) ,
264
268
265
- /// A MKTreeNode node
269
+ /// A Merkle tree node
266
270
TreeNode ( MKTreeNode ) ,
267
271
}
268
272
@@ -357,23 +361,25 @@ mod tests {
357
361
) -> Vec < ( BlockRange , MKTree ) > {
358
362
( 0 ..total_leaves / block_range_length)
359
363
. map ( |block_range_index| {
360
- let block_range = BlockRange :: new (
361
- block_range_index * block_range_length,
362
- ( block_range_index + 1 ) * block_range_length,
363
- ) ;
364
- let leaves = <Range < u64 > as Clone >:: clone ( & block_range)
365
- . map ( |leaf_index| leaf_index. to_string ( ) )
366
- . collect :: < Vec < _ > > ( ) ;
367
- let merkle_tree_block_range = MKTree :: new ( & leaves) . unwrap ( ) ;
368
-
364
+ let block_range =
365
+ BlockRange :: from_block_number_and_length ( block_range_index, block_range_length)
366
+ . unwrap ( ) ;
367
+ let merkle_tree_block_range = generate_merkle_tree ( & block_range) ;
369
368
( block_range, merkle_tree_block_range)
370
369
} )
371
370
. collect :: < Vec < _ > > ( )
372
371
}
373
372
373
+ fn generate_merkle_tree ( block_range : & BlockRange ) -> MKTree {
374
+ let leaves = <Range < u64 > as Clone >:: clone ( block_range)
375
+ . map ( |leaf_index| leaf_index. to_string ( ) )
376
+ . collect :: < Vec < _ > > ( ) ;
377
+ MKTree :: new ( & leaves) . unwrap ( )
378
+ }
379
+
374
380
#[ test]
375
- fn test_mk_map_should_compute_consistent_root ( ) {
376
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
381
+ fn test_mk_map_should_compute_same_root_when_replacing_entry_with_equivalent ( ) {
382
+ let entries = generate_merkle_trees ( 10 , 3 ) ;
377
383
let merkle_tree_node_entries = & entries
378
384
. iter ( )
379
385
. map ( |( range, mktree) | {
@@ -387,7 +393,6 @@ mod tests {
387
393
. into_iter ( )
388
394
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
389
395
. collect :: < Vec < ( _ , MKMapNode < _ > ) > > ( ) ;
390
-
391
396
let mk_map_nodes = MKMap :: new ( merkle_tree_node_entries. as_slice ( ) ) . unwrap ( ) ;
392
397
let mk_map_full = MKMap :: new ( merkle_tree_full_entries. as_slice ( ) ) . unwrap ( ) ;
393
398
@@ -399,44 +404,70 @@ mod tests {
399
404
400
405
#[ test]
401
406
fn test_mk_map_should_accept_replacement_with_same_root_value ( ) {
402
- let entries = generate_merkle_trees ( 1000 , 10 ) ;
407
+ let entries = [
408
+ BlockRange :: new ( 0 , 3 ) ,
409
+ BlockRange :: new ( 4 , 6 ) ,
410
+ BlockRange :: new ( 7 , 9 ) ,
411
+ ]
412
+ . iter ( )
413
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
414
+ . collect :: < Vec < _ > > ( ) ;
403
415
let merkle_tree_entries = & entries
404
416
. into_iter ( )
405
417
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
406
418
. collect :: < Vec < ( _ , MKMapNode < _ > ) > > ( ) ;
407
419
let mut mk_map = MKMap :: new ( merkle_tree_entries. as_slice ( ) ) . unwrap ( ) ;
408
- let block_range_replacement = BlockRange :: new ( 0 , 10 ) ;
420
+ let mk_map_root_expected = mk_map. compute_root ( ) . unwrap ( ) ;
421
+ let block_range_replacement = BlockRange :: new ( 0 , 3 ) ;
409
422
let same_root_value = MKMapNode :: TreeNode (
410
423
mk_map
411
424
. get ( & block_range_replacement)
412
425
. unwrap ( )
413
426
. compute_root ( )
414
427
. unwrap ( ) ,
415
428
) ;
429
+
416
430
mk_map
417
431
. insert ( block_range_replacement, same_root_value)
418
432
. unwrap ( ) ;
433
+
434
+ assert_eq ! ( mk_map_root_expected, mk_map. compute_root( ) . unwrap( ) )
419
435
}
420
436
421
437
#[ test]
422
438
fn test_mk_map_should_reject_replacement_with_different_root_value ( ) {
423
- let entries = generate_merkle_trees ( 1000 , 10 ) ;
439
+ let entries = [
440
+ BlockRange :: new ( 0 , 3 ) ,
441
+ BlockRange :: new ( 4 , 6 ) ,
442
+ BlockRange :: new ( 7 , 9 ) ,
443
+ ]
444
+ . iter ( )
445
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
446
+ . collect :: < Vec < _ > > ( ) ;
424
447
let merkle_tree_entries = & entries
425
448
. into_iter ( )
426
449
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
427
450
. collect :: < Vec < _ > > ( ) ;
428
451
let mut mk_map = MKMap :: new ( merkle_tree_entries. as_slice ( ) ) . unwrap ( ) ;
429
- let block_range_replacement = BlockRange :: new ( 0 , 10 ) ;
452
+ let block_range_replacement = BlockRange :: new ( 0 , 3 ) ;
430
453
let value_replacement: MKTreeNode = "test-123" . to_string ( ) . into ( ) ;
431
454
let different_root_value = MKMapNode :: TreeNode ( value_replacement) ;
455
+
432
456
mk_map
433
457
. insert ( block_range_replacement, different_root_value)
434
458
. expect_err ( "the MKMap should reject replacement with different root value" ) ;
435
459
}
436
460
437
461
#[ test]
438
462
fn test_mk_map_should_reject_out_of_order_insertion ( ) {
439
- let entries = generate_merkle_trees ( 1000 , 10 ) ;
463
+ let entries = [
464
+ BlockRange :: new ( 0 , 3 ) ,
465
+ BlockRange :: new ( 4 , 6 ) ,
466
+ BlockRange :: new ( 7 , 9 ) ,
467
+ ]
468
+ . iter ( )
469
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
470
+ . collect :: < Vec < _ > > ( ) ;
440
471
let merkle_tree_entries = & entries
441
472
. iter ( )
442
473
. map ( |( range, mktree) | {
@@ -451,14 +482,22 @@ mod tests {
451
482
BlockRange :: new ( 0 , 25 ) ,
452
483
MKMapNode :: TreeNode ( "test-123" . into ( ) ) ,
453
484
) ;
485
+
454
486
mk_map
455
487
. insert ( out_of_order_entry. 0 , out_of_order_entry. 1 )
456
488
. expect_err ( "the MKMap should reject out of order insertion" ) ;
457
489
}
458
490
459
491
#[ test]
460
492
fn test_mk_map_should_list_keys_correctly ( ) {
461
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
493
+ let entries = [
494
+ BlockRange :: new ( 0 , 3 ) ,
495
+ BlockRange :: new ( 4 , 6 ) ,
496
+ BlockRange :: new ( 7 , 9 ) ,
497
+ ]
498
+ . iter ( )
499
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
500
+ . collect :: < Vec < _ > > ( ) ;
462
501
let merkle_tree_entries = & entries
463
502
. iter ( )
464
503
. map ( |( range, mktree) | {
@@ -469,6 +508,7 @@ mod tests {
469
508
} )
470
509
. collect :: < Vec < _ > > ( ) ;
471
510
let mk_map = MKMap :: new ( merkle_tree_entries. as_slice ( ) ) . unwrap ( ) ;
511
+
472
512
let keys = mk_map
473
513
. iter ( )
474
514
. map ( |( k, _v) | k. to_owned ( ) )
@@ -484,7 +524,14 @@ mod tests {
484
524
485
525
#[ test]
486
526
fn test_mk_map_should_list_values_correctly ( ) {
487
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
527
+ let entries = [
528
+ BlockRange :: new ( 0 , 3 ) ,
529
+ BlockRange :: new ( 4 , 6 ) ,
530
+ BlockRange :: new ( 7 , 9 ) ,
531
+ ]
532
+ . iter ( )
533
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
534
+ . collect :: < Vec < _ > > ( ) ;
488
535
let merkle_tree_entries = & entries
489
536
. iter ( )
490
537
. map ( |( range, mktree) | {
@@ -495,6 +542,7 @@ mod tests {
495
542
} )
496
543
. collect :: < Vec < _ > > ( ) ;
497
544
let mk_map = MKMap :: new ( merkle_tree_entries. as_slice ( ) ) . unwrap ( ) ;
545
+
498
546
let values = mk_map
499
547
. iter ( )
500
548
. map ( |( _k, v) | v. to_owned ( ) )
@@ -513,8 +561,15 @@ mod tests {
513
561
514
562
#[ test]
515
563
fn test_mk_map_should_find_value_correctly ( ) {
516
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
517
- let mktree_node_to_certify = entries[ 2 ] . 1 . leaves ( ) [ 10 ] . clone ( ) ;
564
+ let entries = [
565
+ BlockRange :: new ( 0 , 3 ) ,
566
+ BlockRange :: new ( 4 , 6 ) ,
567
+ BlockRange :: new ( 7 , 9 ) ,
568
+ ]
569
+ . iter ( )
570
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
571
+ . collect :: < Vec < _ > > ( ) ;
572
+ let mktree_node_to_certify = entries[ 2 ] . 1 . leaves ( ) [ 1 ] . clone ( ) ;
518
573
let merkle_tree_entries = & entries
519
574
. into_iter ( )
520
575
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
@@ -525,13 +580,21 @@ mod tests {
525
580
}
526
581
527
582
#[ test]
528
- fn test_mk_map_should_clone_correctly ( ) {
529
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
583
+ fn test_mk_map_should_clone_and_compute_same_root ( ) {
584
+ let entries = [
585
+ BlockRange :: new ( 0 , 3 ) ,
586
+ BlockRange :: new ( 4 , 6 ) ,
587
+ BlockRange :: new ( 7 , 9 ) ,
588
+ ]
589
+ . iter ( )
590
+ . map ( |block_range| ( block_range. to_owned ( ) , generate_merkle_tree ( block_range) ) )
591
+ . collect :: < Vec < _ > > ( ) ;
530
592
let merkle_tree_node_entries = & entries
531
593
. into_iter ( )
532
594
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
533
595
. collect :: < Vec < ( _ , MKMapNode < _ > ) > > ( ) ;
534
596
let mk_map = MKMap :: new ( merkle_tree_node_entries. as_slice ( ) ) . unwrap ( ) ;
597
+
535
598
let mk_map_clone = mk_map. clone ( ) ;
536
599
537
600
assert_eq ! (
@@ -542,26 +605,27 @@ mod tests {
542
605
543
606
#[ test]
544
607
fn test_mk_map_should_not_compute_proof_for_no_leaves ( ) {
545
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
608
+ let entries = generate_merkle_trees ( 10 , 3 ) ;
546
609
let mktree_nodes_to_certify: & [ MKTreeNode ] = & [ ] ;
547
610
let merkle_tree_node_entries = & entries
548
611
. into_iter ( )
549
612
. map ( |( range, mktree) | ( range. to_owned ( ) , mktree. into ( ) ) )
550
613
. collect :: < Vec < ( _ , MKMapNode < _ > ) > > ( ) ;
551
614
let mk_map_full = MKMap :: new ( merkle_tree_node_entries. as_slice ( ) ) . unwrap ( ) ;
615
+
552
616
mk_map_full
553
617
. compute_proof ( mktree_nodes_to_certify)
554
618
. expect_err ( "MKMap should not compute proof for no leaves" ) ;
555
619
}
556
620
557
621
#[ test]
558
622
fn test_mk_map_should_compute_and_verify_valid_proof ( ) {
559
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
623
+ let entries = generate_merkle_trees ( 10 , 3 ) ;
560
624
let mktree_nodes_to_certify = [
561
625
entries[ 0 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
562
- entries[ 2 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
563
- entries[ 2 ] . 1 . leaves ( ) [ 5 ] . clone ( ) ,
564
- entries[ 3 ] . 1 . leaves ( ) [ 10 ] . clone ( ) ,
626
+ entries[ 1 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
627
+ entries[ 1 ] . 1 . leaves ( ) [ 1 ] . clone ( ) ,
628
+ entries[ 2 ] . 1 . leaves ( ) [ 1 ] . clone ( ) ,
565
629
] ;
566
630
let merkle_tree_node_entries = & entries
567
631
. into_iter ( )
@@ -579,11 +643,11 @@ mod tests {
579
643
580
644
#[ test]
581
645
fn test_mk_map_should_compute_and_verify_valid_proof_recursively ( ) {
582
- let entries = generate_merkle_trees ( 100000 , 100 ) ;
646
+ let entries = generate_merkle_trees ( 100 , 3 ) ;
583
647
let mktree_nodes_to_certify = [
584
648
entries[ 0 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
585
- entries[ 2 ] . 1 . leaves ( ) [ 5 ] . clone ( ) ,
586
- entries[ 3 ] . 1 . leaves ( ) [ 10 ] . clone ( ) ,
649
+ entries[ 2 ] . 1 . leaves ( ) [ 1 ] . clone ( ) ,
650
+ entries[ 3 ] . 1 . leaves ( ) [ 2 ] . clone ( ) ,
587
651
entries[ 20 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
588
652
entries[ 30 ] . 1 . leaves ( ) [ 0 ] . clone ( ) ,
589
653
] ;
0 commit comments