Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
New crate: state-db
Browse files Browse the repository at this point in the history
  • Loading branch information
dvdplm committed Jul 8, 2019
1 parent 5a28340 commit 40aef44
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 26 deletions.
24 changes: 24 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ethcore/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ serde = "1.0"
serde_derive = "1.0"
account-state = { path = "account-state" }
stats = { path = "../util/stats" }
state-db = { path = "state-db" }
tempdir = { version = "0.3", optional = true }
time-utils = { path = "../util/time-utils" }
trace = { path = "trace" }
Expand Down
3 changes: 2 additions & 1 deletion ethcore/private-tx/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ license = "GPL-3.0"
authors = ["Parity Technologies <admin@parity.io>"]

[dependencies]
account-state = { path = "../account-state" }
common-types = { path = "../types" }
derive_more = "0.14.0"
ethabi = "8.0"
Expand Down Expand Up @@ -35,7 +36,7 @@ rustc-hex = "1.0"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
account-state = { path = "../account-state" }
state-db = { path = "../state-db" }
time-utils = { path = "../../util/time-utils" }
tiny-keccak = "1.4"
trace = { path = "../trace" }
Expand Down
2 changes: 1 addition & 1 deletion ethcore/private-tx/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ use ethcore::client::{
Call, BlockInfo
};
use ethcore::miner::{self, Miner, MinerService, pool_client::NonceCache};
use ethcore::StateDB;
use state_db::StateDB;
use account_state::State;
use trace::{Tracer, VMTracer};
use call_contract::CallContract;
Expand Down
5 changes: 2 additions & 3 deletions ethcore/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
//! ```

extern crate account_db;
extern crate account_state;
extern crate ansi_term;
extern crate common_types as types;
extern crate crossbeam_utils;
Expand Down Expand Up @@ -97,8 +98,8 @@ extern crate parity_util_mem;
extern crate parity_util_mem as malloc_size_of;
extern crate rustc_hex;
extern crate serde;
extern crate state_db;
extern crate stats;
extern crate account_state;
extern crate time_utils;
extern crate trace;
extern crate triehash_ethereum as triehash;
Expand Down Expand Up @@ -163,7 +164,6 @@ pub mod spec;
pub mod verification;

mod externalities;
mod state_db;
mod transaction_ext;
mod tx_filter;

Expand All @@ -177,4 +177,3 @@ pub mod test_helpers;
pub use executive::contract_address;
pub use evm::CreateContractAddress;
pub use trie::TrieSpec;
pub use state_db::StateDB;
27 changes: 27 additions & 0 deletions ethcore/state-db/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[package]
description = "State database"
name = "state-db"
version = "0.1.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018"

[dependencies]
account-state = { path = "../account-state" }
bloom_journal = { package = "ethcore-bloom-journal", path = "../../util/bloom" }
common-types = { path = "../types"}
ethcore-db = { path = "../db" }
ethereum-types = "0.6.0"
hash-db = "0.12.4"
keccak-hash = "0.2.0"
keccak-hasher = { path = "../../util/keccak-hasher" }
journaldb = { path = "../../util/journaldb" }
kvdb = "0.1.0"
log = "0.4.6"
lru-cache = "0.1.2"
memory-cache = { path = "../../util/memory-cache" }
parking_lot = "0.8.0"

[dev-dependencies]
env_logger = "0.5"
# Used for test helpers
ethcore = { path = "..", features = ["test-helpers"] }
44 changes: 23 additions & 21 deletions ethcore/src/state_db.rs → ethcore/state-db/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,25 @@

//! State database abstraction. For more info, see the doc for `StateDB`

use std::collections::{VecDeque, HashSet};
use std::collections::{HashSet, VecDeque};
use std::io;
use std::sync::Arc;

