Skip to content

Commit

Permalink
add perf on access list load
Browse files Browse the repository at this point in the history
  • Loading branch information
rakita committed Dec 30, 2024
1 parent 269a204 commit b6b81e5
Show file tree
Hide file tree
Showing 11 changed files with 82 additions and 15 deletions.
3 changes: 1 addition & 2 deletions bins/revme/src/cmd/statetest/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,7 @@ pub fn execute_test_suite(
.map(|item| (item.address, item.storage_keys.clone()))
.collect::<Vec<_>>()
})
.unwrap_or_default()
.into();
.unwrap_or_default();

tx.authorization_list = unit
.transaction
Expand Down
12 changes: 12 additions & 0 deletions crates/context/interface/src/context.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/// Some actions on top of context with just Getter traits would require borrowing the context
/// with a both mutable and immutable reference.
///
/// To allow doing this action more efficiently, we introduce a new trait that does this directly.
///
/// Used for loading access list and applying EIP-7702 authorization list.
pub trait PerformantContextAccess {
type Error;

/// Load access list
fn load_access_list(&mut self) -> Result<(), Self::Error>;
}
2 changes: 2 additions & 0 deletions crates/context/interface/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ extern crate alloc as std;

pub mod block;
pub mod cfg;
pub mod context;
pub mod errors;
pub mod host;
pub mod journaled_state;
Expand All @@ -15,6 +16,7 @@ pub mod transaction;

pub use block::{Block, BlockGetter};
pub use cfg::{Cfg, CfgGetter, CreateScheme, TransactTo};
pub use context::PerformantContextAccess;
pub use database_interface::{DBErrorMarker, Database, DatabaseGetter};
pub use errors::ErrorGetter;
pub use journaled_state::{Journal, JournalDBError, JournalGetter};
Expand Down
2 changes: 2 additions & 0 deletions crates/context/src/context.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
pub mod performant_access;

