revme/cmd/bench/
transfer.rs1use 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 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 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}