diff --git a/evm/src/cpu/kernel/asm/rlp/read_to_memory.asm b/evm/src/cpu/kernel/asm/rlp/read_to_memory.asm index 75935371..8070fd0b 100644 --- a/evm/src/cpu/kernel/asm/rlp/read_to_memory.asm +++ b/evm/src/cpu/kernel/asm/rlp/read_to_memory.asm @@ -2,7 +2,7 @@ // segment of memory. // Pre stack: retdest -// Post stack: (empty) +// Post stack: txn_rlp_len global read_rlp_to_memory: // stack: retdest @@ -13,21 +13,18 @@ global read_rlp_to_memory: PUSH @SEGMENT_RLP_RAW // ctx == virt == 0 // stack: addr, final_addr, retdest - read_rlp_to_memory_loop: // stack: addr, final_addr, retdest DUP2 DUP2 - EQ - // stack: addr == final_addr, addr, final_addr, retdest + LT + ISZERO + // stack: addr >= final_addr, addr, final_addr, retdest %jumpi(read_rlp_to_memory_finish) - // stack: addr, len, retdest - DUP1 - PROVER_INPUT(rlp) - // stack: byte, addr, addr, final_addr, retdest - MSTORE_GENERAL // stack: addr, final_addr, retdest - %increment + PROVER_INPUT(rlp) + SWAP1 + MSTORE_32BYTES_32 // stack: addr', final_addr, retdest %jump(read_rlp_to_memory_loop) @@ -35,7 +32,7 @@ read_rlp_to_memory_finish: // stack: addr, final_addr, retdest // we recover the offset here PUSH @SEGMENT_RLP_RAW // ctx == virt == 0 - DUP2 SUB + DUP3 SUB // stack: pos, addr, final_addr, retdest %stack(pos, addr, final_addr, retdest) -> (retdest, pos) - JUMP + JUMP \ No newline at end of file diff --git a/evm/src/generation/rlp.rs b/evm/src/generation/rlp.rs index 6a6b4b13..ffc302fd 100644 --- a/evm/src/generation/rlp.rs +++ b/evm/src/generation/rlp.rs @@ -9,8 +9,14 @@ pub(crate) fn all_rlp_prover_inputs_reversed(signed_txn: &[u8]) -> Vec { fn all_rlp_prover_inputs(signed_txn: &[u8]) -> Vec { let mut prover_inputs = vec![]; prover_inputs.push(signed_txn.len().into()); - for &byte in signed_txn { - prover_inputs.push(byte.into()); + let mut chunks = signed_txn.chunks_exact(32); + for bytes in chunks.by_ref() { + prover_inputs.push(U256::from_big_endian(bytes)); + } + let mut last_chunk = chunks.remainder().to_vec(); + if !last_chunk.is_empty() { + last_chunk.extend_from_slice(&vec![0u8; 32 - last_chunk.len()]); + prover_inputs.push(U256::from_big_endian(&last_chunk)); } prover_inputs }