From b2e1da3ebc8b04bc09cb14c61e820788d33511de Mon Sep 17 00:00:00 2001 From: Roman Krasiuk Date: Thu, 28 Nov 2024 11:28:07 +0100 Subject: [PATCH] fix(tree): root task storage leaf removal (#12950) --- crates/engine/tree/src/tree/root.rs | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/engine/tree/src/tree/root.rs b/crates/engine/tree/src/tree/root.rs index 222ff8e624..5d987648cf 100644 --- a/crates/engine/tree/src/tree/root.rs +++ b/crates/engine/tree/src/tree/root.rs @@ -514,12 +514,17 @@ fn update_sparse_trie( } for (slot, value) in storage.storage { - let slot_path = Nibbles::unpack(slot); - trie.update_storage_leaf( - address, - slot_path, - alloy_rlp::encode_fixed_size(&value).to_vec(), - )?; + let slot_nibbles = Nibbles::unpack(slot); + if value.is_zero() { + // TODO: handle blinded node error + trie.remove_storage_leaf(address, &slot_nibbles)?; + } else { + trie.update_storage_leaf( + address, + slot_nibbles, + alloy_rlp::encode_fixed_size(&value).to_vec(), + )?; + } } storage_roots.insert(address, trie.storage_root(address).unwrap()); @@ -527,7 +532,7 @@ fn update_sparse_trie( // Update accounts with new values and include updated storage roots for (address, account) in state.accounts { - let path = Nibbles::unpack(address); + let account_nibbles = Nibbles::unpack(address); if let Some(account) = account { let storage_root = storage_roots @@ -538,9 +543,10 @@ fn update_sparse_trie( let mut encoded = Vec::with_capacity(128); TrieAccount::from((account, storage_root)).encode(&mut encoded as &mut dyn BufMut); - trie.update_account_leaf(path, encoded)?; + trie.update_account_leaf(account_nibbles, encoded)?; } else { - trie.remove_account_leaf(&path)?; + // TODO: handle blinded node error + trie.remove_account_leaf(&account_nibbles)?; } }