fix(witness): destroyed slots as proof targets (#11596)

This commit is contained in:
Roman Krasiuk
2024-10-09 17:59:28 +02:00
committed by GitHub
parent adf3a0da6b
commit 40faed6ea0
2 changed files with 70 additions and 13 deletions

View File

@ -6,7 +6,7 @@ use alloy_primitives::{
Address, Bytes, B256, U256,
};
use alloy_rlp::EMPTY_STRING_CODE;
use reth_primitives::{constants::EMPTY_ROOT_HASH, Account};
use reth_primitives::{constants::EMPTY_ROOT_HASH, Account, StorageEntry};
use reth_provider::{test_utils::create_test_provider_factory, HashingWriter};
use reth_trie::{proof::Proof, witness::TrieWitness, HashedPostState, HashedStorage, StateRoot};
use reth_trie_db::{DatabaseProof, DatabaseStateRoot, DatabaseTrieWitness};
@ -55,3 +55,39 @@ fn includes_empty_node_preimage() {
// witness includes empty state trie root node
assert_eq!(witness.get(&EMPTY_ROOT_HASH), Some(&Bytes::from([EMPTY_STRING_CODE])));
}
#[test]
fn includes_nodes_for_destroyed_storage_nodes() {
let factory = create_test_provider_factory();
let provider = factory.provider_rw().unwrap();
let address = Address::random();
let hashed_address = keccak256(address);
let slot = B256::random();
let hashed_slot = keccak256(slot);
// Insert account and slot into database
provider.insert_account_for_hashing([(address, Some(Account::default()))]).unwrap();
provider
.insert_storage_for_hashing([(address, [StorageEntry { key: slot, value: U256::from(1) }])])
.unwrap();
let state_root = StateRoot::from_tx(provider.tx_ref()).root().unwrap();
let multiproof = Proof::from_tx(provider.tx_ref())
.multiproof(HashMap::from_iter([(hashed_address, HashSet::from_iter([hashed_slot]))]))
.unwrap();
let witness = TrieWitness::from_tx(provider.tx_ref())
.compute(HashedPostState {
accounts: HashMap::from([(hashed_address, Some(Account::default()))]),
storages: HashMap::from([(hashed_address, HashedStorage::from_iter(true, []))]), // destroyed
})
.unwrap();
assert!(witness.contains_key(&state_root));
for node in multiproof.account_subtree.values() {
assert_eq!(witness.get(&keccak256(node)), Some(node));
}
for node in multiproof.storages.iter().flat_map(|(_, storage)| storage.subtree.values()) {
assert_eq!(witness.get(&keccak256(node)), Some(node));
}
}