diff --git a/Cargo.lock b/Cargo.lock index e4f8f6652..6222c9589 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7824,6 +7824,8 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", + "tracing", + "ureq", ] [[package]] @@ -12007,6 +12009,36 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f0fde9bc91026e381155f8c67cb354bcd35260b2f4a29bcc84639f762760c39" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59db78ad1923f2b1be62b6da81fe80b173605ca0d57f85da2e005382adf693f7" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.4" diff --git a/Cargo.toml b/Cargo.toml index e0d631197..cc7c842fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -538,6 +538,7 @@ url = { version = "2.3", default-features = false } zstd = "0.13" byteorder = "1" mini-moka = "0.10" +ureq = "3.0.12" # metrics metrics = "0.24.0" diff --git a/crates/ethereum/evm/Cargo.toml b/crates/ethereum/evm/Cargo.toml index 104bacce8..718f3a6d2 100644 --- a/crates/ethereum/evm/Cargo.toml +++ b/crates/ethereum/evm/Cargo.toml @@ -38,6 +38,8 @@ lz4_flex.workspace = true reth-hyperliquid-types.workspace = true parking_lot.workspace = true +ureq.workspace = true +tracing.workspace = true [dev-dependencies] reth-testing-utils.workspace = true diff --git a/crates/ethereum/evm/src/execute.rs b/crates/ethereum/evm/src/execute.rs index 0965a4817..ce6046f96 100644 --- a/crates/ethereum/evm/src/execute.rs +++ b/crates/ethereum/evm/src/execute.rs @@ -27,6 +27,12 @@ use reth_primitives_traits::{transaction::signed::is_impersonated_tx, NodePrimit use reth_revm::{ context_interface::result::ResultAndState, db::State, state::Bytecode, DatabaseCommit, }; +use std::{ + cell::RefCell, + sync::Mutex, + time::{Duration, Instant}, +}; +use tracing::info; /// Factory for [`EthExecutionStrategy`]. #[derive(Debug, Clone)] @@ -138,6 +144,31 @@ pub struct EthExecutionStrategy<'a, Evm> { gas_used: u64, } +fn fetch_corewriter_enabled_block_number() -> String { + // Temporary, will be removed after network upgrade. + static LAST_FETCHED_BLOCK_NUMBER: Mutex> = Mutex::new(None); + + fn fetch_inner() -> String { + let base_url = std::env::var("COREWRITER_ENABLED_BLOCK_NUMBER_URL").unwrap_or_else(|_| "https://sprites0.github.io/temp-block-number/".to_string()); + let url = format!("{}?{}", base_url, Instant::now().elapsed().as_nanos()); + let resp = ureq::get(url.clone()).call().unwrap(); + let block_number = resp.into_body().read_to_string().unwrap(); + info!("Fetched corewriter enabled block number: {}", block_number); + block_number + } + + let mut cell = LAST_FETCHED_BLOCK_NUMBER.lock().unwrap(); + if cell.is_none() + || matches!(*cell, Some((_, last_fetched_time)) if last_fetched_time.elapsed() > Duration::from_secs(1)) + { + let block_number = fetch_inner(); + *cell = Some((block_number, Instant::now())); + } + + let (block_number, _) = cell.clone().expect("cell should be initialized above"); + block_number +} + impl<'a, 'db, DB, E> EthExecutionStrategy<'a, E> where DB: Database + 'db, @@ -165,13 +196,21 @@ where address!("0x3333333333333333333333333333333333333333"); const COREWRITER_BYTECODE: &[u8] = &hex!("608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806317938e131461002d575b5f5ffd5b61004760048036038101906100429190610123565b610049565b005b5f5f90505b61019081101561006557808060010191505061004e565b503373ffffffffffffffffffffffffffffffffffffffff167f8c7f585fb295f7eb1e6aeb8fba61b23a4fe60beda405f0045073b185c74412e383836040516100ae9291906101c8565b60405180910390a25050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126100e3576100e26100c2565b5b8235905067ffffffffffffffff811115610100576100ff6100c6565b5b60208301915083600182028301111561011c5761011b6100ca565b5b9250929050565b5f5f60208385031215610139576101386100ba565b5b5f83013567ffffffffffffffff811115610156576101556100be565b5b610162858286016100ce565b92509250509250929050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f6101a7838561016e565b93506101b483858461017e565b6101bd8361018c565b840190509392505050565b5f6020820190508181035f8301526101e181848661019c565b9050939250505056fea2646970667358221220f01517e1fbaff8af4bd72cb063cccecbacbb00b07354eea7dd52265d355474fb64736f6c634300081c0033"); - let corewriter_enabled_block_number: u64 = - std::env::var("COREWRITER_ENABLED_BLOCK_NUMBER").unwrap().parse().unwrap(); + let corewriter_enabled_block_number: u64 = std::env::var("COREWRITER_ENABLED_BLOCK_NUMBER") + .unwrap_or_else(|_| fetch_corewriter_enabled_block_number()) + .parse() + .unwrap(); if block_number != corewriter_enabled_block_number { return Ok(()); } + // This will stop the block number being fetched after the deployment. + std::env::set_var( + "COREWRITER_ENABLED_BLOCK_NUMBER", + corewriter_enabled_block_number.to_string(), + ); + let bytecode = Bytecode::new_raw(COREWRITER_BYTECODE.into()); let account = self .evm