reth_bench/bench/
context.rs1use crate::{authenticated_transport::AuthenticatedTransportConnect, bench_mode::BenchMode};
5use alloy_eips::BlockNumberOrTag;
6use alloy_provider::{network::AnyNetwork, Provider, RootProvider};
7use alloy_rpc_client::ClientBuilder;
8use alloy_rpc_types_engine::JwtSecret;
9use reqwest::Url;
10use reth_node_core::args::BenchmarkArgs;
11use tracing::info;
12
13pub(crate) struct BenchContext {
19 pub(crate) auth_provider: RootProvider<AnyNetwork>,
21 pub(crate) block_provider: RootProvider<AnyNetwork>,
23 pub(crate) benchmark_mode: BenchMode,
26 pub(crate) next_block: u64,
28}
29
30impl BenchContext {
31 pub(crate) async fn new(bench_args: &BenchmarkArgs, rpc_url: String) -> eyre::Result<Self> {
34 info!("Running benchmark using data from RPC URL: {}", rpc_url);
35
36 if let Some(output) = &bench_args.output {
38 if output.is_file() {
39 return Err(eyre::eyre!("Output path must be a directory"));
40 }
41 }
42
43 let client = ClientBuilder::default().http(rpc_url.parse()?);
45 let block_provider = RootProvider::<AnyNetwork>::new(client);
46
47 let mut benchmark_mode = BenchMode::new(bench_args.from, bench_args.to)?;
50
51 let auth_jwt = bench_args
53 .auth_jwtsecret
54 .clone()
55 .ok_or_else(|| eyre::eyre!("--jwtsecret must be provided for authenticated RPC"))?;
56
57 let jwt = std::fs::read_to_string(auth_jwt)?;
61 let jwt = JwtSecret::from_hex(jwt)?;
62
63 let auth_url = Url::parse(&bench_args.engine_rpc_url)?;
65
66 info!("Connecting to Engine RPC at {} for replay", auth_url);
68 let auth_transport = AuthenticatedTransportConnect::new(auth_url, jwt);
69 let client = ClientBuilder::default().connect_with(auth_transport).await?;
70 let auth_provider = RootProvider::<AnyNetwork>::new(client);
71
72 let first_block = match benchmark_mode {
73 BenchMode::Continuous => {
74 block_provider.get_block_by_number(BlockNumberOrTag::Latest).full().await?.unwrap()
76 }
77 BenchMode::Range(ref mut range) => {
78 match range.next() {
79 Some(block_number) => {
80 block_provider
82 .get_block_by_number(block_number.into())
83 .full()
84 .await?
85 .unwrap()
86 }
87 None => {
88 return Err(eyre::eyre!(
89 "Benchmark mode range is empty, please provide a larger range"
90 ));
91 }
92 }
93 }
94 };
95
96 let next_block = first_block.header.number + 1;
97 Ok(Self { auth_provider, block_provider, benchmark_mode, next_block })
98 }
99}