revme/cmd/bench/
transfer_multi.rs

1use context::TxEnv;
2use criterion::Criterion;
3use database::{InMemoryDB, BENCH_CALLER, BENCH_TARGET};
4use revm::{
5    interpreter::instructions::utility::IntoAddress,
6    primitives::{TxKind, U256},
7    Context, ExecuteCommitEvm, ExecuteEvm, MainBuilder, MainContext,
8};
9use state::AccountInfo;
10
11pub fn run(criterion: &mut Criterion) {
12    let mut db = InMemoryDB::default();
13
14    let address = U256::from(10000);
15    for i in 0..10000 {
16        db.insert_account_info(
17            (address + U256::from(i)).into_address(),
18            AccountInfo::from_balance(U256::from(3_000_000_000u32)),
19        );
20    }
21    db.insert_account_info(
22        BENCH_TARGET,
23        AccountInfo::from_balance(U256::from(3_000_000_000u32)),
24    );
25
26    db.insert_account_info(
27        BENCH_CALLER,
28        AccountInfo::from_balance(U256::from(3_000_000_000u32)),
29    );
30
31    let mut evm = Context::mainnet()
32        .with_db(db)
33        .modify_cfg_chained(|cfg| cfg.disable_nonce_check = true)
34        .build_mainnet();
35
36    let tx = TxEnv {
37        caller: BENCH_CALLER,
38        kind: TxKind::Call(BENCH_TARGET),
39        value: U256::from(1),
40        gas_price: 0,
41        gas_priority_fee: None,
42        gas_limit: 30_000,
43        ..Default::default()
44    };
45
46    let target = U256::from(10000);
47    let mut txs = vec![tx.clone(); 1000];
48
49    for (i, tx_mut) in txs.iter_mut().enumerate() {
50        tx_mut.kind = TxKind::Call((target + U256::from(i)).into_address());
51    }
52
53    criterion.bench_function("transact_commit_1000txs", |b| {
54        b.iter(|| {
55            for tx in txs.iter() {
56                let _ = evm.transact_commit(tx.clone()).unwrap();
57            }
58        })
59    });
60
61    criterion.bench_function("transact_1000tx_commit_inner_every_40", |b| {
62        b.iter(|| {
63            for (i, tx) in txs.iter().enumerate() {
64                let _ = evm.transact(tx.clone()).unwrap();
65                if i % 40 == 0 {
66                    evm.commit_inner();
67                }
68            }
69            evm.commit_inner();
70        })
71    });
72}