Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bins/revme/src/cmd/blockchaintest/post_block.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use revm::{
context::{Block, ContextTr},
database::State,
database::{DatabaseCommitExt as _, State},
handler::EvmTr,
primitives::{hardfork::SpecId, ONE_ETHER, ONE_GWEI},
Database, SystemCallCommitEvm,
Expand Down
34 changes: 34 additions & 0 deletions crates/database/interface/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,37 @@ impl<T: DatabaseRef> DatabaseRef for WrapDatabaseRef<T> {
self.0.block_hash_ref(number)
}
}

impl<T: Database + DatabaseCommit> DatabaseCommitExt for T {
// default implementation
}

/// EVM database commit interface.
pub trait DatabaseCommitExt: Database + DatabaseCommit {
/// Iterates over received balances and increment all account balances.
///
/// Update will create transitions for all accounts that are updated.
fn increment_balances(
&mut self,
balances: impl IntoIterator<Item = (Address, u128)>,
) -> Result<(), Self::Error> {
// Make transition and update cache state
let balances = balances.into_iter();
let mut transitions: HashMap<Address, Account> = HashMap::default();
transitions.reserve(balances.size_hint().0);
for (address, balance) in balances {
let mut original_account = match self.basic(address)? {
Some(acc_info) => Account::from(acc_info),
None => Account::new_not_existing(0),
};
original_account.info.balance = original_account
.info
.balance
.saturating_add(U256::from(balance));
original_account.mark_touch();
transitions.insert(address, original_account);
}
self.commit(transitions);
Ok(())
}
}
33 changes: 0 additions & 33 deletions crates/database/src/states/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,39 +81,6 @@ impl<DB: Database> State<DB> {
self.bundle_state.size_hint()
}

/// Iterates over received balances and increment all account balances.
///
/// **Note**: If account is not found inside cache state it will be loaded from database.
///
/// Update will create transitions for all accounts that are updated.
///
/// If using this to implement withdrawals, zero balances must be filtered out before calling this function.
pub fn increment_balances(
&mut self,
balances: impl IntoIterator<Item = (Address, u128)>,
) -> Result<(), DB::Error> {
// Make transition and update cache state
let balances = balances.into_iter();
let mut transitions = Vec::with_capacity(balances.size_hint().0);
for (address, balance) in balances {
if balance == 0 {
continue;
}
let original_account = self.load_cache_account(address)?;
transitions.push((
address,
original_account
.increment_balance(balance)
.expect("Balance is not zero"),
))
}
// Append transition
if let Some(s) = self.transition_state.as_mut() {
s.add_transitions(transitions)
}
Ok(())
}

/// Drains balances from given account and return those values.
///
/// It is used for DAO hardfork state change to move values from given accounts.
Expand Down
Loading