From 828ddbaca43406c33fda762b9d310e6897cfd703 Mon Sep 17 00:00:00 2001 From: Federico Gimenez Date: Sat, 7 Dec 2024 14:13:21 +0100 Subject: [PATCH] chore(engine): refactor code to transform EvmState into HashedPostState (#13207) --- crates/engine/tree/src/tree/root.rs | 89 ++++++++++++----------------- 1 file changed, 35 insertions(+), 54 deletions(-) diff --git a/crates/engine/tree/src/tree/root.rs b/crates/engine/tree/src/tree/root.rs index 2d00feba50d4..dc0563ade502 100644 --- a/crates/engine/tree/src/tree/root.rs +++ b/crates/engine/tree/src/tree/root.rs @@ -181,6 +181,38 @@ impl Drop for StateHookSender { } } +fn evm_state_to_hashed_post_state(update: EvmState) -> HashedPostState { + let mut hashed_state = HashedPostState::default(); + + for (address, account) in update { + if account.is_touched() { + let hashed_address = keccak256(address); + trace!(target: "engine::root", ?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_map(|(slot, value)| { + value.is_changed().then(|| (keccak256(B256::from(slot)), value.present_value)) + }) + .peekable(); + + if destroyed || changed_storage_iter.peek().is_some() { + hashed_state.storages.insert( + hashed_address, + HashedStorage::from_iter(destroyed, changed_storage_iter), + ); + } + } + } + + hashed_state +} + /// Standalone task that receives a transaction state stream and updates relevant /// data structures to calculate state root. /// @@ -258,33 +290,7 @@ where proof_sequence_number: u64, state_root_message_sender: Sender, ) { - let mut hashed_state_update = HashedPostState::default(); - for (address, account) in update { - if account.is_touched() { - let hashed_address = keccak256(address); - trace!(target: "engine::root", ?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_update.accounts.insert(hashed_address, info); - - let mut changed_storage_iter = account - .storage - .into_iter() - .filter_map(|(slot, value)| { - value - .is_changed() - .then(|| (keccak256(B256::from(slot)), value.present_value)) - }) - .peekable(); - if destroyed || changed_storage_iter.peek().is_some() { - hashed_state_update.storages.insert( - hashed_address, - HashedStorage::from_iter(destroyed, changed_storage_iter), - ); - } - } - } + let hashed_state_update = evm_state_to_hashed_post_state(update); let proof_targets = get_proof_targets(&hashed_state_update, fetched_proof_targets); for (address, slots) in &proof_targets { @@ -696,34 +702,9 @@ mod tests { } for update in &state_updates { - for (address, account) in update { - let hashed_address = keccak256(*address); - - if account.is_touched() { - let destroyed = account.is_selfdestructed(); - hashed_state.accounts.insert( - hashed_address, - if destroyed || account.is_empty() { - None - } else { - Some(account.info.clone().into()) - }, - ); - - if destroyed || !account.storage.is_empty() { - let storage = account - .storage - .iter() - .filter(|&(_slot, value)| (!destroyed && value.is_changed())) - .map(|(slot, value)| { - (keccak256(B256::from(*slot)), value.present_value) - }); - hashed_state - .storages - .insert(hashed_address, HashedStorage::from_iter(destroyed, storage)); - } - } + hashed_state.extend(evm_state_to_hashed_post_state(update.clone())); + for (address, account) in update { let storage: HashMap = account .storage .iter()