mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-04-08 03:01:12 -04:00
feat: require only account & bytecode reader for tx validation (#16930)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user