fn commit(&mut self, changes: HashMap<Address, Account>)
is overly restrictive and forces additional computation by constructing a HashMap. I suggest adding an additional overridable trait method for use cases that don't require a HashMap.
/// EVM database commit interface.
#[auto_impl(&mut, Box)]
pub trait DatabaseCommit {
/// Commit changes to the database.
fn commit(&mut self, changes: HashMap<Address, Account>);
/// Commit changes to the database with an iterator.
///
/// Implementors of [`DatabaseCommit`] should override this method when possible for efficiency.
fn commit_iter(&mut self, changes: impl IntoIterator<Item = (Address, Account)>) {
let changes: HashMap<Address, Account> = changes.into_iter().collect();
self.commit(changes);
}
}