diff --git a/bins/revme/src/cmd/blockchaintest.rs b/bins/revme/src/cmd/blockchaintest.rs
index 44503babb6..c701e95d2e 100644
--- a/bins/revme/src/cmd/blockchaintest.rs
+++ b/bins/revme/src/cmd/blockchaintest.rs
@@ -14,7 +14,7 @@ use revm::{
database::{states::bundle_state::BundleRetention, EmptyDB, State},
handler::EvmTr,
inspector::inspectors::TracerEip3155,
- primitives::{hardfork::SpecId, hex, Address, HashMap, U256},
+ primitives::{hardfork::SpecId, hex, Address, AddressMap, U256Map, U256},
state::{bal::Bal, AccountInfo},
Context, Database, ExecuteCommitEvm, ExecuteEvm, InspectEvm, MainBuilder, MainContext,
};
@@ -272,7 +272,7 @@ fn run_test_file(
#[derive(Debug, Clone)]
struct DebugInfo {
/// Initial pre-state before any execution
- pre_state: HashMap
)>,
+ pre_state: AddressMap<(AccountInfo, U256Map)>,
/// Transaction environment
tx_env: Option,
/// Block environment
@@ -289,15 +289,13 @@ struct DebugInfo {
impl DebugInfo {
/// Capture current state from the State database
- fn capture_committed_state(
- state: &State,
- ) -> HashMap)> {
- let mut committed_state = HashMap::default();
+ fn capture_committed_state(state: &State) -> AddressMap<(AccountInfo, U256Map)> {
+ let mut committed_state = AddressMap::default();
// Access the cache state to get all accounts
for (address, cache_account) in &state.cache.accounts {
if let Some(plain_account) = &cache_account.account {
- let mut storage = HashMap::default();
+ let mut storage = U256Map::default();
for (key, value) in &plain_account.storage {
storage.insert(*key, *value);
}
@@ -668,7 +666,7 @@ fn execute_blockchain_test(
let mut state = State::builder().with_bal_builder().build();
// Capture pre-state for debug info
- let mut pre_state_debug = HashMap::default();
+ let mut pre_state_debug = AddressMap::default();
// Insert genesis state into database
let genesis_state = test_case.pre.clone().into_genesis_state();
diff --git a/crates/context/interface/src/journaled_state.rs b/crates/context/interface/src/journaled_state.rs
index 33c085a705..0901d54f88 100644
--- a/crates/context/interface/src/journaled_state.rs
+++ b/crates/context/interface/src/journaled_state.rs
@@ -12,7 +12,8 @@ use crate::{
use core::ops::{Deref, DerefMut};
use database_interface::Database;
use primitives::{
- hardfork::SpecId, Address, Bytes, HashMap, HashSet, Log, StorageKey, StorageValue, B256, U256,
+ hardfork::SpecId, Address, AddressMap, AddressSet, Bytes, HashSet, Log, StorageKey,
+ StorageValue, B256, U256,
};
use state::{Account, AccountInfo, Bytecode};
use std::{borrow::Cow, vec::Vec};
@@ -104,16 +105,16 @@ pub trait JournalTr {
) -> Result, JournalLoadError<::Error>>;
/// Sets access list inside journal.
- fn warm_access_list(&mut self, access_list: HashMap>);
+ fn warm_access_list(&mut self, access_list: AddressMap>);
/// Warms the coinbase account.
fn warm_coinbase_account(&mut self, address: Address);
/// Warms the precompiles.
- fn warm_precompiles(&mut self, addresses: HashSet);
+ fn warm_precompiles(&mut self, addresses: AddressSet);
/// Returns the addresses of the precompiles.
- fn precompile_addresses(&self) -> &HashSet;
+ fn precompile_addresses(&self) -> &AddressSet;
/// Sets the spec id.
fn set_spec_id(&mut self, spec_id: SpecId);
diff --git a/crates/context/interface/src/journaled_state/account.rs b/crates/context/interface/src/journaled_state/account.rs
index 13c185502b..bdccf0aeb4 100644
--- a/crates/context/interface/src/journaled_state/account.rs
+++ b/crates/context/interface/src/journaled_state/account.rs
@@ -13,7 +13,8 @@ use super::entry::JournalEntryTr;
use auto_impl::auto_impl;
use database_interface::Database;
use primitives::{
- hash_map::Entry, Address, HashMap, HashSet, StorageKey, StorageValue, B256, KECCAK_EMPTY, U256,
+ hash_map::Entry, Address, AddressMap, HashSet, StorageKey, StorageValue, B256, KECCAK_EMPTY,
+ U256,
};
use state::{Account, Bytecode, EvmStorageSlot};
use std::vec::Vec;
@@ -129,7 +130,7 @@ pub struct JournaledAccount<'a, DB, ENTRY: JournalEntryTr = JournalEntry> {
/// Journal entries.
journal_entries: &'a mut Vec,
/// Access list.
- access_list: &'a HashMap>,
+ access_list: &'a AddressMap>,
/// Transaction ID.
transaction_id: usize,
/// Database used to load storage.
@@ -144,7 +145,7 @@ impl<'a, DB: Database, ENTRY: JournalEntryTr> JournaledAccount<'a, DB, ENTRY> {
account: &'a mut Account,
journal_entries: &'a mut Vec,
db: &'a mut DB,
- access_list: &'a HashMap>,
+ access_list: &'a AddressMap>,
transaction_id: usize,
) -> Self {
Self {
diff --git a/crates/context/src/journal.rs b/crates/context/src/journal.rs
index 6814627d10..ac9137a22f 100644
--- a/crates/context/src/journal.rs
+++ b/crates/context/src/journal.rs
@@ -19,7 +19,8 @@ use context_interface::{
use core::ops::{Deref, DerefMut};
use database_interface::Database;
use primitives::{
- hardfork::SpecId, Address, HashMap, HashSet, Log, StorageKey, StorageValue, B256, U256,
+ hardfork::SpecId, Address, AddressMap, AddressSet, HashSet, Log, StorageKey, StorageValue,
+ B256, U256,
};
use state::{Account, EvmState};
use std::vec::Vec;
@@ -168,7 +169,7 @@ impl JournalTr for Journal {
}
#[inline]
- fn warm_access_list(&mut self, access_list: HashMap>) {
+ fn warm_access_list(&mut self, access_list: AddressMap>) {
self.inner.warm_addresses.set_access_list(access_list);
}
@@ -176,14 +177,14 @@ impl JournalTr for Journal {
self.inner.warm_addresses.set_coinbase(address);
}
- fn warm_precompiles(&mut self, precompiles: HashSet) {
+ fn warm_precompiles(&mut self, precompiles: AddressSet) {
self.inner
.warm_addresses
.set_precompile_addresses(precompiles);
}
#[inline]
- fn precompile_addresses(&self) -> &HashSet {
+ fn precompile_addresses(&self) -> &AddressSet {
self.inner.warm_addresses.precompiles()
}
diff --git a/crates/context/src/journal/warm_addresses.rs b/crates/context/src/journal/warm_addresses.rs
index 27e5bce936..2c4e2dd5a9 100644
--- a/crates/context/src/journal/warm_addresses.rs
+++ b/crates/context/src/journal/warm_addresses.rs
@@ -4,7 +4,9 @@
use bitvec::{bitvec, vec::BitVec};
use context_interface::journaled_state::JournalLoadError;
-use primitives::{short_address, Address, HashMap, HashSet, StorageKey, SHORT_ADDRESS_CAP};
+use primitives::{
+ short_address, Address, AddressMap, AddressSet, HashSet, StorageKey, SHORT_ADDRESS_CAP,
+};
/// Stores addresses that are warm loaded. Contains precompiles and coinbase address.
///
@@ -19,7 +21,7 @@ use primitives::{short_address, Address, HashMap, HashSet, StorageKey, SHORT_ADD
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct WarmAddresses {
/// Set of warm loaded precompile addresses.
- precompile_set: HashSet,
+ precompile_set: AddressSet,
/// Bit vector of precompile short addresses. If address is shorter than [`SHORT_ADDRESS_CAP`] it
/// will be stored in this bit vector for faster access.
precompile_short_addresses: BitVec,
@@ -28,7 +30,7 @@ pub struct WarmAddresses {
/// Coinbase address.
coinbase: Option,
/// Access list
- access_list: HashMap>,
+ access_list: AddressMap>,
}
impl Default for WarmAddresses {
@@ -42,17 +44,17 @@ impl WarmAddresses {
#[inline]
pub fn new() -> Self {
Self {
- precompile_set: HashSet::default(),
+ precompile_set: AddressSet::default(),
precompile_short_addresses: bitvec![0; SHORT_ADDRESS_CAP],
precompile_all_short_addresses: true,
coinbase: None,
- access_list: HashMap::default(),
+ access_list: AddressMap::default(),
}
}
/// Returns the precompile addresses.
#[inline]
- pub fn precompiles(&self) -> &HashSet {
+ pub fn precompiles(&self) -> &AddressSet {
&self.precompile_set
}
@@ -64,7 +66,7 @@ impl WarmAddresses {
/// Set the precompile addresses and short addresses.
#[inline]
- pub fn set_precompile_addresses(&mut self, addresses: HashSet) {
+ pub fn set_precompile_addresses(&mut self, addresses: AddressSet) {
self.precompile_short_addresses.fill(false);
let mut all_short_addresses = true;
@@ -88,13 +90,13 @@ impl WarmAddresses {
/// Set the access list.
#[inline]
- pub fn set_access_list(&mut self, access_list: HashMap>) {
+ pub fn set_access_list(&mut self, access_list: AddressMap>) {
self.access_list = access_list;
}
/// Returns the access list.
#[inline]
- pub fn access_list(&self) -> &HashMap> {
+ pub fn access_list(&self) -> &AddressMap> {
&self.access_list
}
diff --git a/crates/database/interface/src/either.rs b/crates/database/interface/src/either.rs
index ce1e7d1336..aef10dab89 100644
--- a/crates/database/interface/src/either.rs
+++ b/crates/database/interface/src/either.rs
@@ -2,7 +2,7 @@
use crate::{Database, DatabaseCommit, DatabaseRef};
use either::Either;
-use primitives::{Address, HashMap, StorageKey, StorageValue, B256};
+use primitives::{Address, AddressMap, StorageKey, StorageValue, B256};
use state::{Account, AccountInfo, Bytecode};
impl Database for Either
@@ -62,7 +62,7 @@ where
L: DatabaseCommit,
R: DatabaseCommit,
{
- fn commit(&mut self, changes: HashMap) {
+ fn commit(&mut self, changes: AddressMap) {
match self {
Self::Left(db) => db.commit(changes),
Self::Right(db) => db.commit(changes),
diff --git a/crates/database/interface/src/lib.rs b/crates/database/interface/src/lib.rs
index 140d0298ef..c0e24fd920 100644
--- a/crates/database/interface/src/lib.rs
+++ b/crates/database/interface/src/lib.rs
@@ -8,7 +8,7 @@ extern crate alloc as std;
use core::convert::Infallible;
use auto_impl::auto_impl;
-use primitives::{address, Address, HashMap, StorageKey, StorageValue, B256, U256};
+use primitives::{address, Address, AddressMap, StorageKey, StorageValue, B256, U256};
use state::{Account, AccountInfo, Bytecode};
use std::vec::Vec;
@@ -92,13 +92,13 @@ pub trait Database {
#[auto_impl(&mut, Box)]
pub trait DatabaseCommit {
/// Commit changes to the database.
- fn commit(&mut self, changes: HashMap);
+ fn commit(&mut self, changes: AddressMap);
/// Commit changes to the database with an iterator.
///
/// Implementors of [`DatabaseCommit`] should override this method when possible for efficiency.
///
- /// Callers should prefer using [`DatabaseCommit::commit`] when they already have a [`HashMap`].
+ /// Callers should prefer using [`DatabaseCommit::commit`] when they already have a [`AddressMap`].
///
/// # Dyn Compatibility
///
@@ -106,7 +106,7 @@ pub trait DatabaseCommit {
/// For ergonomic usage with `impl IntoIterator`, use the inherent method
/// `commit_from_iter` on `dyn DatabaseCommit`.
fn commit_iter(&mut self, changes: &mut dyn Iterator- ) {
- let changes: HashMap = changes.collect();
+ let changes: AddressMap = changes.collect();
self.commit(changes);
}
}
@@ -206,7 +206,7 @@ impl Database for WrapDatabaseRef {
impl DatabaseCommit for WrapDatabaseRef {
#[inline]
- fn commit(&mut self, changes: HashMap) {
+ fn commit(&mut self, changes: AddressMap) {
self.0.commit(changes)
}
}
@@ -321,7 +321,7 @@ mod tests {
}
impl DatabaseCommit for MockDb {
- fn commit(&mut self, changes: HashMap) {
+ fn commit(&mut self, changes: AddressMap) {
let std_map: StdHashMap<_, _> = changes.into_iter().collect();
self.commits.push(std_map);
}
@@ -337,7 +337,7 @@ mod tests {
// Test commit() on trait objects
{
let db_dyn: &mut dyn DatabaseCommit = &mut db;
- db_dyn.commit(HashMap::default());
+ db_dyn.commit(AddressMap::default());
}
assert_eq!(db.commits.len(), 2);
diff --git a/crates/database/interface/src/try_commit.rs b/crates/database/interface/src/try_commit.rs
index 71595d186b..65fd487183 100644
--- a/crates/database/interface/src/try_commit.rs
+++ b/crates/database/interface/src/try_commit.rs
@@ -1,7 +1,7 @@
//! Try database commit interface.
use crate::DatabaseCommit;
use core::{convert::Infallible, error::Error, fmt};
-use primitives::{Address, HashMap};
+use primitives::AddressMap;
use state::Account;
use std::sync::Arc;
@@ -15,7 +15,7 @@ pub trait TryDatabaseCommit {
type Error: Error;
/// Attempt to commit changes to the database.
- fn try_commit(&mut self, changes: HashMap) -> Result<(), Self::Error>;
+ fn try_commit(&mut self, changes: AddressMap) -> Result<(), Self::Error>;
}
impl TryDatabaseCommit for Db
@@ -25,7 +25,7 @@ where
type Error = Infallible;
#[inline]
- fn try_commit(&mut self, changes: HashMap) -> Result<(), Self::Error> {
+ fn try_commit(&mut self, changes: AddressMap) -> Result<(), Self::Error> {
self.commit(changes);
Ok(())
}
@@ -51,7 +51,7 @@ where
type Error = ArcUpgradeError;
#[inline]
- fn try_commit(&mut self, changes: HashMap) -> Result<(), Self::Error> {
+ fn try_commit(&mut self, changes: AddressMap) -> Result<(), Self::Error> {
Arc::get_mut(self)
.map(|db| db.commit(changes))
.ok_or(ArcUpgradeError)
@@ -67,7 +67,7 @@ mod test {
struct MockDb;
impl DatabaseCommit for MockDb {
- fn commit(&mut self, _changes: HashMap) {}
+ fn commit(&mut self, _changes: AddressMap) {}
}
#[test]
diff --git a/crates/database/src/in_memory_db.rs b/crates/database/src/in_memory_db.rs
index 16166853fe..841ad46b34 100644
--- a/crates/database/src/in_memory_db.rs
+++ b/crates/database/src/in_memory_db.rs
@@ -4,8 +4,8 @@ use database_interface::{
BENCH_TARGET, BENCH_TARGET_BALANCE,
};
use primitives::{
- hash_map::Entry, Address, AddressMap, B256Map, HashMap, Log, StorageKey, StorageValue, B256,
- KECCAK_EMPTY, U256,
+ hash_map::Entry, Address, AddressMap, B256Map, HashMap, Log, StorageKey, StorageKeyMap,
+ StorageValue, U256Map, B256, KECCAK_EMPTY, U256,
};
use state::{Account, AccountInfo, Bytecode};
use std::vec::Vec;
@@ -29,7 +29,7 @@ pub struct Cache {
/// All logs that were committed via [DatabaseCommit::commit].
pub logs: Vec,
/// All cached block hashes from the [DatabaseRef].
- pub block_hashes: HashMap,
+ pub block_hashes: U256Map,
}
impl Default for Cache {
@@ -183,7 +183,7 @@ impl CacheDB {
pub fn replace_account_storage(
&mut self,
address: Address,
- storage: HashMap,
+ storage: StorageKeyMap,
) -> Result<(), ExtDB::Error> {
let account = self.load_account(address)?;
account.account_state = AccountState::StorageCleared;
@@ -280,7 +280,7 @@ impl CacheDB {
}
impl DatabaseCommit for CacheDB {
- fn commit(&mut self, changes: HashMap) {
+ fn commit(&mut self, changes: AddressMap) {
for (address, mut account) in changes {
if !account.is_touched() {
continue;
@@ -459,7 +459,7 @@ pub struct DbAccount {
/// If account is selfdestructed or newly created, storage will be cleared.
pub account_state: AccountState,
/// Storage slots
- pub storage: HashMap,
+ pub storage: StorageKeyMap,
}
impl DbAccount {
diff --git a/crates/database/src/states/bundle_account.rs b/crates/database/src/states/bundle_account.rs
index 54bd85ff10..2c1d8081ca 100644
--- a/crates/database/src/states/bundle_account.rs
+++ b/crates/database/src/states/bundle_account.rs
@@ -2,7 +2,7 @@ use super::{
reverts::AccountInfoRevert, AccountRevert, AccountStatus, RevertToSlot, StorageSlot,
StorageWithOriginalValues, TransitionAccount,
};
-use primitives::{HashMap, StorageKey, StorageValue};
+use primitives::{HashMap, StorageKey, StorageKeyMap, StorageValue};
use state::AccountInfo;
/// Account information focused on creating of database changesets
@@ -152,7 +152,7 @@ impl BundleAccount {
};
let previous_storage_from_update =
- |updated_storage: &StorageWithOriginalValues| -> HashMap {
+ |updated_storage: &StorageWithOriginalValues| -> StorageKeyMap {
updated_storage
.iter()
.filter(|s| s.1.is_changed())
@@ -288,7 +288,7 @@ impl BundleAccount {
let mut storage = core::mem::take(&mut self.storage)
.into_iter()
.map(|t| (t.0, RevertToSlot::Some(t.1.present_value)))
- .collect::>();
+ .collect::>();
for key in updated_storage.keys() {
// As it is not existing inside Destroyed storage this means
// that previous values must be zero
diff --git a/crates/database/src/states/bundle_state.rs b/crates/database/src/states/bundle_state.rs
index 6c3e4e8077..6bcbf7f726 100644
--- a/crates/database/src/states/bundle_state.rs
+++ b/crates/database/src/states/bundle_state.rs
@@ -7,7 +7,8 @@ use super::{
use bytecode::Bytecode;
use core::{mem, ops::RangeInclusive};
use primitives::{
- hash_map::Entry, Address, HashMap, HashSet, StorageKey, StorageValue, B256, KECCAK_EMPTY,
+ hash_map::Entry, Address, AddressMap, AddressSet, B256Map, HashMap, StorageKey, StorageKeyMap,
+ StorageValue, B256, KECCAK_EMPTY,
};
use state::AccountInfo;
use std::{
@@ -18,17 +19,17 @@ use std::{
/// This builder is used to help to facilitate the initialization of `BundleState` struct
#[derive(Debug)]
pub struct BundleBuilder {
- states: HashSet,
- state_original: HashMap,
- state_present: HashMap,
- state_storage: HashMap>,
+ states: AddressSet,
+ state_original: AddressMap,
+ state_present: AddressMap,
+ state_storage: AddressMap>,
reverts: BTreeSet<(u64, Address)>,
revert_range: RangeInclusive,
revert_account: HashMap<(u64, Address), Option