Skip to content

Commit e298c39

Browse files
committed
feat: make Merkle map thread safe
1 parent 2e6b21f commit e298c39

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

mithril-common/src/crypto_helper/merkle_map.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
55
use std::{
66
collections::{BTreeMap, HashMap},
77
hash::Hash,
8-
rc::Rc,
8+
sync::Arc,
99
};
1010

1111
use crate::{StdError, StdResult};
@@ -266,10 +266,10 @@ impl<K: MKMapKey> From<MKProof> for MKMapProof<K> {
266266
#[derive(Clone)]
267267
pub enum MKMapNode<K: MKMapKey> {
268268
/// A Merkle map
269-
Map(Rc<MKMap<K, Self>>),
269+
Map(Arc<MKMap<K, Self>>),
270270

271271
/// A full Merkle tree
272-
Tree(Rc<MKTree>),
272+
Tree(Arc<MKTree>),
273273

274274
/// A Merkle tree node
275275
TreeNode(MKTreeNode),
@@ -327,13 +327,13 @@ impl<K: MKMapKey> MKMapValue<K> for MKMapNode<K> {
327327

328328
impl<K: MKMapKey> From<MKMap<K, MKMapNode<K>>> for MKMapNode<K> {
329329
fn from(other: MKMap<K, MKMapNode<K>>) -> Self {
330-
MKMapNode::Map(Rc::new(other))
330+
MKMapNode::Map(Arc::new(other))
331331
}
332332
}
333333

334334
impl<K: MKMapKey> From<MKTree> for MKMapNode<K> {
335335
fn from(other: MKTree) -> Self {
336-
MKMapNode::Tree(Rc::new(other))
336+
MKMapNode::Tree(Arc::new(other))
337337
}
338338
}
339339

@@ -658,7 +658,7 @@ mod tests {
658658
];
659659
let merkle_tree_node_entries = &entries
660660
.into_iter()
661-
.map(|(range, mktree)| (range.to_owned(), MKMapNode::Tree(Rc::new(mktree))))
661+
.map(|(range, mktree)| (range.to_owned(), MKMapNode::Tree(Arc::new(mktree))))
662662
.collect::<Vec<_>>()
663663
.chunks(10)
664664
.map(|entries| {
@@ -668,7 +668,7 @@ mod tests {
668668
.fold(BlockRange::new(0, 0), |acc, (range, _)| {
669669
acc.try_add(range).unwrap()
670670
}),
671-
MKMapNode::Map(Rc::new(MKMap::new(entries).unwrap())),
671+
MKMapNode::Map(Arc::new(MKMap::new(entries).unwrap())),
672672
)
673673
})
674674
.collect::<Vec<_>>();

mithril-common/src/crypto_helper/merkle_tree.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ use anyhow::anyhow;
33
use anyhow::Context;
44
use blake2::{Blake2s256, Digest};
55
use ckb_merkle_mountain_range::{
6-
util::MemStore, MMRStoreReadOps, MMRStoreWriteOps, Merge, MerkleProof, Result as MMRResult, MMR,
6+
MMRStoreReadOps, MMRStoreWriteOps, Merge, MerkleProof, Result as MMRResult, MMR,
77
};
88
use serde::{Deserialize, Serialize};
99
use std::{
1010
collections::{BTreeMap, HashMap},
1111
fmt::Display,
1212
ops::{Add, Deref},
13-
sync::Arc,
13+
sync::{Arc, RwLock},
1414
};
1515

1616
use crate::{StdError, StdResult};
@@ -194,28 +194,33 @@ impl From<MKProof> for MKTreeNode {
194194

195195
/// A Merkle tree store
196196
pub struct MKTreeStore<T> {
197-
inner_store: MemStore<T>,
197+
inner_store: RwLock<HashMap<u64, T>>,
198198
}
199199

200200
impl<T> MKTreeStore<T> {
201201
fn new() -> Self {
202202
Self {
203-
inner_store: MemStore::<T>::default(),
203+
inner_store: RwLock::new(HashMap::new()),
204204
}
205205
}
206206
}
207207

208208
impl<T: Clone> MMRStoreReadOps<T> for MKTreeStore<T> {
209209
fn get_elem(&self, pos: u64) -> MMRResult<Option<T>> {
210-
let inner_store = &self.inner_store;
211-
inner_store.get_elem(pos)
210+
let inner_store = self.inner_store.read().unwrap();
211+
212+
Ok((*inner_store).get(&pos).cloned())
212213
}
213214
}
214215

215216
impl<T> MMRStoreWriteOps<T> for MKTreeStore<T> {
216217
fn append(&mut self, pos: u64, elems: Vec<T>) -> MMRResult<()> {
217-
let mut inner_store = &self.inner_store;
218-
inner_store.append(pos, elems)
218+
let mut inner_store = self.inner_store.write().unwrap();
219+
for (i, elem) in elems.into_iter().enumerate() {
220+
(*inner_store).insert(pos + i as u64, elem);
221+
}
222+
223+
Ok(())
219224
}
220225
}
221226

0 commit comments

Comments
 (0)