@@ -6,6 +6,7 @@ use mithril_common::{
6
6
entities:: BlockRange ,
7
7
} ;
8
8
9
+ // Shortcuts for magnitudes: K for thousand, M for million, B for billion
9
10
const K : u64 = 1_000 ;
10
11
const M : u64 = 1_000 * K ;
11
12
const B : u64 = 1_000 * M ;
@@ -31,16 +32,16 @@ fn generate_block_ranges_nodes_iterator(
31
32
block_range_length : u64 ,
32
33
max_uncompressed_block_ranges : u64 ,
33
34
) -> impl Iterator < Item = ( BlockRange , MKMapNode < BlockRange > ) > {
34
- let total_block_ranges =
35
- total_transactions / ( total_transactions_per_block * block_range_length ) ;
35
+ let total_transactions_per_block_range = total_transactions_per_block * block_range_length ;
36
+ let total_block_ranges = total_transactions / total_transactions_per_block_range ;
36
37
assert ! (
37
38
total_block_ranges > 0 ,
38
39
"total_block_ranges should be strictly greater than 0"
39
40
) ;
40
41
( 0 ..total_block_ranges) . map ( move |block_range_index| {
41
42
let block_range = BlockRange :: new (
42
- block_range_index * total_transactions_per_block * block_range_length ,
43
- ( block_range_index + 1 ) * total_transactions_per_block * block_range_length ,
43
+ block_range_index * total_transactions_per_block_range ,
44
+ ( block_range_index + 1 ) * total_transactions_per_block_range ,
44
45
) ;
45
46
let mk_map_node = if block_range_index < max_uncompressed_block_ranges {
46
47
let leaves = <Range < u64 > as Clone >:: clone ( & block_range)
@@ -71,36 +72,35 @@ fn generate_merkle_map_compressed(
71
72
fn generate_merkle_map_root (
72
73
block_ranges_nodes_iterator : impl Iterator < Item = ( BlockRange , MKMapNode < BlockRange > ) > ,
73
74
mk_map_compressed : & MKMap < BlockRange , MKMapNode < BlockRange > > ,
74
- ) -> MKMapProof < BlockRange > {
75
- let ( mk_map_key_to_prove, mk_map_node_to_prove) =
76
- & block_ranges_nodes_iterator. take ( 1 ) . collect :: < Vec < _ > > ( ) [ 0 ] ;
77
- let mktree_to_prove = if let MKMapNode :: Tree ( mktree_to_prove) = mk_map_node_to_prove {
78
- mktree_to_prove
79
- } else {
80
- panic ! ( "Expected MKMapNode::Tree" ) ;
81
- } ;
82
- let leaves_to_prove = mktree_to_prove
83
- . leaves ( )
84
- . into_iter ( )
85
- . take ( 1 )
86
- . collect :: < Vec < _ > > ( ) ;
87
- let mut mk_map_compressed = mk_map_compressed. clone ( ) ;
88
- mk_map_compressed
89
- . insert (
90
- mk_map_key_to_prove. to_owned ( ) ,
91
- mk_map_node_to_prove. to_owned ( ) ,
92
- )
93
- . unwrap ( ) ;
94
- mk_map_compressed. compute_proof ( & leaves_to_prove) . unwrap ( )
75
+ ) -> MKMapNode < BlockRange > {
76
+ let total_full_mk_tree = 1 ;
77
+ let ( mk_map, _) = generate_merkle_map (
78
+ block_ranges_nodes_iterator,
79
+ mk_map_compressed,
80
+ total_full_mk_tree,
81
+ ) ;
82
+
83
+ mk_map. compute_root ( ) . unwrap ( ) . into ( )
95
84
}
96
85
97
86
fn generate_merkle_map_proof (
98
87
block_ranges_nodes_iterator : impl Iterator < Item = ( BlockRange , MKMapNode < BlockRange > ) > ,
99
88
mk_map_compressed : & MKMap < BlockRange , MKMapNode < BlockRange > > ,
100
89
total_proofs : u64 ,
101
90
) -> MKMapProof < BlockRange > {
91
+ let ( mk_map, leaves_to_prove_all) =
92
+ generate_merkle_map ( block_ranges_nodes_iterator, mk_map_compressed, total_proofs) ;
93
+
94
+ mk_map. compute_proof ( & leaves_to_prove_all) . unwrap ( )
95
+ }
96
+
97
+ fn generate_merkle_map (
98
+ block_ranges_nodes_iterator : impl Iterator < Item = ( BlockRange , MKMapNode < BlockRange > ) > ,
99
+ mk_map_compressed : & MKMap < BlockRange , MKMapNode < BlockRange > > ,
100
+ total_proofs : u64 ,
101
+ ) -> ( MKMap < BlockRange , MKMapNode < BlockRange > > , Vec < MKTreeNode > ) {
102
102
let mut leaves_to_prove_all: Vec < MKTreeNode > = vec ! [ ] ;
103
- let mut mk_map_compressed = mk_map_compressed. clone ( ) ;
103
+ let mut mk_map = mk_map_compressed. clone ( ) ;
104
104
for ( mk_map_key_to_prove, mk_map_node_to_prove) in & block_ranges_nodes_iterator
105
105
. take ( total_proofs as usize )
106
106
. collect :: < Vec < _ > > ( )
@@ -116,16 +116,15 @@ fn generate_merkle_map_proof(
116
116
. take ( 1 )
117
117
. collect :: < Vec < _ > > ( ) ;
118
118
leaves_to_prove_all. extend ( leaves_to_prove) ;
119
- mk_map_compressed
119
+ mk_map
120
120
. insert (
121
121
mk_map_key_to_prove. to_owned ( ) ,
122
122
mk_map_node_to_prove. to_owned ( ) ,
123
123
)
124
124
. unwrap ( ) ;
125
125
}
126
- mk_map_compressed
127
- . compute_proof ( & leaves_to_prove_all)
128
- . unwrap ( )
126
+
127
+ ( mk_map, leaves_to_prove_all)
129
128
}
130
129
131
130
fn create_merkle_map_root_benches ( c : & mut Criterion ) {
@@ -161,7 +160,7 @@ fn create_merkle_map_root_benches(c: &mut Criterion) {
161
160
162
161
fn create_merkle_map_proof_benches ( c : & mut Criterion ) {
163
162
let mut group = c. benchmark_group ( format ! (
164
- "create_merkle_map_proof_ (blocks_ranges_length={BLOCK_RANGE_LENGTH_BENCH},txs_per_block={TOTAL_TRANSACTIONS_PER_BLOCK},txs_per_proof={MAX_TRANSACTIONS_PER_PROOF_BENCH})"
163
+ "create_merkle_map_proof (blocks_ranges_length={BLOCK_RANGE_LENGTH_BENCH},txs_per_block={TOTAL_TRANSACTIONS_PER_BLOCK},txs_per_proof={MAX_TRANSACTIONS_PER_PROOF_BENCH})"
165
164
) ) ;
166
165
for total_leaves in TOTAL_TRANSACTIONS_BENCHES . iter ( ) {
167
166
let mk_trees_by_block_range_iterator = generate_block_ranges_nodes_iterator (
@@ -197,14 +196,14 @@ fn create_merkle_map_proof_benches(c: &mut Criterion) {
197
196
198
197
fn verify_merkle_map_proof_benches ( c : & mut Criterion ) {
199
198
let mut group = c. benchmark_group ( format ! (
200
- "verify_merkle_map_proof_ (blocks_ranges_length={BLOCK_RANGE_LENGTH_BENCH},txs_per_block={TOTAL_TRANSACTIONS_PER_BLOCK},txs_per_proof={MAX_TRANSACTIONS_PER_PROOF_BENCH})"
199
+ "verify_merkle_map_proof (blocks_ranges_length={BLOCK_RANGE_LENGTH_BENCH},txs_per_block={TOTAL_TRANSACTIONS_PER_BLOCK},txs_per_proof={MAX_TRANSACTIONS_PER_PROOF_BENCH})"
201
200
) ) ;
202
201
for total_leaves in TOTAL_TRANSACTIONS_BENCHES . iter ( ) {
203
202
let mk_trees_by_block_range_iterator = generate_block_ranges_nodes_iterator (
204
203
* total_leaves,
205
204
TOTAL_TRANSACTIONS_PER_BLOCK ,
206
205
BLOCK_RANGE_LENGTH_BENCH ,
207
- 1 ,
206
+ MAX_TRANSACTIONS_PER_PROOF_BENCH ,
208
207
) ;
209
208
let mk_map_compressed = generate_merkle_map_compressed ( mk_trees_by_block_range_iterator) ;
210
209
let mk_trees_by_block_range_iterator = generate_block_ranges_nodes_iterator (
@@ -232,7 +231,7 @@ fn verify_merkle_map_proof_benches(c: &mut Criterion) {
232
231
233
232
criterion_group ! (
234
233
name = benches;
235
- config = Criterion :: default ( ) . sample_size( 10 ) ;
234
+ config = Criterion :: default ( ) . sample_size( 100 ) ;
236
235
targets =
237
236
create_merkle_map_root_benches,
238
237
create_merkle_map_proof_benches,
0 commit comments