From 75f40833a9de34f4dbfa9b16314d3b8da1b386c7 Mon Sep 17 00:00:00 2001 From: diegokingston Date: Fri, 31 Jul 2026 18:06:34 -0300 Subject: [PATCH] perf(guest): read the private input zero-copy via ef_io::read_input get_private_input() to_vec()'s the whole memory-mapped input before rkyv deserializes it; read_input hands rkyv a slice straight into the input region instead. Same bytes, same private-input commitment. Measured vs origin/main (same fixtures, deterministic): transfers_20 8,732,213 -> 8,692,490 (-39,723) erc20_20 10,328,222 -> 10,278,822 (-49,400) mixed_20 9,817,444 -> 9,768,492 (-48,952) Verified: test_prove_ethrex_empty_block (prove+verify) passes. --- executor/programs/rust/ethrex/src/main.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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)