use bloom_journal::{Bloom, BloomJournal};
use db::COL_ACCOUNT_BLOOM;
use ethereum_types::{H256, Address};
use hash::keccak;
use ethereum_types::{Address, H256};
use hash_db::HashDB;
use journaldb::JournalDB;
use keccak_hasher::KeccakHasher;
use kvdb::{KeyValueDB, DBTransaction, DBValue};
use keccak_hash::keccak;
use kvdb::{DBTransaction, DBValue, KeyValueDB};
use log::trace;
use lru_cache::LruCache;
use memory_cache::MemoryLruCache;
use parking_lot::Mutex;
use types::BlockNumber;

use account_state::{self, Account};
use bloom_journal::{Bloom, BloomJournal};
use common_types::BlockNumber;
use ethcore_db::COL_ACCOUNT_BLOOM;
use journaldb::JournalDB;
use keccak_hasher::KeccakHasher;
use memory_cache::MemoryLruCache;

/// Value used to initialize bloom bitmap size.
///
Expand Down Expand Up @@ -68,7 +69,7 @@ struct AccountCache {
struct CacheQueueItem {
/// Account address.
address: Address,
/// Acccount data or `None` if account does not exist.
/// Account data or `None` if account does not exist.
account: SyncAccount,
/// Indicates that the account was modified before being
/// added to the cache.
Expand Down Expand Up @@ -143,23 +144,23 @@ impl StateDB {
let cache_items = acc_cache_size / ::std::mem::size_of::<Option<Account>>();

StateDB {
db: db,
db,
account_cache: Arc::new(Mutex::new(AccountCache {
accounts: LruCache::new(cache_items),
modifications: VecDeque::new(),
})),
code_cache: Arc::new(Mutex::new(MemoryLruCache::new(code_cache_size))),
local_cache: Vec::new(),
account_bloom: Arc::new(Mutex::new(bloom)),
cache_size: cache_size,
cache_size,
parent_hash: None,
commit_hash: None,
commit_number: None,
}
}

/// Loads accounts bloom from the database
/// This bloom is used to handle request for the non-existant account fast
/// This bloom is used to handle request for the non-existent account fast
pub fn load_bloom(db: &dyn KeyValueDB) -> Bloom {
let hash_count_entry = db.get(COL_ACCOUNT_BLOOM, ACCOUNT_BLOOM_HASHCOUNT_KEY)
.expect("Low-level database error");
Expand All @@ -177,7 +178,7 @@ impl StateDB {
let key: [u8; 8] = (i as u64).to_le_bytes();
bloom_parts[i] = db.get(COL_ACCOUNT_BLOOM, &key).expect("low-level database error")
.map(|val| {
assert!(val.len() == 8, "low-level database error");
assert_eq!(val.len(), 8, "low-level database error");
let mut buff = [0u8; 8];
buff.copy_from_slice(&*val);
u64::from_le_bytes(buff)
Expand Down Expand Up @@ -233,7 +234,7 @@ impl StateDB {
let cache = &mut *cache;

// Purge changes from re-enacted and retracted blocks.
// Filter out commiting block if any.
// Filter out committing block if any.
let mut clear = false;
for block in enacted.iter().filter(|h| self.commit_hash.as_ref().map_or(true, |p| *h != p)) {
clear = clear || {
Expand Down Expand Up @@ -419,11 +420,11 @@ impl account_state::Backend for StateDB {
self.db.as_hash_db_mut()
}

fn add_to_account_cache(&mut self, addr: Address, data: Option<Account>, modified: bool) {
fn add_to_account_cache(&mut self, address: Address, data: Option<Account>, modified: bool) {
self.local_cache.push(CacheQueueItem {
address: addr,
address,
account: SyncAccount(data),
modified: modified,
modified,
})
}

Expand Down Expand Up @@ -484,10 +485,11 @@ unsafe impl Sync for SyncAccount {}

#[cfg(test)]
mod tests {
use ethereum_types::{H256, U256, Address};
use ethereum_types::{Address, H256, U256};
use kvdb::DBTransaction;
use test_helpers::get_temp_state_db;

use account_state::{Account, Backend};
use ethcore::test_helpers::get_temp_state_db;

#[test]
fn state_db_smoke() {
Expand Down

0 comments on commit 40aef44

Please sign in to comment.