Packed rlp prover inputs (#1460)

* Pack rlp prover inputs

* Fix endianness bug

* Remove debug info and fix clippy
This commit is contained in:
Alonso González 2024-01-12 13:02:32 +01:00 committed by GitHub
parent b119e96f7f
commit 219365d61b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 14 deletions

View File

@ -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

View File

@ -9,8 +9,14 @@ pub(crate) fn all_rlp_prover_inputs_reversed(signed_txn: &[u8]) -> Vec<U256> {
fn all_rlp_prover_inputs(signed_txn: &[u8]) -> Vec<U256> {
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
}