revme/cmd/bench/
transfer.rs

1use context::{ContextTr, TxEnv};
2use criterion::Criterion;
3use database::{BenchmarkDB, BENCH_CALLER, BENCH_TARGET, BENCH_TARGET_BALANCE};
4use revm::{
5    bytecode::Bytecode,
6    context_interface::JournalTr,
7    primitives::{TxKind, U256},
8    Context, ExecuteEvm, MainBuilder, MainContext,
9};
10
11pub fn run(criterion: &mut Criterion) {
12    let mut evm = Context::mainnet()
13        .with_db(BenchmarkDB::new_bytecode(Bytecode::new()))
14        .modify_cfg_chained(|cfg| cfg.disable_nonce_check = true)
15        .build_mainnet();
16
17    let tx = TxEnv::builder()
18        .caller(BENCH_CALLER)
19        .kind(TxKind::Call(BENCH_TARGET))
20        .value(U256::from(1))
21        .gas_price(1)
22        .gas_priority_fee(None)
23        .build()
24        .unwrap();
25
26    evm.ctx.tx = tx.clone();
27
28    let mut i = 0;
29    criterion.bench_function("transfer", |b| {
30        b.iter_batched(
31            || {
32                // create a transfer input
33                tx.clone()
34            },
35            |input| {
36                i += 1;
37                evm.transact_one(input).unwrap();
38            },
39            criterion::BatchSize::SmallInput,
40        );
41    });
42
43    let balance = evm
44        .journal_mut()
45        .load_account(BENCH_TARGET)
46        .unwrap()
47        .data
48        .info
49        .balance;
50
51    if balance != BENCH_TARGET_BALANCE + U256::from(i) {
52        panic!("balance of transfers is not correct");
53    }
54
55    // drop the journal
56    let _ = evm.finalize();
57
58    evm.modify_cfg(|cfg| cfg.disable_nonce_check = false);
59
60    criterion.bench_function("transfer_finalize", |b| {
61        b.iter(|| {
62            let _ = evm.replay().unwrap();
63        })
64    });
65}