@@ -6,14 +6,15 @@ use std::{
6
6
use async_trait:: async_trait;
7
7
8
8
use mithril_common:: {
9
- crypto_helper:: MKTree ,
9
+ crypto_helper:: { MKMap , MKMapNode , MKTree } ,
10
10
entities:: {
11
11
BlockRange , CardanoDbBeacon , CardanoTransaction , CardanoTransactionsSetProof ,
12
12
TransactionHash ,
13
13
} ,
14
14
signable_builder:: BlockRangeRootRetriever ,
15
15
StdResult ,
16
16
} ;
17
+ use tokio:: sync:: Mutex ;
17
18
18
19
/// Prover service is the cryptographic engine in charge of producing cryptographic proofs for transactions
19
20
#[ cfg_attr( test, mockall:: automock) ]
@@ -25,6 +26,16 @@ pub trait ProverService: Sync + Send {
25
26
up_to : & CardanoDbBeacon ,
26
27
transaction_hashes : & [ TransactionHash ] ,
27
28
) -> StdResult < Vec < CardanoTransactionsSetProof > > ;
29
+
30
+ /// Compute the cache
31
+ async fn compute_cache ( & self , _up_to : & CardanoDbBeacon ) -> StdResult < ( ) > {
32
+ Ok ( ( ) )
33
+ }
34
+
35
+ /// Clear the cache
36
+ async fn clear_cache ( & self ) -> StdResult < ( ) > {
37
+ Ok ( ( ) )
38
+ }
28
39
}
29
40
30
41
/// Transactions retriever
@@ -51,6 +62,7 @@ pub trait TransactionsRetriever: Sync + Send {
51
62
pub struct MithrilProverService {
52
63
transaction_retriever : Arc < dyn TransactionsRetriever > ,
53
64
block_range_root_retriever : Arc < dyn BlockRangeRootRetriever > ,
65
+ mk_map_cache : Mutex < Option < MKMap < BlockRange , MKMapNode < BlockRange > > > > ,
54
66
}
55
67
56
68
impl MithrilProverService {
@@ -62,6 +74,7 @@ impl MithrilProverService {
62
74
Self {
63
75
transaction_retriever,
64
76
block_range_root_retriever,
77
+ mk_map_cache : Mutex :: new ( None ) ,
65
78
}
66
79
}
67
80
@@ -123,10 +136,9 @@ impl ProverService for MithrilProverService {
123
136
}
124
137
125
138
// 3 - Compute block range roots Merkle map
126
- let mut mk_map = self
127
- . block_range_root_retriever
128
- . compute_merkle_map_from_block_range_roots ( up_to. immutable_file_number )
129
- . await ?;
139
+ self . compute_cache ( up_to) . await ?;
140
+ let mut mk_map = self . mk_map_cache . lock ( ) . await ;
141
+ let mk_map = mk_map. as_mut ( ) . unwrap ( ) ;
130
142
131
143
// 4 - Enrich the Merkle map with the block ranges Merkle trees
132
144
for ( block_range, mk_tree) in mk_trees {
@@ -149,6 +161,27 @@ impl ProverService for MithrilProverService {
149
161
Ok ( vec ! [ ] )
150
162
}
151
163
}
164
+
165
+ async fn compute_cache ( & self , up_to : & CardanoDbBeacon ) -> StdResult < ( ) > {
166
+ let mut mk_map = self . mk_map_cache . lock ( ) . await ;
167
+ if mk_map. is_none ( ) {
168
+ println ! ( "Computing Merkle map from block range roots" ) ;
169
+ let mk_map_cache = self
170
+ . block_range_root_retriever
171
+ . compute_merkle_map_from_block_range_roots ( up_to. immutable_file_number )
172
+ . await ?;
173
+ mk_map. replace ( mk_map_cache) ;
174
+ }
175
+
176
+ Ok ( ( ) )
177
+ }
178
+
179
+ async fn clear_cache ( & self ) -> StdResult < ( ) > {
180
+ let mut mk_map = self . mk_map_cache . lock ( ) . await ;
181
+ mk_map. take ( ) ;
182
+
183
+ Ok ( ( ) )
184
+ }
152
185
}
153
186
154
187
#[ cfg( test) ]
0 commit comments