use crate::{block::BlockEnv, cfg::CfgEnv, journaled_state::JournaledState, tx::TxEnv};
use bytecode::{Bytecode, EOF_MAGIC_BYTES, EOF_MAGIC_HASH};
use context_interface::{
Expand Down
28 changes: 28 additions & 0 deletions crates/context/src/context/performant_access.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use super::Context;
use context_interface::{Block, Cfg, Database, Journal, PerformantContextAccess, Transaction};
use primitives::U256;

impl<
BLOCK: Block,
TX: Transaction,
CFG: Cfg,
DB: Database,
JOURNAL: Journal<Database = DB>,
CHAIN,
> PerformantContextAccess for Context<BLOCK, TX, CFG, DB, JOURNAL, CHAIN>
{
type Error = <DB as Database>::Error;

fn load_access_list(&mut self) -> Result<(), Self::Error> {
let Some(access_list) = self.tx.access_list() else {
return Ok(());
};
for access_list in access_list {
self.journaled_state.warm_account_and_storage(
*access_list.0,
access_list.1.iter().map(|i| U256::from_be_bytes(i.0)),
)?;
}
Ok(())
}
}
1 change: 1 addition & 0 deletions crates/context/src/journaled_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,7 @@ impl<DB: Database> JournaledState<DB> {
key: U256,
new: U256,
) -> Result<StateLoad<SStoreResult>, DB::Error> {
println!("sstore state: {:#?}", self.state);
// assume that acc exists and load the slot.
let present = self.sload(address, key)?;
let acc = self.state.get_mut(&address).unwrap();
Expand Down
21 changes: 15 additions & 6 deletions crates/handler/src/pre_execution.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ use context_interface::{
journaled_state::Journal,
result::InvalidTransaction,
transaction::{Transaction, TransactionType},
Block, BlockGetter, Cfg, CfgGetter, JournalDBError, JournalGetter, TransactionGetter,
Block, BlockGetter, Cfg, CfgGetter, Database, DatabaseGetter, JournalDBError, JournalGetter,
PerformantContextAccess, TransactionGetter,
};
use handler_interface::PreExecutionHandler;
use primitives::{Address, BLOCKHASH_STORAGE_ADDRESS, U256};
Expand Down Expand Up @@ -58,7 +59,7 @@ where
}

// Load access list
// TODO
context.load_access_list()?;
// if let Some(access_list) = context.tx().access_list().cloned() {
// for access_list in access_list.iter() {
// context.journal().warm_account_and_storage(
Expand Down Expand Up @@ -141,7 +142,6 @@ pub fn apply_eip7702_auth_list<

let authorization_list = tx
.authorization_list()
.into_iter()
.map(|a| Authorization {
authority: a.0,
chain_id: a.1,
Expand Down Expand Up @@ -203,12 +203,21 @@ pub fn apply_eip7702_auth_list<
}

pub trait EthPreExecutionContext:
TransactionGetter + BlockGetter + JournalGetter + CfgGetter
TransactionGetter
+ BlockGetter
+ JournalGetter
+ CfgGetter
+ PerformantContextAccess<Error = <<Self as DatabaseGetter>::Database as Database>::Error>
{
}

impl<CTX: TransactionGetter + BlockGetter + JournalGetter + CfgGetter> EthPreExecutionContext
for CTX
impl<
CTX: TransactionGetter
+ BlockGetter
+ JournalGetter
+ CfgGetter
+ PerformantContextAccess<Error = <<CTX as DatabaseGetter>::Database as Database>::Error>,
> EthPreExecutionContext for CTX
{
}

Expand Down
12 changes: 12 additions & 0 deletions crates/inspector/src/inspector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use revm::{
context::JournaledState,
context_interface::{
block::BlockSetter,
context::PerformantContextAccess,
journaled_state::{AccountLoad, Eip7702CodeLoad},
transaction::TransactionSetter,
BlockGetter, CfgGetter, DatabaseGetter, ErrorGetter, Journal, JournalDBError,
Expand Down Expand Up @@ -387,6 +388,17 @@ where
}
}

impl<INSP, DB: Database, CTX> PerformantContextAccess for InspectorContext<INSP, DB, CTX>
where
CTX: PerformantContextAccess<Error = DB::Error> + DatabaseGetter<Database = DB>,
{
type Error = <CTX as PerformantContextAccess>::Error;

fn load_access_list(&mut self) -> Result<(), Self::Error> {
self.inner.load_access_list()
}
}

impl<INSP, DB, CTX> DatabaseGetter for InspectorContext<INSP, DB, CTX>
where
CTX: DatabaseGetter<Database = DB>,
Expand Down
4 changes: 2 additions & 2 deletions crates/interpreter/src/gas/calc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -370,8 +370,8 @@ pub fn validate_initial_tx_gas(
};

// Get number of access list account and storages.
initial_gas += access_list_accounts as u64 * ACCESS_LIST_ADDRESS;
initial_gas += access_list_storages as u64 * ACCESS_LIST_STORAGE_KEY;
initial_gas += access_list_accounts * ACCESS_LIST_ADDRESS;
initial_gas += access_list_storages * ACCESS_LIST_STORAGE_KEY;

// Base stipend
initial_gas += if is_create {
Expand Down
10 changes: 7 additions & 3 deletions crates/revm/src/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::{exec::EvmCommit, EvmExec};
use context::{block::BlockEnv, tx::TxEnv, CfgEnv, Context, JournaledState};
use context_interface::{
block::BlockSetter,
context::PerformantContextAccess,
journaled_state::Journal,
result::{
EVMError, ExecutionResult, HaltReasonTrait, InvalidHeader, InvalidTransaction,
Expand Down Expand Up @@ -54,7 +55,8 @@ where
FinalOutput = (EvmState, Vec<Log>),
Database = <CTX as DatabaseGetter>::Database,
>,
> + Host,
> + Host
+ PerformantContextAccess<Error = <<CTX as DatabaseGetter>::Database as Database>::Error>,
ERROR: From<InvalidTransaction>
+ From<InvalidHeader>
+ From<JournalDBError<CTX>>
Expand Down Expand Up @@ -101,7 +103,8 @@ where
FinalOutput = (EvmState, Vec<Log>),
Database = <CTX as DatabaseGetter>::Database,
>,
> + Host,
> + Host
+ PerformantContextAccess<Error = <<CTX as DatabaseGetter>::Database as Database>::Error>,
ERROR: From<InvalidTransaction>
+ From<InvalidHeader>
+ From<JournalDBError<CTX>>
Expand Down Expand Up @@ -159,7 +162,8 @@ where
FinalOutput = (EvmState, Vec<Log>),
Database = <CTX as DatabaseGetter>::Database,
>,
> + Host,
> + Host
+ PerformantContextAccess<Error = <<CTX as DatabaseGetter>::Database as Database>::Error>,
ERROR: From<InvalidTransaction>
+ From<InvalidHeader>
+ From<JournalDBError<CTX>>
Expand Down
2 changes: 0 additions & 2 deletions crates/statetest-types/src/test_authorization.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::u64;

use revm::{
context_interface::transaction::AuthorizationItem,
primitives::{Address, U256},
Expand Down

0 comments on commit b6b81e5

Please sign in to comment.