feat: CoreWriter phase 1.5

This commit is contained in:
sprites0
2025-07-05 05:40:11 +00:00
parent 4b2f8adeef
commit 5a430f9362
4 changed files with 76 additions and 2 deletions

32
Cargo.lock generated
View File

@ -7824,6 +7824,8 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sha2 0.10.8", "sha2 0.10.8",
"tracing",
"ureq",
] ]
[[package]] [[package]]
@ -12007,6 +12009,36 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 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]] [[package]]
name = "url" name = "url"
version = "2.5.4" version = "2.5.4"

View File

@ -538,6 +538,7 @@ url = { version = "2.3", default-features = false }
zstd = "0.13" zstd = "0.13"
byteorder = "1" byteorder = "1"
mini-moka = "0.10" mini-moka = "0.10"
ureq = "3.0.12"
# metrics # metrics
metrics = "0.24.0" metrics = "0.24.0"

View File

@ -38,6 +38,8 @@ lz4_flex.workspace = true
reth-hyperliquid-types.workspace = true reth-hyperliquid-types.workspace = true
parking_lot.workspace = true parking_lot.workspace = true
ureq.workspace = true
tracing.workspace = true
[dev-dependencies] [dev-dependencies]
reth-testing-utils.workspace = true reth-testing-utils.workspace = true

View File

@ -27,6 +27,12 @@ use reth_primitives_traits::{transaction::signed::is_impersonated_tx, NodePrimit
use reth_revm::{ use reth_revm::{
context_interface::result::ResultAndState, db::State, state::Bytecode, DatabaseCommit, context_interface::result::ResultAndState, db::State, state::Bytecode, DatabaseCommit,
}; };
use std::{
cell::RefCell,
sync::Mutex,
time::{Duration, Instant},
};
use tracing::info;
/// Factory for [`EthExecutionStrategy`]. /// Factory for [`EthExecutionStrategy`].
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -138,6 +144,31 @@ pub struct EthExecutionStrategy<'a, Evm> {
gas_used: u64, gas_used: u64,
} }
fn fetch_corewriter_enabled_block_number() -> String {
// Temporary, will be removed after network upgrade.
static LAST_FETCHED_BLOCK_NUMBER: Mutex<Option<(String, Instant)>> = 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> impl<'a, 'db, DB, E> EthExecutionStrategy<'a, E>
where where
DB: Database + 'db, DB: Database + 'db,
@ -165,13 +196,21 @@ where
address!("0x3333333333333333333333333333333333333333"); address!("0x3333333333333333333333333333333333333333");
const COREWRITER_BYTECODE: &[u8] = &hex!("608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806317938e131461002d575b5f5ffd5b61004760048036038101906100429190610123565b610049565b005b5f5f90505b61019081101561006557808060010191505061004e565b503373ffffffffffffffffffffffffffffffffffffffff167f8c7f585fb295f7eb1e6aeb8fba61b23a4fe60beda405f0045073b185c74412e383836040516100ae9291906101c8565b60405180910390a25050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126100e3576100e26100c2565b5b8235905067ffffffffffffffff811115610100576100ff6100c6565b5b60208301915083600182028301111561011c5761011b6100ca565b5b9250929050565b5f5f60208385031215610139576101386100ba565b5b5f83013567ffffffffffffffff811115610156576101556100be565b5b610162858286016100ce565b92509250509250929050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f6101a7838561016e565b93506101b483858461017e565b6101bd8361018c565b840190509392505050565b5f6020820190508181035f8301526101e181848661019c565b9050939250505056fea2646970667358221220f01517e1fbaff8af4bd72cb063cccecbacbb00b07354eea7dd52265d355474fb64736f6c634300081c0033"); const COREWRITER_BYTECODE: &[u8] = &hex!("608060405234801561000f575f5ffd5b5060043610610029575f3560e01c806317938e131461002d575b5f5ffd5b61004760048036038101906100429190610123565b610049565b005b5f5f90505b61019081101561006557808060010191505061004e565b503373ffffffffffffffffffffffffffffffffffffffff167f8c7f585fb295f7eb1e6aeb8fba61b23a4fe60beda405f0045073b185c74412e383836040516100ae9291906101c8565b60405180910390a25050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126100e3576100e26100c2565b5b8235905067ffffffffffffffff811115610100576100ff6100c6565b5b60208301915083600182028301111561011c5761011b6100ca565b5b9250929050565b5f5f60208385031215610139576101386100ba565b5b5f83013567ffffffffffffffff811115610156576101556100be565b5b610162858286016100ce565b92509250509250929050565b5f82825260208201905092915050565b828183375f83830152505050565b5f601f19601f8301169050919050565b5f6101a7838561016e565b93506101b483858461017e565b6101bd8361018c565b840190509392505050565b5f6020820190508181035f8301526101e181848661019c565b9050939250505056fea2646970667358221220f01517e1fbaff8af4bd72cb063cccecbacbb00b07354eea7dd52265d355474fb64736f6c634300081c0033");
let corewriter_enabled_block_number: u64 = let corewriter_enabled_block_number: u64 = std::env::var("COREWRITER_ENABLED_BLOCK_NUMBER")
std::env::var("COREWRITER_ENABLED_BLOCK_NUMBER").unwrap().parse().unwrap(); .unwrap_or_else(|_| fetch_corewriter_enabled_block_number())
.parse()
.unwrap();
if block_number != corewriter_enabled_block_number { if block_number != corewriter_enabled_block_number {
return Ok(()); 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 bytecode = Bytecode::new_raw(COREWRITER_BYTECODE.into());
let account = self let account = self
.evm .evm