feat: require only account & bytecode reader for tx validation (#16930)

This commit is contained in:
Hai | RISE
2025-06-19 20:58:57 +07:00
committed by GitHub
parent ebd57f77bc
commit 6aa73f1480
3 changed files with 11 additions and 7 deletions

View File

@@ -8,7 +8,7 @@ use reth_optimism_forks::OpHardforks;
use reth_primitives_traits::{
transaction::error::InvalidTransactionError, Block, BlockBody, GotExpected, SealedBlock,
};
use reth_storage_api::{BlockReaderIdExt, StateProvider, StateProviderFactory};
use reth_storage_api::{AccountInfoReader, BlockReaderIdExt, StateProviderFactory};
use reth_transaction_pool::{
error::InvalidPoolTransactionError, EthPoolTransaction, EthTransactionValidator,
TransactionOrigin, TransactionValidationOutcome, TransactionValidator,
@@ -181,7 +181,7 @@ where
&self,
origin: TransactionOrigin,
transaction: Tx,
state: &mut Option<Box<dyn StateProvider>>,
state: &mut Option<Box<dyn AccountInfoReader>>,
) -> TransactionValidationOutcome<Tx> {
if transaction.is_eip4844() {
return TransactionValidationOutcome::Invalid(

View File

@@ -92,6 +92,10 @@ pub trait StateProvider:
}
}
/// Minimal requirements to read a full account, for example, to validate its new transactions
pub trait AccountInfoReader: AccountReader + BytecodeReader {}
impl<T: AccountReader + BytecodeReader> AccountInfoReader for T {}
/// Trait implemented for database providers that can provide the [`reth_trie_db::StateCommitment`]
/// type.
#[cfg(feature = "db-api")]

View File

@@ -28,7 +28,7 @@ use reth_primitives_traits::{
constants::MAX_TX_GAS_LIMIT_OSAKA, transaction::error::InvalidTransactionError, Block,
GotExpected, SealedBlock,
};
use reth_storage_api::{StateProvider, StateProviderFactory};
use reth_storage_api::{AccountInfoReader, StateProviderFactory};
use reth_tasks::TaskSpawner;
use std::{
marker::PhantomData,
@@ -89,7 +89,7 @@ where
&self,
origin: TransactionOrigin,
transaction: Tx,
state: &mut Option<Box<dyn StateProvider>>,
state: &mut Option<Box<dyn AccountInfoReader>>,
) -> TransactionValidationOutcome<Tx> {
self.inner.validate_one_with_provider(origin, transaction, state)
}
@@ -207,7 +207,7 @@ where
&self,
origin: TransactionOrigin,
transaction: Tx,
maybe_state: &mut Option<Box<dyn StateProvider>>,
maybe_state: &mut Option<Box<dyn AccountInfoReader>>,
) -> TransactionValidationOutcome<Tx> {
match self.validate_one_no_state(origin, transaction) {
Ok(transaction) => {
@@ -216,7 +216,7 @@ where
if maybe_state.is_none() {
match self.client.latest() {
Ok(new_state) => {
*maybe_state = Some(new_state);
*maybe_state = Some(Box::new(new_state));
}
Err(err) => {
return TransactionValidationOutcome::Error(
@@ -456,7 +456,7 @@ where
state: P,
) -> TransactionValidationOutcome<Tx>
where
P: StateProvider,
P: AccountInfoReader,
{
// Use provider to get account info
let account = match state.basic_account(transaction.sender_ref()) {