diff --git a/executor/programs/rust/ethrex/src/main.rs b/executor/programs/rust/ethrex/src/main.rs index 30a39f4b5..4d42a804e 100644 --- a/executor/programs/rust/ethrex/src/main.rs +++ b/executor/programs/rust/ethrex/src/main.rs @@ -5,8 +5,16 @@ use lambda_vm_ethrex_crypto::LambdaVmEcsmCrypto; use rkyv::rancor::Error; pub fn main() { - let input = lambda_vm_syscalls::syscalls::get_private_input(); - let input = rkyv::from_bytes::(&input).unwrap(); + // Zero-copy private input: `ef_io::read_input` returns a pointer+len into + // the memory-mapped input region (host pre-loads it before execution), so + // rkyv deserializes straight from the input. `get_private_input()` would + // `to_vec()` the whole input first — a full extra copy plus one large + // allocation (~52k cycles on a 20-tx block). + let mut input_ptr: *const u8 = core::ptr::null(); + let mut input_len: usize = 0; + unsafe { lambda_vm_syscalls::ef_io::read_input(&mut input_ptr, &mut input_len) }; + let input = unsafe { core::slice::from_raw_parts(input_ptr, input_len) }; + let input = rkyv::from_bytes::(input).unwrap(); // LambdaVM crypto provider, defined in the lambda_vm repo and injected here // (so crypto changes don't require an ethrex PR — see `crypto/ethrex-crypto`). // It accelerates trait-routed `keccak256` (via the keccak_permute precompile)