Skip to content

Commit 0e3c840

Browse files
Seulgi Kimsgkim126
authored andcommitted
Remove Trie::get_with
We prefer using an interface instead of a concrete object to make code open and generic. But the current code reveals TrieDB that is an implementation of Trie because the Trait which has a method having generic parameters cannot be an object. This commit removes the get_with method and replaces TrieDB with Trie.
1 parent 2b3d56a commit 0e3c840

File tree

7 files changed

+49
-55
lines changed

7 files changed

+49
-55
lines changed

state/src/cache/shard_cache.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
use std::cell::RefMut;
1818

19-
use cmerkle::{Result as TrieResult, TrieDB, TrieMut};
19+
use cmerkle::{Result as TrieResult, Trie, TrieMut};
2020

2121
use super::WriteBack;
2222
use crate::{AssetScheme, AssetSchemeAddress, OwnedAsset, OwnedAssetAddress};
@@ -58,11 +58,11 @@ impl ShardCache {
5858
Ok(())
5959
}
6060

61-
pub fn asset_scheme(&self, a: &AssetSchemeAddress, db: &TrieDB) -> TrieResult<Option<AssetScheme>> {
61+
pub fn asset_scheme(&self, a: &AssetSchemeAddress, db: &dyn Trie) -> TrieResult<Option<AssetScheme>> {
6262
self.asset_scheme.get(a, db)
6363
}
6464

65-
pub fn asset_scheme_mut(&self, a: &AssetSchemeAddress, db: &TrieDB) -> TrieResult<RefMut<AssetScheme>> {
65+
pub fn asset_scheme_mut(&self, a: &AssetSchemeAddress, db: &dyn Trie) -> TrieResult<RefMut<AssetScheme>> {
6666
self.asset_scheme.get_mut(a, db)
6767
}
6868

@@ -72,7 +72,7 @@ impl ShardCache {
7272
self.asset_scheme.create(a, f)
7373
}
7474

75-
pub fn asset(&self, a: &OwnedAssetAddress, db: &TrieDB) -> TrieResult<Option<OwnedAsset>> {
75+
pub fn asset(&self, a: &OwnedAssetAddress, db: &dyn Trie) -> TrieResult<Option<OwnedAsset>> {
7676
self.asset.get(a, db)
7777
}
7878

state/src/cache/top_cache.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use std::cell::RefMut;
1818

1919
use ckey::Address;
20-
use cmerkle::{Result as TrieResult, TrieDB, TrieMut};
20+
use cmerkle::{Result as TrieResult, Trie, TrieMut};
2121
use primitives::H256;
2222

2323
use super::WriteBack;
@@ -90,43 +90,43 @@ impl TopCache {
9090
Ok(())
9191
}
9292

93-
pub fn account(&self, a: &Address, db: &TrieDB) -> TrieResult<Option<Account>> {
93+
pub fn account(&self, a: &Address, db: &dyn Trie) -> TrieResult<Option<Account>> {
9494
self.account.get(a, db)
9595
}
9696

97-
pub fn account_mut(&self, a: &Address, db: &TrieDB) -> TrieResult<RefMut<Account>> {
97+
pub fn account_mut(&self, a: &Address, db: &dyn Trie) -> TrieResult<RefMut<Account>> {
9898
self.account.get_mut(a, db)
9999
}
100100

101101
pub fn remove_account(&self, address: &Address) {
102102
self.account.remove(address)
103103
}
104104

105-
pub fn regular_account(&self, a: &RegularAccountAddress, db: &TrieDB) -> TrieResult<Option<RegularAccount>> {
105+
pub fn regular_account(&self, a: &RegularAccountAddress, db: &dyn Trie) -> TrieResult<Option<RegularAccount>> {
106106
self.regular_account.get(a, db)
107107
}
108108

109-
pub fn regular_account_mut(&self, a: &RegularAccountAddress, db: &TrieDB) -> TrieResult<RefMut<RegularAccount>> {
109+
pub fn regular_account_mut(&self, a: &RegularAccountAddress, db: &dyn Trie) -> TrieResult<RefMut<RegularAccount>> {
110110
self.regular_account.get_mut(a, db)
111111
}
112112

113113
pub fn remove_regular_account(&self, address: &RegularAccountAddress) {
114114
self.regular_account.remove(address)
115115
}
116116

117-
pub fn metadata(&self, a: &MetadataAddress, db: &TrieDB) -> TrieResult<Option<Metadata>> {
117+
pub fn metadata(&self, a: &MetadataAddress, db: &dyn Trie) -> TrieResult<Option<Metadata>> {
118118
self.metadata.get(a, db)
119119
}
120120

121-
pub fn metadata_mut(&self, a: &MetadataAddress, db: &TrieDB) -> TrieResult<RefMut<Metadata>> {
121+
pub fn metadata_mut(&self, a: &MetadataAddress, db: &dyn Trie) -> TrieResult<RefMut<Metadata>> {
122122
self.metadata.get_mut(a, db)
123123
}
124124

125-
pub fn shard(&self, a: &ShardAddress, db: &TrieDB) -> TrieResult<Option<Shard>> {
125+
pub fn shard(&self, a: &ShardAddress, db: &dyn Trie) -> TrieResult<Option<Shard>> {
126126
self.shard.get(a, db)
127127
}
128128

129-
pub fn shard_mut(&self, a: &ShardAddress, db: &TrieDB) -> TrieResult<RefMut<Shard>> {
129+
pub fn shard_mut(&self, a: &ShardAddress, db: &dyn Trie) -> TrieResult<RefMut<Shard>> {
130130
self.shard.get_mut(a, db)
131131
}
132132

@@ -135,23 +135,23 @@ impl TopCache {
135135
self.shard.remove(address)
136136
}
137137

138-
pub fn text(&self, a: &H256, db: &TrieDB) -> TrieResult<Option<Text>> {
138+
pub fn text(&self, a: &H256, db: &dyn Trie) -> TrieResult<Option<Text>> {
139139
self.text.get(a, db)
140140
}
141141

142-
pub fn text_mut(&self, a: &H256, db: &TrieDB) -> TrieResult<RefMut<Text>> {
142+
pub fn text_mut(&self, a: &H256, db: &dyn Trie) -> TrieResult<RefMut<Text>> {
143143
self.text.get_mut(a, db)
144144
}
145145

146146
pub fn remove_text(&self, address: &H256) {
147147
self.text.remove(address);
148148
}
149149

150-
pub fn action_data(&self, a: &H256, db: &TrieDB) -> TrieResult<Option<ActionData>> {
150+
pub fn action_data(&self, a: &H256, db: &dyn Trie) -> TrieResult<Option<ActionData>> {
151151
self.action_data.get(a, db)
152152
}
153153

154-
pub fn action_data_mut(&self, a: &H256, db: &TrieDB) -> TrieResult<RefMut<ActionData>> {
154+
pub fn action_data_mut(&self, a: &H256, db: &dyn Trie) -> TrieResult<RefMut<ActionData>> {
155155
self.action_data.get_mut(a, db)
156156
}
157157

state/src/cache/write_back.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use std::fmt;
2222
use std::sync::atomic::{AtomicUsize, Ordering};
2323
use std::vec::Vec;
2424

25-
use cmerkle::{self, Result as TrieResult, Trie, TrieDB, TrieMut};
25+
use cmerkle::{self, Result as TrieResult, Trie, TrieMut};
2626

2727
use super::CacheableItem;
2828

@@ -195,25 +195,25 @@ where
195195
/// Check caches for required data
196196
/// First searches for account in the local, then the shared cache.
197197
/// Populates local cache if nothing found.
198-
pub fn get(&self, a: &Item::Address, db: &TrieDB) -> cmerkle::Result<Option<Item>> {
198+
pub fn get(&self, a: &Item::Address, db: &dyn Trie) -> cmerkle::Result<Option<Item>> {
199199
// check local cache first
200200
if let Some(cached_item) = self.cache.borrow_mut().get_mut(a) {
201201
cached_item.touched = touched_count();
202202
return Ok(cached_item.item.clone())
203203
}
204204

205205
// not found in the cache, get from the DB and insert into cache
206-
let maybe_item = db.get_with(a.as_ref(), &|bytes| ::rlp::decode::<Item>(bytes).unwrap())?;
206+
let maybe_item = db.get(a.as_ref())?.map(|bytes| ::rlp::decode::<Item>(&bytes).unwrap());
207207
self.insert(a, Entry::<Item>::new_clean(maybe_item.clone()));
208208
Ok(maybe_item)
209209
}
210210

211211
/// Pull item `a` in our cache from the trie DB.
212212
/// If it doesn't exist, make item equal the evaluation of `default`.
213-
pub fn get_mut(&self, a: &Item::Address, db: &TrieDB) -> cmerkle::Result<RefMut<Item>> {
213+
pub fn get_mut(&self, a: &Item::Address, db: &dyn Trie) -> cmerkle::Result<RefMut<Item>> {
214214
let contains_key = self.cache.borrow().contains_key(a);
215215
if !contains_key {
216-
let maybe_item = db.get_with(a.as_ref(), &|bytes| ::rlp::decode::<Item>(bytes).unwrap())?;
216+
let maybe_item = db.get(a.as_ref())?.map(|bytes| ::rlp::decode::<Item>(&bytes).unwrap());
217217
self.insert(a, Entry::<Item>::new_clean(maybe_item));
218218
}
219219
self.note(a);

state/src/impls/shard_level.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ impl<'db> ShardLevelState<'db> {
670670
fn get_asset_scheme_mut(&self, shard_id: ShardId, asset_type: H160) -> cmerkle::Result<RefMut<AssetScheme>> {
671671
let db = self.db.borrow();
672672
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
673-
self.cache.asset_scheme_mut(&AssetSchemeAddress::new(asset_type, shard_id), &trie)
673+
self.cache.asset_scheme_mut(&AssetSchemeAddress::new(asset_type, shard_id), &*trie)
674674
}
675675

676676
pub fn create_asset(
@@ -697,13 +697,13 @@ impl<'db> ShardStateView for ShardLevelState<'db> {
697697
fn asset_scheme(&self, asset_type: H160) -> cmerkle::Result<Option<AssetScheme>> {
698698
let db = self.db.borrow();
699699
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
700-
self.cache.asset_scheme(&AssetSchemeAddress::new(asset_type, self.shard_id), &trie)
700+
self.cache.asset_scheme(&AssetSchemeAddress::new(asset_type, self.shard_id), &*trie)
701701
}
702702

703703
fn asset(&self, tracker: Tracker, index: usize) -> Result<Option<OwnedAsset>, TrieError> {
704704
let db = self.db.borrow();
705705
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
706-
self.cache.asset(&OwnedAssetAddress::new(tracker, index, self.shard_id), &trie)
706+
self.cache.asset(&OwnedAssetAddress::new(tracker, index, self.shard_id), &*trie)
707707
}
708708
}
709709

@@ -780,13 +780,13 @@ impl<'db> ShardStateView for ReadOnlyShardLevelState<'db> {
780780
fn asset_scheme(&self, asset_type: H160) -> cmerkle::Result<Option<AssetScheme>> {
781781
let db = self.db.borrow();
782782
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
783-
self.cache.asset_scheme(&AssetSchemeAddress::new(asset_type, self.shard_id), &trie)
783+
self.cache.asset_scheme(&AssetSchemeAddress::new(asset_type, self.shard_id), &*trie)
784784
}
785785

786786
fn asset(&self, tracker: Tracker, index: usize) -> Result<Option<OwnedAsset>, TrieError> {
787787
let db = self.db.borrow();
788788
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
789-
self.cache.asset(&OwnedAssetAddress::new(tracker, index, self.shard_id), &trie)
789+
self.cache.asset(&OwnedAssetAddress::new(tracker, index, self.shard_id), &*trie)
790790
}
791791
}
792792

state/src/impls/top_level.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,28 +105,28 @@ impl TopStateView for TopLevelState {
105105
fn account(&self, a: &Address) -> TrieResult<Option<Account>> {
106106
let db = self.db.borrow();
107107
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
108-
self.top_cache.account(&a, &trie)
108+
self.top_cache.account(&a, &*trie)
109109
}
110110

111111
fn regular_account_by_address(&self, a: &Address) -> TrieResult<Option<RegularAccount>> {
112112
let a = RegularAccountAddress::from_address(a);
113113
let db = self.db.borrow();
114114
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
115-
Ok(self.top_cache.regular_account(&a, &trie)?)
115+
Ok(self.top_cache.regular_account(&a, &*trie)?)
116116
}
117117

118118
fn metadata(&self) -> TrieResult<Option<Metadata>> {
119119
let db = self.db.borrow();
120120
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
121121
let address = MetadataAddress::new();
122-
self.top_cache.metadata(&address, &trie)
122+
self.top_cache.metadata(&address, &*trie)
123123
}
124124

125125
fn shard(&self, shard_id: ShardId) -> TrieResult<Option<Shard>> {
126126
let db = self.db.borrow();
127127
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
128128
let shard_address = ShardAddress::new(shard_id);
129-
self.top_cache.shard(&shard_address, &trie)
129+
self.top_cache.shard(&shard_address, &*trie)
130130
}
131131

132132
fn shard_state<'db>(&'db self, shard_id: ShardId) -> TrieResult<Option<Box<dyn ShardStateView + 'db>>> {
@@ -143,13 +143,13 @@ impl TopStateView for TopLevelState {
143143
fn text(&self, key: &H256) -> TrieResult<Option<Text>> {
144144
let db = self.db.borrow();
145145
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
146-
Ok(self.top_cache.text(key, &trie)?.map(Into::into))
146+
Ok(self.top_cache.text(key, &*trie)?.map(Into::into))
147147
}
148148

149149
fn action_data(&self, key: &H256) -> TrieResult<Option<ActionData>> {
150150
let db = self.db.borrow();
151151
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
152-
Ok(self.top_cache.action_data(key, &trie)?.map(Into::into))
152+
Ok(self.top_cache.action_data(key, &*trie)?.map(Into::into))
153153
}
154154
}
155155

@@ -636,46 +636,46 @@ impl TopLevelState {
636636

637637
let db = self.db.borrow();
638638
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
639-
self.top_cache.account_mut(&a, &trie)
639+
self.top_cache.account_mut(&a, &*trie)
640640
}
641641

642642
fn get_regular_account_mut(&self, public: &Public) -> TrieResult<RefMut<RegularAccount>> {
643643
let regular_account_address = RegularAccountAddress::new(public);
644644
let db = self.db.borrow();
645645
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
646-
self.top_cache.regular_account_mut(&regular_account_address, &trie)
646+
self.top_cache.regular_account_mut(&regular_account_address, &*trie)
647647
}
648648

649649
fn get_metadata_mut(&self) -> TrieResult<RefMut<Metadata>> {
650650
let db = self.db.borrow();
651651
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
652652
let address = MetadataAddress::new();
653-
self.top_cache.metadata_mut(&address, &trie)
653+
self.top_cache.metadata_mut(&address, &*trie)
654654
}
655655

656656
fn get_shard_mut(&self, shard_id: ShardId) -> TrieResult<RefMut<Shard>> {
657657
let db = self.db.borrow();
658658
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
659659
let shard_address = ShardAddress::new(shard_id);
660-
self.top_cache.shard_mut(&shard_address, &trie)
660+
self.top_cache.shard_mut(&shard_address, &*trie)
661661
}
662662

663663
fn get_text(&self, key: &TxHash) -> TrieResult<Option<Text>> {
664664
let db = self.db.borrow();
665665
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
666-
self.top_cache.text(key, &trie)
666+
self.top_cache.text(key, &*trie)
667667
}
668668

669669
fn get_text_mut(&self, key: &TxHash) -> TrieResult<RefMut<Text>> {
670670
let db = self.db.borrow();
671671
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
672-
self.top_cache.text_mut(key, &trie)
672+
self.top_cache.text_mut(key, &*trie)
673673
}
674674

675675
fn get_action_data_mut(&self, key: &H256) -> TrieResult<RefMut<ActionData>> {
676676
let db = self.db.borrow();
677677
let trie = TrieFactory::readonly(db.as_hashdb(), &self.root)?;
678-
self.top_cache.action_data_mut(key, &trie)
678+
self.top_cache.action_data_mut(key, &*trie)
679679
}
680680

681681
pub fn journal_under(&self, batch: &mut DBTransaction, now: u64) -> Result<u32, UtilError> {

util/merkle/src/lib.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ impl fmt::Display for TrieError {
6565

6666
pub type Result<T> = ::std::result::Result<T, TrieError>;
6767

68-
/// Description of what kind of query will be made to the trie.
69-
pub type Query<T> = dyn Fn(&[u8]) -> T;
70-
7168
/// A key-value datastore implemented as a database-backed Merkle trie.
7269
pub trait Trie {
7370
/// Return the root of the trie.
@@ -84,13 +81,7 @@ pub trait Trie {
8481
}
8582

8683
/// What is the value of the given key in this trie?
87-
fn get(&self, key: &[u8]) -> Result<Option<DBValue>> {
88-
self.get_with(key, &|bytes| bytes.to_vec())
89-
}
90-
91-
/// Search for the key with the given query parameter. See the docs of the `Query`
92-
/// trait for more details.
93-
fn get_with<T>(&self, key: &[u8], query: &Query<T>) -> Result<Option<T>>;
84+
fn get(&self, key: &[u8]) -> Result<Option<DBValue>>;
9485
}
9586

9687
/// A key-value datastore implemented as a database-backed Merkle trie.
@@ -122,8 +113,8 @@ pub enum TrieFactory {}
122113

123114
impl TrieFactory {
124115
/// Create new immutable instance of Trie.
125-
pub fn readonly<'db>(db: &'db dyn HashDB, root: &'db H256) -> Result<TrieDB<'db>> {
126-
Ok(TrieDB::try_new(db, root)?)
116+
pub fn readonly<'db>(db: &'db dyn HashDB, root: &'db H256) -> Result<Box<dyn Trie + 'db>> {
117+
Ok(Box::new(TrieDB::try_new(db, root)?))
127118
}
128119

129120
/// Create new mutable instance of Trie.

util/merkle/src/triedb.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use primitives::H256;
2020

2121
use crate::nibbleslice::NibbleSlice;
2222
use crate::node::Node as RlpNode;
23-
use crate::{Query, Trie, TrieError};
23+
use crate::{Trie, TrieError};
2424
/// A `Trie` implementation using a generic `HashDB` backing database.
2525
///
2626
/// Use it as a `Trie` trait object. You can use `db()` to get the backing database object.
@@ -50,6 +50,9 @@ pub struct TrieDB<'db> {
5050
root: &'db H256,
5151
}
5252

53+
/// Description of what kind of query will be made to the trie.
54+
type Query<T> = dyn Fn(&[u8]) -> T;
55+
5356
impl<'db> TrieDB<'db> {
5457
/// Create a new trie with the backing database `db` and `root`
5558
/// Returns an error if `root` does not exist
@@ -112,11 +115,11 @@ impl<'db> Trie for TrieDB<'db> {
112115
self.root
113116
}
114117

115-
fn get_with<T>(&self, key: &[u8], query: &Query<T>) -> crate::Result<Option<T>> {
118+
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>, TrieError> {
116119
let path = blake256(key);
117120
let root = *self.root;
118121

119-
self.get_aux(&NibbleSlice::new(&path), Some(root), query)
122+
self.get_aux(&NibbleSlice::new(&path), Some(root), &|bytes| bytes.to_vec())
120123
}
121124
}
122125

0 commit comments

Comments
 (0)