feat: improve in memory block tracking (#9773)

This commit is contained in:
Federico Gimenez
2024-07-25 14:30:11 +02:00
committed by GitHub
parent 6faa7f9630
commit 115a58b327
4 changed files with 271 additions and 57 deletions

View File

@ -563,7 +563,7 @@ mod tests {
use reth_primitives::Receipt;
fn create_mock_state(block_number: u64) -> BlockState {
BlockState::new(get_executed_block_with_number(block_number))
BlockState::new(get_executed_block_with_number(block_number, B256::random()))
}
#[test]
@ -643,7 +643,7 @@ mod tests {
#[test]
fn test_state_new() {
let number = rand::thread_rng().gen::<u64>();
let block = get_executed_block_with_number(number);
let block = get_executed_block_with_number(number, B256::random());
let state = BlockState::new(block.clone());
@ -653,7 +653,7 @@ mod tests {
#[test]
fn test_state_block() {
let number = rand::thread_rng().gen::<u64>();
let block = get_executed_block_with_number(number);
let block = get_executed_block_with_number(number, B256::random());
let state = BlockState::new(block.clone());
@ -663,17 +663,17 @@ mod tests {
#[test]
fn test_state_hash() {
let number = rand::thread_rng().gen::<u64>();
let block = get_executed_block_with_number(number);
let block = get_executed_block_with_number(number, B256::random());
let state = BlockState::new(block.clone());
assert_eq!(state.hash(), block.block().hash());
assert_eq!(state.hash(), block.block.hash());
}
#[test]
fn test_state_number() {
let number = rand::thread_rng().gen::<u64>();
let block = get_executed_block_with_number(number);
let block = get_executed_block_with_number(number, B256::random());
let state = BlockState::new(block);
@ -683,7 +683,7 @@ mod tests {
#[test]
fn test_state_state_root() {
let number = rand::thread_rng().gen::<u64>();
let block = get_executed_block_with_number(number);
let block = get_executed_block_with_number(number, B256::random());
let state = BlockState::new(block.clone());
@ -694,7 +694,7 @@ mod tests {
fn test_state_receipts() {
let receipts = Receipts { receipt_vec: vec![vec![Some(Receipt::default())]] };
let block = get_executed_block_with_receipts(receipts.clone());
let block = get_executed_block_with_receipts(receipts.clone(), B256::random());
let state = BlockState::new(block);
@ -704,8 +704,8 @@ mod tests {
#[test]
fn test_in_memory_state_chain_update() {
let state = CanonicalInMemoryState::new(HashMap::new(), HashMap::new(), None);
let block1 = get_executed_block_with_number(0);
let block2 = get_executed_block_with_number(0);
let block1 = get_executed_block_with_number(0, B256::random());
let block2 = get_executed_block_with_number(0, B256::random());
let chain = NewCanonicalChain::Commit { new: vec![block1.clone()] };
state.update_chain(chain);
assert_eq!(state.head_state().unwrap().block().block().hash(), block1.block().hash());

View File

@ -6,6 +6,7 @@ use rand::Rng;
use reth_execution_types::{Chain, ExecutionOutcome};
use reth_primitives::{
Address, Block, BlockNumber, Receipts, Requests, SealedBlockWithSenders, TransactionSigned,
B256,
};
use reth_trie::{updates::TrieUpdates, HashedPostState};
use revm::db::BundleState;
@ -15,18 +16,22 @@ use std::{
};
use tokio::sync::broadcast::{self, Sender};
fn get_executed_block(block_number: BlockNumber, receipts: Receipts) -> ExecutedBlock {
fn get_executed_block(
block_number: BlockNumber,
receipts: Receipts,
parent_hash: B256,
) -> ExecutedBlock {
let mut block = Block::default();
let mut header = block.header.clone();
header.number = block_number;
header.parent_hash = parent_hash;
header.ommers_hash = B256::random();
block.header = header;
let sender = Address::random();
let tx = TransactionSigned::default();
block.body.push(tx);
let sealed = block.seal_slow();
let sender = Address::random();
let sealed_with_senders = SealedBlockWithSenders::new(sealed.clone(), vec![sender]).unwrap();
ExecutedBlock::new(
Arc::new(sealed),
Arc::new(sealed_with_senders.senders),
@ -42,20 +47,27 @@ fn get_executed_block(block_number: BlockNumber, receipts: Receipts) -> Executed
}
/// Generates an `ExecutedBlock` that includes the given `Receipts`.
pub fn get_executed_block_with_receipts(receipts: Receipts) -> ExecutedBlock {
pub fn get_executed_block_with_receipts(receipts: Receipts, parent_hash: B256) -> ExecutedBlock {
let number = rand::thread_rng().gen::<u64>();
get_executed_block(number, receipts)
get_executed_block(number, receipts, parent_hash)
}
/// Generates an `ExecutedBlock` with the given `BlockNumber`.
pub fn get_executed_block_with_number(block_number: BlockNumber) -> ExecutedBlock {
get_executed_block(block_number, Receipts { receipt_vec: vec![vec![]] })
pub fn get_executed_block_with_number(
block_number: BlockNumber,
parent_hash: B256,
) -> ExecutedBlock {
get_executed_block(block_number, Receipts { receipt_vec: vec![vec![]] }, parent_hash)
}
/// Generates a range of executed blocks with ascending block numbers.
pub fn get_executed_blocks(range: Range<u64>) -> impl Iterator<Item = ExecutedBlock> {
range.map(get_executed_block_with_number)
let mut parent_hash = B256::default();
range.map(move |number| {
let block = get_executed_block_with_number(number, parent_hash);
parent_hash = block.block.hash();
block
})
}
/// A test `ChainEventSubscriptions`