Skip to content

Commit 049da17

Browse files
0xForerunnerrakita
andauthored
feat: DatabaseCommit::commit_iter (#3197)
* feat: DatabaseCommit::commit_iter * feat: DatabaseCommit::commit_iter for State * revert: return Iterator for apply_evm_state * Apply suggestion from @rakita --------- Co-authored-by: rakita <rakita@users.noreply.github.com>
1 parent d013bc2 commit 049da17

4 files changed

Lines changed: 43 additions & 15 deletions

File tree

crates/database/interface/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ pub trait Database {
7171
pub trait DatabaseCommit {
7272
/// Commit changes to the database.
7373
fn commit(&mut self, changes: HashMap<Address, Account>);
74+
75+
/// Commit changes to the database with an iterator.
76+
///
77+
/// Implementors of [`DatabaseCommit`] should override this method when possible for efficiency.
78+
///
79+
/// Callers should prefer using [`DatabaseCommit::commit`] when they already have a [`HashMap`].
80+
fn commit_iter(&mut self, changes: impl IntoIterator<Item = (Address, Account)>) {
81+
let changes: HashMap<Address, Account> = changes.into_iter().collect();
82+
self.commit(changes);
83+
}
7484
}
7585

7686
/// EVM database interface.

crates/database/src/states/cache.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
};
44
use bytecode::Bytecode;
55
use primitives::{Address, HashMap, B256};
6-
use state::{Account, AccountInfo, EvmState};
6+
use state::{Account, AccountInfo};
77
use std::vec::Vec;
88

99
/// Cache state contains both modified and original values
@@ -89,14 +89,18 @@ impl CacheState {
8989
}
9090

9191
/// Applies output of revm execution and create account transitions that are used to build BundleState.
92-
pub fn apply_evm_state(&mut self, evm_state: EvmState) -> Vec<(Address, TransitionAccount)> {
93-
let mut transitions = Vec::with_capacity(evm_state.len());
94-
for (address, account) in evm_state {
95-
if let Some(transition) = self.apply_account_state(address, account) {
96-
transitions.push((address, transition));
97-
}
98-
}
99-
transitions
92+
#[inline]
93+
pub fn apply_evm_state(
94+
&mut self,
95+
evm_state: impl IntoIterator<Item = (Address, Account)>,
96+
) -> Vec<(Address, TransitionAccount)> {
97+
evm_state
98+
.into_iter()
99+
.filter_map(|(address, account)| {
100+
self.apply_account_state(address, account)
101+
.map(|transition| (address, transition))
102+
})
103+
.collect()
100104
}
101105

102106
/// Pretty print the cache state for debugging purposes.

crates/database/src/states/state.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,10 @@ impl<DB: Database> State<DB> {
166166
}
167167

168168
/// Applies evm transitions to transition state.
169-
pub fn apply_transition(&mut self, transitions: Vec<(Address, TransitionAccount)>) {
169+
pub fn apply_transition(
170+
&mut self,
171+
transitions: impl IntoIterator<Item = (Address, TransitionAccount)>,
172+
) {
170173
// Add transition to transition state.
171174
if let Some(s) = self.transition_state.as_mut() {
172175
s.add_transitions(transitions)
@@ -315,9 +318,18 @@ impl<DB: Database> Database for State<DB> {
315318
}
316319

317320
impl<DB: Database> DatabaseCommit for State<DB> {
318-
fn commit(&mut self, evm_state: HashMap<Address, Account>) {
319-
let transitions = self.cache.apply_evm_state(evm_state);
320-
self.apply_transition(transitions);
321+
fn commit(&mut self, changes: HashMap<Address, Account>) {
322+
let transitions = self.cache.apply_evm_state(changes);
323+
if let Some(s) = self.transition_state.as_mut() {
324+
s.add_transitions(transitions)
325+
}
326+
}
327+
328+
fn commit_iter(&mut self, changes: impl IntoIterator<Item = (Address, Account)>) {
329+
let transitions = self.cache.apply_evm_state(changes);
330+
if let Some(s) = self.transition_state.as_mut() {
331+
s.add_transitions(transitions)
332+
}
321333
}
322334
}
323335

crates/database/src/states/transition_state.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::TransitionAccount;
22
use primitives::{hash_map::Entry, Address, HashMap};
3-
use std::vec::Vec;
43

54
/// State of accounts in transition between transaction executions.
65
#[derive(Clone, Default, Debug, PartialEq, Eq)]
@@ -29,7 +28,10 @@ impl TransitionState {
2928
///
3029
/// This will insert new [`TransitionAccount`]s, or update existing ones via
3130
/// [`update`][TransitionAccount::update].
32-
pub fn add_transitions(&mut self, transitions: Vec<(Address, TransitionAccount)>) {
31+
pub fn add_transitions(
32+
&mut self,
33+
transitions: impl IntoIterator<Item = (Address, TransitionAccount)>,
34+
) {
3335
for (address, account) in transitions {
3436
match self.transitions.entry(address) {
3537
Entry::Occupied(entry) => {

0 commit comments

Comments
 (0)