Skip to content

Commit 9afedda

Browse files
committed
Add MKMap::new_from_iter to construct an MKMap with reduced copies
1 parent 1b04400 commit 9afedda

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

mithril-aggregator/src/services/prover.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl MithrilProverService {
7979
.or_default()
8080
.push(transaction.transaction_hash);
8181
}
82-
let mk_hash_map = MKMap::new(
82+
let mk_hash_map = MKMap::new_from_iter(
8383
transactions_by_block_ranges
8484
.into_iter()
8585
.try_fold(
@@ -88,8 +88,7 @@ impl MithrilProverService {
8888
acc.push((block_range, MKTree::new(&transactions)?.into()));
8989
Ok(acc)
9090
},
91-
)?
92-
.as_slice(),
91+
)?,
9392
)
9493
.with_context(|| "ProverService failed to compute the merkelized structure that proves ownership of the transaction")?;
9594

mithril-common/src/crypto_helper/merkle_map.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,20 @@ pub struct MKMap<K: MKMapKey, V: MKMapValue<K>> {
3939
impl<K: MKMapKey, V: MKMapValue<K>> MKMap<K, V> {
4040
/// MKMap factory
4141
pub fn new(entries: &[(K, V)]) -> StdResult<Self> {
42+
Self::new_from_iter(entries.to_vec())
43+
}
44+
45+
/// MKMap factory
46+
pub fn new_from_iter<T: IntoIterator<Item = (K, V)>>(entries: T) -> StdResult<Self> {
4247
let inner_map_values = BTreeMap::default();
4348
let inner_merkle_tree = MKTree::new::<MKTreeNode>(&[])?;
4449
let mut mk_map = Self {
4550
inner_map_values,
4651
inner_merkle_tree,
4752
};
48-
let sorted_entries = BTreeMap::from_iter(entries.to_vec());
53+
let sorted_entries = BTreeMap::from_iter(entries);
4954
for (key, value) in sorted_entries {
50-
mk_map.insert_unchecked(key.clone(), value.clone())?;
55+
mk_map.insert_unchecked(key, value)?;
5156
}
5257

5358
Ok(mk_map)
@@ -394,7 +399,7 @@ mod tests {
394399
.map(|(range, mktree)| (range.to_owned(), mktree.into()))
395400
.collect::<Vec<(_, MKMapNode<_>)>>();
396401
let mk_map_nodes = MKMap::new(merkle_tree_node_entries.as_slice()).unwrap();
397-
let mk_map_full = MKMap::new(merkle_tree_full_entries.as_slice()).unwrap();
402+
let mk_map_full = MKMap::new(merkle_tree_full_entries).unwrap();
398403

399404
let mk_map_nodes_root = mk_map_nodes.compute_root().unwrap();
400405
let mk_map_full_root = mk_map_full.compute_root().unwrap();

mithril-common/src/signable_builder/cardano_transactions.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl CardanoTransactionsSignableBuilder {
4646
// This will be not be the case when we use the cached intermediate merkle roots.
4747
fn compute_merkle_map_from_transactions(
4848
&self,
49-
transactions: &[CardanoTransaction],
49+
transactions: Vec<CardanoTransaction>,
5050
) -> StdResult<MKMap<BlockRange, MKMapNode<BlockRange>>> {
5151
let mut transactions_by_block_ranges: HashMap<BlockRange, Vec<TransactionHash>> =
5252
HashMap::new();
@@ -55,9 +55,9 @@ impl CardanoTransactionsSignableBuilder {
5555
transactions_by_block_ranges
5656
.entry(block_range)
5757
.or_default()
58-
.push(transaction.transaction_hash.to_owned());
58+
.push(transaction.transaction_hash);
5959
}
60-
let mk_hash_map = MKMap::new(
60+
let mk_hash_map = MKMap::new_from_iter(
6161
transactions_by_block_ranges
6262
.into_iter()
6363
.try_fold(
@@ -66,15 +66,14 @@ impl CardanoTransactionsSignableBuilder {
6666
acc.push((block_range, MKTree::new(&transactions)?.into()));
6767
Ok(acc)
6868
},
69-
)?
70-
.as_slice(),
69+
)?,
7170
)
7271
.with_context(|| "ProverService failed to compute the merkelized structure that proves ownership of the transaction")?;
7372

7473
Ok(mk_hash_map)
7574
}
7675

77-
fn compute_merkle_root(&self, transactions: &[CardanoTransaction]) -> StdResult<MKTreeNode> {
76+
fn compute_merkle_root(&self, transactions: Vec<CardanoTransaction>) -> StdResult<MKTreeNode> {
7877
let mk_map = self.compute_merkle_map_from_transactions(transactions)?;
7978

8079
let mk_root = mk_map.compute_root().with_context(|| {
@@ -100,7 +99,7 @@ impl SignableBuilder<CardanoDbBeacon> for CardanoTransactionsSignableBuilder {
10099
.transaction_importer
101100
.import(beacon.immutable_file_number)
102101
.await?;
103-
let mk_root = self.compute_merkle_root(&transactions)?;
102+
let mk_root = self.compute_merkle_root(transactions)?;
104103

105104
let mut protocol_message = ProtocolMessage::new();
106105
protocol_message.set_message_part(
@@ -153,7 +152,7 @@ mod tests {
153152
);
154153

155154
let merkle_root_reference = cardano_transaction_signable_builder
156-
.compute_merkle_root(&[
155+
.compute_merkle_root(vec![
157156
transaction_1.clone(),
158157
transaction_2.clone(),
159158
transaction_3.clone(),
@@ -163,14 +162,14 @@ mod tests {
163162
{
164163
let transactions_set = vec![transaction_1.clone()];
165164
let mk_root = cardano_transaction_signable_builder
166-
.compute_merkle_root(&transactions_set)
165+
.compute_merkle_root(transactions_set)
167166
.unwrap();
168167
assert_ne!(merkle_root_reference, mk_root);
169168
}
170169
{
171170
let transactions_set = vec![transaction_1.clone(), transaction_2.clone()];
172171
let mk_root = cardano_transaction_signable_builder
173-
.compute_merkle_root(&transactions_set)
172+
.compute_merkle_root(transactions_set)
174173
.unwrap();
175174
assert_ne!(merkle_root_reference, mk_root);
176175
}
@@ -182,7 +181,7 @@ mod tests {
182181
transaction_4.clone(),
183182
];
184183
let mk_root = cardano_transaction_signable_builder
185-
.compute_merkle_root(&transactions_set)
184+
.compute_merkle_root(transactions_set)
186185
.unwrap();
187186
assert_ne!(merkle_root_reference, mk_root);
188187
}
@@ -195,7 +194,7 @@ mod tests {
195194
transaction_2.clone(),
196195
];
197196
let mk_root = cardano_transaction_signable_builder
198-
.compute_merkle_root(&transactions_set)
197+
.compute_merkle_root(transactions_set)
199198
.unwrap();
200199
assert_ne!(merkle_root_reference, mk_root);
201200
}
@@ -214,11 +213,11 @@ mod tests {
214213
);
215214

216215
let merkle_root_reference = cardano_transaction_signable_builder
217-
.compute_merkle_root(&[transaction_1.clone(), transaction_2.clone()])
216+
.compute_merkle_root(vec![transaction_1.clone(), transaction_2.clone()])
218217
.unwrap();
219218

220219
let mk_root = cardano_transaction_signable_builder
221-
.compute_merkle_root(&[transaction_2.clone(), transaction_1.clone()])
220+
.compute_merkle_root(vec![transaction_2.clone(), transaction_1.clone()])
222221
.unwrap();
223222

224223
assert_eq!(merkle_root_reference, mk_root);
@@ -254,7 +253,7 @@ mod tests {
254253

255254
// Assert
256255
let mk_root = cardano_transactions_signable_builder
257-
.compute_merkle_root(&transactions)
256+
.compute_merkle_root(transactions)
258257
.unwrap();
259258
let mut signable_expected = ProtocolMessage::new();
260259
signable_expected.set_message_part(

0 commit comments

Comments
 (0)