mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-01-09 07:17:56 -05:00
perf(engine): paralellize evm_state_to_hashed_post_state() (#20635)
This commit is contained in:
@@ -10,6 +10,7 @@ use crossbeam_channel::{unbounded, Receiver as CrossbeamReceiver, Sender as Cros
|
||||
use dashmap::DashMap;
|
||||
use derive_more::derive::Deref;
|
||||
use metrics::{Gauge, Histogram};
|
||||
use rayon::prelude::*;
|
||||
use reth_metrics::Metrics;
|
||||
use reth_provider::AccountReader;
|
||||
use reth_revm::state::EvmState;
|
||||
@@ -202,35 +203,38 @@ impl Drop for StateHookSender {
|
||||
}
|
||||
|
||||
pub(crate) fn evm_state_to_hashed_post_state(update: EvmState) -> HashedPostState {
|
||||
let mut hashed_state = HashedPostState::with_capacity(update.len());
|
||||
update.into_par_iter()
|
||||
.filter_map(|(address, account)| {
|
||||
if !account.is_touched() {
|
||||
return None;
|
||||
}
|
||||
|
||||
for (address, account) in update {
|
||||
if account.is_touched() {
|
||||
let hashed_address = keccak256(address);
|
||||
trace!(target: "engine::tree::payload_processor::multiproof", ?address, ?hashed_address, "Adding account to state update");
|
||||
|
||||
let destroyed = account.is_selfdestructed();
|
||||
let info = if destroyed { None } else { Some(account.info.into()) };
|
||||
hashed_state.accounts.insert(hashed_address, info);
|
||||
|
||||
let mut changed_storage_iter = account
|
||||
.storage
|
||||
.into_iter()
|
||||
.filter(|(_slot, value)| value.is_changed())
|
||||
.map(|(slot, value)| (keccak256(B256::from(slot)), value.present_value))
|
||||
.peekable();
|
||||
let hashed_storage = if destroyed {
|
||||
Some(HashedStorage::new(true))
|
||||
} else {
|
||||
let storage: Vec<_> = account
|
||||
.storage
|
||||
.into_iter()
|
||||
.filter(|(_slot, value)| value.is_changed())
|
||||
.map(|(slot, value)| (keccak256(B256::from(slot)), value.present_value))
|
||||
.collect();
|
||||
|
||||
if destroyed {
|
||||
hashed_state.storages.insert(hashed_address, HashedStorage::new(true));
|
||||
} else if changed_storage_iter.peek().is_some() {
|
||||
hashed_state
|
||||
.storages
|
||||
.insert(hashed_address, HashedStorage::from_iter(false, changed_storage_iter));
|
||||
}
|
||||
}
|
||||
}
|
||||
if storage.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(HashedStorage::from_iter(false, storage))
|
||||
}
|
||||
};
|
||||
|
||||
hashed_state
|
||||
Some((hashed_address, info, hashed_storage))
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Input parameters for dispatching a multiproof calculation.
|
||||
|
||||
Reference in New Issue
Block a user