From a90aa40b7a01d5141ed41977c91a4f278ede2eb4 Mon Sep 17 00:00:00 2001 From: Linda Guiga <101227802+LindaGuiga@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:08:47 -0500 Subject: [PATCH] Implement MPT preinitialization (#1406) * Implement MPT preinitialization * Apply comments * Replace GlobalMetadata reads with stores in the kernel * Change memory specs * Remove trie data length as a prover input --- evm/spec/tables/memory.tex | 1 + evm/spec/zkevm.pdf | Bin 294878 -> 292595 bytes evm/src/cpu/kernel/aggregator.rs | 2 - evm/src/cpu/kernel/asm/main.asm | 26 +- evm/src/cpu/kernel/asm/mpt/hash/hash.asm | 234 +++++++++------- .../asm/mpt/hash/hash_trie_specific.asm | 239 +++++++++------- evm/src/cpu/kernel/asm/mpt/load/load.asm | 173 ------------ .../asm/mpt/load/load_trie_specific.asm | 150 ---------- evm/src/cpu/kernel/interpreter.rs | 6 + evm/src/cpu/kernel/tests/account_code.rs | 99 +++++-- evm/src/cpu/kernel/tests/add11.rs | 12 +- evm/src/cpu/kernel/tests/balance.rs | 20 +- evm/src/cpu/kernel/tests/mpt/delete.rs | 14 +- evm/src/cpu/kernel/tests/mpt/hash.rs | 19 +- evm/src/cpu/kernel/tests/mpt/insert.rs | 20 +- evm/src/cpu/kernel/tests/mpt/load.rs | 71 ++--- evm/src/cpu/kernel/tests/mpt/read.rs | 12 +- evm/src/cpu/kernel/tests/receipt.rs | 16 +- evm/src/generation/mod.rs | 7 +- evm/src/generation/mpt.rs | 262 ++++++++++-------- evm/src/generation/prover_input.rs | 19 +- evm/src/generation/state.rs | 40 ++- evm/src/memory/memory_stark.rs | 15 +- evm/src/proof.rs | 3 +- evm/tests/log_opcode.rs | 2 +- 25 files changed, 651 insertions(+), 811 deletions(-) delete mode 100644 evm/src/cpu/kernel/asm/mpt/load/load.asm delete mode 100644 evm/src/cpu/kernel/asm/mpt/load/load_trie_specific.asm diff --git a/evm/spec/tables/memory.tex b/evm/spec/tables/memory.tex index f5cf4b02..e3a19cab 100644 --- a/evm/spec/tables/memory.tex +++ b/evm/spec/tables/memory.tex @@ -76,4 +76,5 @@ By default, all memory is zero-initialized. However, to save numerous writes, we \begin{itemize} \item The read-only kernel code (in segment 0, context 0) is initialized with its correct values. It's checked by hashing the segment and verifying that the hash value matches a verifier-provided one. + \item The ``TrieData'' segment is initialized with the input tries. The stored tries are hashed and checked against the provided initial hash. Note that the length of the segment and the pointers -- within the ``TrieData'' segment -- for the three tries are provided as prover inputs. The length is then checked against a value computed when hashing the tries. \end{itemize} diff --git a/evm/spec/zkevm.pdf b/evm/spec/zkevm.pdf index c6a444447d75c7d1a0bb57711db03d3e3696e72d..0a409abd39bd363d8f4d95789aeaef2808374751 100644 GIT binary patch delta 107877 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 z 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 H$)o)b#g!K~ diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index e7a9069e..63765525 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -122,8 +122,6 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/mpt/insert/insert_extension.asm"), include_str!("asm/mpt/insert/insert_leaf.asm"), include_str!("asm/mpt/insert/insert_trie_specific.asm"), - include_str!("asm/mpt/load/load.asm"), - include_str!("asm/mpt/load/load_trie_specific.asm"), include_str!("asm/mpt/read.asm"), include_str!("asm/mpt/storage/storage_read.asm"), include_str!("asm/mpt/storage/storage_write.asm"), diff --git a/evm/src/cpu/kernel/asm/main.asm b/evm/src/cpu/kernel/asm/main.asm index 0c07c436..b495d499 100644 --- a/evm/src/cpu/kernel/asm/main.asm +++ b/evm/src/cpu/kernel/asm/main.asm @@ -13,15 +13,28 @@ global main: // Initialise the shift table %shift_table_init - - // Second, load all MPT data from the prover. - PUSH hash_initial_tries - %jump(load_all_mpts) + + // Initialize the state, transaction and receipt trie root pointers. + PROVER_INPUT(trie_ptr::state) + %mstore_global_metadata(@GLOBAL_METADATA_STATE_TRIE_ROOT) + PROVER_INPUT(trie_ptr::txn) + %mstore_global_metadata(@GLOBAL_METADATA_TXN_TRIE_ROOT) + PROVER_INPUT(trie_ptr::receipt) + %mstore_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_ROOT) global hash_initial_tries: - %mpt_hash_state_trie %mload_global_metadata(@GLOBAL_METADATA_STATE_TRIE_DIGEST_BEFORE) %assert_eq + // We compute the length of the trie data segment in `mpt_hash` so that we + // can check the value provided by the prover. + // We initialize the segment length with 1 because the segment contains + // the null pointer `0` when the tries are empty. + PUSH 1 + %mpt_hash_state_trie %mload_global_metadata(@GLOBAL_METADATA_STATE_TRIE_DIGEST_BEFORE) %assert_eq + // stack: trie_data_len %mpt_hash_txn_trie %mload_global_metadata(@GLOBAL_METADATA_TXN_TRIE_DIGEST_BEFORE) %assert_eq + // stack: trie_data_len %mpt_hash_receipt_trie %mload_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_DIGEST_BEFORE) %assert_eq + // stack: trie_data_full_len + %mstore_global_metadata(@GLOBAL_METADATA_TRIE_DATA_SIZE) global start_txn: // stack: (empty) @@ -64,7 +77,10 @@ global hash_final_tries: %mload_global_metadata(@GLOBAL_METADATA_BLOCK_GAS_USED_AFTER) %assert_eq DUP3 %mload_global_metadata(@GLOBAL_METADATA_TXN_NUMBER_AFTER) %assert_eq %pop3 + PUSH 1 // initial trie data length %mpt_hash_state_trie %mload_global_metadata(@GLOBAL_METADATA_STATE_TRIE_DIGEST_AFTER) %assert_eq %mpt_hash_txn_trie %mload_global_metadata(@GLOBAL_METADATA_TXN_TRIE_DIGEST_AFTER) %assert_eq %mpt_hash_receipt_trie %mload_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_DIGEST_AFTER) %assert_eq + // We don't need the trie data length here. + POP %jump(halt) diff --git a/evm/src/cpu/kernel/asm/mpt/hash/hash.asm b/evm/src/cpu/kernel/asm/mpt/hash/hash.asm index 88f5bce4..df7e1d74 100644 --- a/evm/src/cpu/kernel/asm/mpt/hash/hash.asm +++ b/evm/src/cpu/kernel/asm/mpt/hash/hash.asm @@ -2,40 +2,45 @@ // // encode_value is a function which should take as input // - the position within @SEGMENT_RLP_RAW to write to, -// - the offset of a value within @SEGMENT_TRIE_DATA, and -// - a return address. +// - the offset of a value within @SEGMENT_TRIE_DATA, +// - a return address, and +// - the current length of @SEGMENT_TRIE_DATA // It should serialize the value, write it to @SEGMENT_RLP_RAW starting at the -// given position, and return an updated position (the next unused offset). +// given position, and return an updated position (the next unused offset) as well +// as an updated length for @SEGMENT_TRIE_DATA. // -// Pre stack: node_ptr, encode_value, retdest -// Post stack: hash +// Given the initial length of the `TrieData` segment, it also updates the length +// for the current trie. +// +// Pre stack: node_ptr, encode_value, cur_len, retdest +// Post stack: hash, new_len global mpt_hash: - // stack: node_ptr, encode_value, retdest - %stack (node_ptr, encode_value) -> (node_ptr, encode_value, mpt_hash_hash_if_rlp) + // stack: node_ptr, encode_value, cur_len, retdest + %stack (node_ptr, encode_value, cur_len) -> (node_ptr, encode_value, cur_len, mpt_hash_hash_if_rlp) %jump(encode_or_hash_node) mpt_hash_hash_if_rlp: - // stack: result, result_len, retdest + // stack: result, result_len, new_len, retdest // If result_len < 32, then we have an RLP blob, and we need to hash it. DUP2 %lt_const(32) %jumpi(mpt_hash_hash_rlp) // Otherwise, we already have a hash, so just return it. - // stack: result, result_len, retdest - %stack (result, result_len, retdest) -> (retdest, result) + // stack: result, result_len, new_len, retdest + %stack (result, result_len, new_len, retdest) -> (retdest, result, new_len) JUMP mpt_hash_hash_rlp: - // stack: result, result_len, retdest - %stack (result, result_len) - // context, segment, offset, value, len, retdest - -> (0, @SEGMENT_RLP_RAW, 0, result, result_len, mpt_hash_hash_rlp_after_unpacking) + // stack: result, result_len, new_len, retdest + %stack (result, result_len, new_len) + // context, segment, offset, value, len, trie_len, retdest + -> (0, @SEGMENT_RLP_RAW, 0, result, result_len, mpt_hash_hash_rlp_after_unpacking, new_len) %jump(mstore_unpacking) mpt_hash_hash_rlp_after_unpacking: - // stack: result_len, retdest + // stack: result_len, new_len, retdest PUSH 0 // offset PUSH @SEGMENT_RLP_RAW // segment PUSH 0 // context - // stack: result_addr: 3, result_len, retdest + // stack: result_addr: 3, result_len, new_len, retdest KECCAK_GENERAL - // stack: hash, retdest - SWAP1 + // stack: hash, new_len, retdest + %stack(hash, new_len, retdest) -> (retdest, hash, new_len) JUMP // Given a trie node, return its RLP encoding if it is is less than 32 bytes, @@ -47,11 +52,11 @@ mpt_hash_hash_rlp_after_unpacking: // Pre stack: node_ptr, encode_value, retdest // Post stack: result, result_len global encode_or_hash_node: - // stack: node_ptr, encode_value, retdest + // stack: node_ptr, encode_value, cur_len, retdest DUP1 %mload_trie_data // Check if we're dealing with a concrete node, i.e. not a hash node. - // stack: node_type, node_ptr, encode_value, retdest + // stack: node_type, node_ptr, encode_value, cur_len, retdest DUP1 PUSH @MPT_NODE_HASH SUB @@ -59,51 +64,54 @@ global encode_or_hash_node: // If we got here, node_type == @MPT_NODE_HASH. // Load the hash and return (hash, 32). - // stack: node_type, node_ptr, encode_value, retdest + // stack: node_type, node_ptr, encode_value, cur_len, retdest POP - // stack: node_ptr, encode_value, retdest + // Update the length of the `TrieData` segment: there are only two + // elements in a hash node. + SWAP2 %add_const(2) SWAP2 + // stack: node_ptr, encode_value, cur_len, retdest %increment // Skip over node type prefix - // stack: hash_ptr, encode_value, retdest + // stack: hash_ptr, encode_value, cur_len, retdest %mload_trie_data - // stack: hash, encode_value, retdest - %stack (hash, encode_value, retdest) -> (retdest, hash, 32) + // stack: hash, encode_value, cur_len, retdest + %stack (hash, encode_value, cur_len, retdest) -> (retdest, hash, 32, cur_len) JUMP encode_or_hash_concrete_node: - %stack (node_type, node_ptr, encode_value) -> (node_type, node_ptr, encode_value, maybe_hash_node) + %stack (node_type, node_ptr, encode_value, cur_len) -> (node_type, node_ptr, encode_value, cur_len, maybe_hash_node) %jump(encode_node) maybe_hash_node: - // stack: result_ptr, result_len, retdest + // stack: result_ptr, result_len, cur_len, retdest DUP2 %lt_const(32) %jumpi(pack_small_rlp) // result_len >= 32, so we hash the result. - // stack: result_ptr, result_len, retdest + // stack: result_ptr, result_len, cur_len, retdest PUSH @SEGMENT_RLP_RAW // segment PUSH 0 // context - // stack: result_addr: 3, result_len, retdest + // stack: result_addr: 3, result_len, cur_len, retdest KECCAK_GENERAL - %stack (hash, retdest) -> (retdest, hash, 32) + %stack (hash, cur_len, retdest) -> (retdest, hash, 32, cur_len) JUMP pack_small_rlp: - // stack: result_ptr, result_len, retdest - %stack (result_ptr, result_len) + // stack: result_ptr, result_len, cur_len, retdest + %stack (result_ptr, result_len, cur_len) -> (0, @SEGMENT_RLP_RAW, result_ptr, result_len, - after_packed_small_rlp, result_len) + after_packed_small_rlp, result_len, cur_len) %jump(mload_packing) after_packed_small_rlp: - %stack (result, result_len, retdest) -> (retdest, result, result_len) + %stack (result, result_len, cur_len, retdest) -> (retdest, result, result_len, cur_len) JUMP // RLP encode the given trie node, and return an (pointer, length) pair // indicating where the data lives within @SEGMENT_RLP_RAW. // -// Pre stack: node_type, node_ptr, encode_value, retdest -// Post stack: result_ptr, result_len +// Pre stack: node_type, node_ptr, encode_value, cur_len, retdest +// Post stack: result_ptr, result_len, cur_len encode_node: - // stack: node_type, node_ptr, encode_value, retdest + // stack: node_type, node_ptr, encode_value, cur_len, retdest // Increment node_ptr, so it points to the node payload instead of its type. SWAP1 %increment SWAP1 - // stack: node_type, node_payload_ptr, encode_value, retdest + // stack: node_type, node_payload_ptr, encode_value, cur_len, retdest DUP1 %eq_const(@MPT_NODE_EMPTY) %jumpi(encode_node_empty) DUP1 %eq_const(@MPT_NODE_BRANCH) %jumpi(encode_node_branch) @@ -115,25 +123,29 @@ encode_node: PANIC global encode_node_empty: - // stack: node_type, node_payload_ptr, encode_value, retdest + // stack: node_type, node_payload_ptr, encode_value, cur_len, retdest + // Then length of `TrieData` is unchanged here. %pop3 - // stack: retdest + // stack: cur_len, retdest // An empty node is encoded as a single byte, 0x80, which is the RLP encoding of the empty string. // TODO: Write this byte just once to RLP memory, then we can always return (0, 1). %alloc_rlp_block - // stack: rlp_pos, retdest + // stack: rlp_pos, cur_len, retdest PUSH 0x80 - // stack: 0x80, rlp_pos, retdest + // stack: 0x80, rlp_pos, cur_len, retdest DUP2 - // stack: rlp_pos, 0x80, rlp_pos, retdest + // stack: rlp_pos, 0x80, rlp_pos, cur_len, retdest %mstore_rlp - %stack (rlp_pos, retdest) -> (retdest, rlp_pos, 1) + %stack (rlp_pos, cur_len, retdest) -> (retdest, rlp_pos, 1, cur_len) JUMP global encode_node_branch: - // stack: node_type, node_payload_ptr, encode_value, retdest + // stack: node_type, node_payload_ptr, encode_value, cur_len, retdest POP - // stack: node_payload_ptr, encode_value, retdest + + // `TrieData` stores the node type, 16 children pointers, and a value pointer. + SWAP2 %add_const(18) SWAP2 + // stack: node_payload_ptr, encode_value, cur_len, retdest // Get the next unused offset within the encoded child buffers. // Then immediately increment the next unused offset by 16, so any @@ -142,8 +154,7 @@ global encode_node_branch: %mload_global_metadata(@GLOBAL_METADATA_TRIE_ENCODED_CHILD_SIZE) DUP1 %add_const(16) %mstore_global_metadata(@GLOBAL_METADATA_TRIE_ENCODED_CHILD_SIZE) - // stack: base_offset, node_payload_ptr, encode_value, retdest - + // stack: base_offset, node_payload_ptr, encode_value, cur_len, retdest // We will call encode_or_hash_node on each child. For the i'th child, we // will store the result in SEGMENT_TRIE_ENCODED_CHILD[base + i], and its length in // SEGMENT_TRIE_ENCODED_CHILD_LEN[base + i]. @@ -151,111 +162,118 @@ global encode_node_branch: %encode_child(4) %encode_child(5) %encode_child(6) %encode_child(7) %encode_child(8) %encode_child(9) %encode_child(10) %encode_child(11) %encode_child(12) %encode_child(13) %encode_child(14) %encode_child(15) - // stack: base_offset, node_payload_ptr, encode_value, retdest + // stack: base_offset, node_payload_ptr, encode_value, cur_len, retdest // Now, append each child to our RLP tape. %alloc_rlp_block DUP1 - // stack: rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest %append_child(0) %append_child(1) %append_child(2) %append_child(3) %append_child(4) %append_child(5) %append_child(6) %append_child(7) %append_child(8) %append_child(9) %append_child(10) %append_child(11) %append_child(12) %append_child(13) %append_child(14) %append_child(15) - // stack: rlp_pos', rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: rlp_pos', rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest %stack (rlp_pos, rlp_start, base_offset, node_payload_ptr) -> (node_payload_ptr, rlp_pos, rlp_start) %add_const(16) - // stack: value_ptr_ptr, rlp_pos', rlp_start, encode_value, retdest + // stack: value_ptr_ptr, rlp_pos', rlp_start, encode_value, cur_len, retdest %mload_trie_data - // stack: value_ptr, rlp_pos', rlp_start, encode_value, retdest + // stack: value_ptr, rlp_pos', rlp_start, encode_value, cur_len, retdest DUP1 %jumpi(encode_node_branch_with_value) // No value; append the empty string (0x80). - // stack: value_ptr, rlp_pos', rlp_start, encode_value, retdest + // stack: value_ptr, rlp_pos', rlp_start, encode_value, cur_len, retdest %stack (value_ptr, rlp_pos, rlp_start, encode_value) -> (rlp_pos, 0x80, rlp_pos, rlp_start) %mstore_rlp - // stack: rlp_pos', rlp_start, retdest + // stack: rlp_pos', rlp_start, cur_len, retdest %increment - // stack: rlp_pos'', rlp_start, retdest + // stack: rlp_pos'', rlp_start, cur_len, retdest %jump(encode_node_branch_prepend_prefix) encode_node_branch_with_value: - // stack: value_ptr, rlp_pos', rlp_start, encode_value, retdest - %stack (value_ptr, rlp_pos, rlp_start, encode_value) - -> (encode_value, rlp_pos, value_ptr, encode_node_branch_prepend_prefix, rlp_start) + // stack: value_ptr, rlp_pos', rlp_start, encode_value, cur_len, retdest + %stack (value_ptr, rlp_pos, rlp_start, encode_value, cur_len) + -> (encode_value, rlp_pos, value_ptr, cur_len, encode_node_branch_after_value, rlp_start) JUMP // call encode_value +encode_node_branch_after_value: + // stack: rlp_pos'', cur_len, rlp_start, retdest + %stack(rlp_pos, cur_len, rlp_start, retdest) -> (rlp_pos, rlp_start, cur_len, retdest) encode_node_branch_prepend_prefix: - // stack: rlp_pos'', rlp_start, retdest + // stack: rlp_pos'', rlp_start, cur_len, retdest %prepend_rlp_list_prefix - // stack: rlp_prefix_start, rlp_len, retdest - %stack (rlp_prefix_start, rlp_len, retdest) - -> (retdest, rlp_prefix_start, rlp_len) + // stack: rlp_prefix_start, rlp_len, cur_len, retdest + %stack (rlp_prefix_start, rlp_len, cur_len, retdest) + -> (retdest, rlp_prefix_start, rlp_len, cur_len) JUMP // Part of the encode_node_branch function. Encodes the i'th child. // Stores the result in SEGMENT_TRIE_ENCODED_CHILD[base + i], and its length in // SEGMENT_TRIE_ENCODED_CHILD_LEN[base + i]. %macro encode_child(i) - // stack: base_offset, node_payload_ptr, encode_value, retdest + // stack: base_offset, node_payload_ptr, encode_value, cur_len, retdest PUSH %%after_encode DUP4 DUP4 - // stack: node_payload_ptr, encode_value, %%after_encode, base_offset, node_payload_ptr, encode_value, retdest + // stack: node_payload_ptr, encode_value, %%after_encode, base_offset, node_payload_ptr, encode_value, cur_len, retdest %add_const($i) %mload_trie_data - // stack: child_i_ptr, encode_value, %%after_encode, base_offset, node_payload_ptr, encode_value, retdest + // stack: child_i_ptr, encode_value, %%after_encode, base_offset, node_payload_ptr, encode_value, cur_len, retdest + %stack(child_i_ptr, encode_value, after_encode, base_offset, node_payload_ptr, encode_value, cur_len) -> (child_i_ptr, encode_value, cur_len, after_encode, base_offset, node_payload_ptr, encode_value) %jump(encode_or_hash_node) %%after_encode: - // stack: result, result_len, base_offset, node_payload_ptr, encode_value, retdest + // stack: result, result_len, cur_len, base_offset, node_payload_ptr, encode_value, retdest + %stack(result, result_len, cur_len, base_offset, node_payload_ptr, encode_value) -> (result, result_len, base_offset, node_payload_ptr, encode_value, cur_len) DUP3 %add_const($i) %mstore_kernel(@SEGMENT_TRIE_ENCODED_CHILD) - // stack: result_len, base_offset, node_payload_ptr, encode_value, retdest + // stack: result_len, base_offset, node_payload_ptr, encode_value, cur_len, retdest DUP2 %add_const($i) %mstore_kernel(@SEGMENT_TRIE_ENCODED_CHILD_LEN) - // stack: base_offset, node_payload_ptr, encode_value, retdest + // stack: base_offset, node_payload_ptr, encode_value, cur_len, retdest %endmacro // Part of the encode_node_branch function. Appends the i'th child's RLP. %macro append_child(i) - // stack: rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest DUP3 %add_const($i) %mload_kernel(@SEGMENT_TRIE_ENCODED_CHILD) // load result DUP4 %add_const($i) %mload_kernel(@SEGMENT_TRIE_ENCODED_CHILD_LEN) // load result_len - // stack: result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest // If result_len != 32, result is raw RLP, with an appropriate RLP prefix already. DUP1 %sub_const(32) %jumpi(%%unpack) // Otherwise, result is a hash, and we need to add the prefix 0x80 + 32 = 160. - // stack: result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest PUSH 160 DUP4 // rlp_pos %mstore_rlp SWAP2 %increment SWAP2 // rlp_pos += 1 %%unpack: - %stack (result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, retdest) + %stack (result_len, result, rlp_pos, rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest) -> (rlp_pos, result, result_len, %%after_unpacking, - rlp_start, base_offset, node_payload_ptr, encode_value, retdest) + rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest) %jump(mstore_unpacking_rlp) %%after_unpacking: - // stack: rlp_pos', rlp_start, base_offset, node_payload_ptr, encode_value, retdest + // stack: rlp_pos', rlp_start, base_offset, node_payload_ptr, encode_value, cur_len, retdest %endmacro global encode_node_extension: - // stack: node_type, node_payload_ptr, encode_value, retdest - %stack (node_type, node_payload_ptr, encode_value) - -> (node_payload_ptr, encode_value, encode_node_extension_after_encode_child, node_payload_ptr) + // stack: node_type, node_payload_ptr, encode_value, cur_len, retdest + SWAP3 %add_const(4) SWAP3 + %stack (node_type, node_payload_ptr, encode_value, cur_len) + -> (node_payload_ptr, encode_value, cur_len, encode_node_extension_after_encode_child, node_payload_ptr) %add_const(2) %mload_trie_data - // stack: child_ptr, encode_value, encode_node_extension_after_encode_child, node_payload_ptr, retdest + // stack: child_ptr, encode_value, cur_len, encode_node_extension_after_encode_child, node_payload_ptr, retdest %jump(encode_or_hash_node) encode_node_extension_after_encode_child: - // stack: result, result_len, node_payload_ptr, retdest + // stack: result, result_len, cur_len, node_payload_ptr, retdest + %stack (result, result_len, cur_len, node_payload_ptr) -> (result, result_len, node_payload_ptr, cur_len) %alloc_rlp_block - // stack: rlp_start, result, result_len, node_payload_ptr, retdest + // stack: rlp_start, result, result_len, node_payload_ptr, cur_len, retdest PUSH encode_node_extension_after_hex_prefix // retdest PUSH 0 // terminated - // stack: terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, retdest + // stack: terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, cur_len, retdest DUP6 %increment %mload_trie_data // Load the packed_nibbles field, which is at index 1. - // stack: packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, retdest + // stack: packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, cur_len, retdest DUP7 %mload_trie_data // Load the num_nibbles field, which is at index 0. - // stack: num_nibbles, packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, retdest + // stack: num_nibbles, packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, cur_len, retdest DUP5 - // stack: rlp_start, num_nibbles, packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, retdest + // stack: rlp_start, num_nibbles, packed_nibbles, terminated, encode_node_extension_after_hex_prefix, rlp_start, result, result_len, node_payload_ptr, cur_len, retdest %jump(hex_prefix_rlp) encode_node_extension_after_hex_prefix: - // stack: rlp_pos, rlp_start, result, result_len, node_payload_ptr, retdest + // stack: rlp_pos, rlp_start, result, result_len, node_payload_ptr, cur_len, retdest // If result_len != 32, result is raw RLP, with an appropriate RLP prefix already. DUP4 %sub_const(32) %jumpi(encode_node_extension_unpack) // Otherwise, result is a hash, and we need to add the prefix 0x80 + 32 = 160. @@ -264,44 +282,50 @@ encode_node_extension_after_hex_prefix: %mstore_rlp %increment // rlp_pos += 1 encode_node_extension_unpack: - %stack (rlp_pos, rlp_start, result, result_len, node_payload_ptr) - -> (rlp_pos, result, result_len, encode_node_extension_after_unpacking, rlp_start) + %stack (rlp_pos, rlp_start, result, result_len, node_payload_ptr, cur_len) + -> (rlp_pos, result, result_len, encode_node_extension_after_unpacking, rlp_start, cur_len) %jump(mstore_unpacking_rlp) encode_node_extension_after_unpacking: - // stack: rlp_pos, rlp_start, retdest + // stack: rlp_pos, rlp_start, cur_len, retdest %prepend_rlp_list_prefix - %stack (rlp_prefix_start_pos, rlp_len, retdest) - -> (retdest, rlp_prefix_start_pos, rlp_len) + %stack (rlp_prefix_start_pos, rlp_len, cur_len, retdest) + -> (retdest, rlp_prefix_start_pos, rlp_len, cur_len) JUMP global encode_node_leaf: - // stack: node_type, node_payload_ptr, encode_value, retdest + // stack: node_type, node_payload_ptr, encode_value, cur_len, retdest + // `TrieData` holds the node type, the number of nibbles, the nibbles, + // the pointer to the value and the value. + // First, we add 4 for the node type, the number of nibbles, the nibbles + // and the pointer to the value. + SWAP3 %add_const(4) SWAP3 POP - // stack: node_payload_ptr, encode_value, retdest + // stack: node_payload_ptr, encode_value, cur_len, retdest %alloc_rlp_block PUSH encode_node_leaf_after_hex_prefix // retdest PUSH 1 // terminated - // stack: terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, retdest + // stack: terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, cur_len, retdest DUP4 %increment %mload_trie_data // Load the packed_nibbles field, which is at index 1. - // stack: packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, retdest + // stack: packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, cur_len, retdest DUP5 %mload_trie_data // Load the num_nibbles field, which is at index 0. - // stack: num_nibbles, packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, retdest + // stack: num_nibbles, packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, cur_len, retdest DUP5 - // stack: rlp_start, num_nibbles, packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, retdest + // stack: rlp_start, num_nibbles, packed_nibbles, terminated, encode_node_leaf_after_hex_prefix, rlp_start, node_payload_ptr, encode_value, cur_len, retdest %jump(hex_prefix_rlp) encode_node_leaf_after_hex_prefix: - // stack: rlp_pos, rlp_start, node_payload_ptr, encode_value, retdest + // stack: rlp_pos, rlp_start, node_payload_ptr, encode_value, cur_len, retdest SWAP2 %add_const(2) // The value pointer starts at index 3, after num_nibbles and packed_nibbles. - // stack: value_ptr_ptr, rlp_start, rlp_pos, encode_value, retdest + // stack: value_ptr_ptr, rlp_start, rlp_pos, encode_value, cur_len, retdest %mload_trie_data - // stack: value_ptr, rlp_start, rlp_pos, encode_value, retdest - %stack (value_ptr, rlp_start, rlp_pos, encode_value, retdest) - -> (encode_value, rlp_pos, value_ptr, encode_node_leaf_after_encode_value, rlp_start, retdest) + // stack: value_ptr, rlp_start, rlp_pos, encode_value, cur_len, retdest + %stack (value_ptr, rlp_start, rlp_pos, encode_value, cur_len, retdest) + -> (encode_value, rlp_pos, value_ptr, cur_len, encode_node_leaf_after_encode_value, rlp_start, retdest) JUMP encode_node_leaf_after_encode_value: - // stack: rlp_end_pos, rlp_start, retdest + // stack: rlp_end_pos, cur_len, rlp_start, retdest + %stack(rlp_end_pos, cur_len, rlp_start, retdest) -> (rlp_end_pos, rlp_start, cur_len, retdest) %prepend_rlp_list_prefix - %stack (rlp_prefix_start_pos, rlp_len, retdest) - -> (retdest, rlp_prefix_start_pos, rlp_len) + %stack (rlp_prefix_start_pos, rlp_len, cur_len, retdest) + -> (retdest, rlp_prefix_start_pos, rlp_len, cur_len) JUMP diff --git a/evm/src/cpu/kernel/asm/mpt/hash/hash_trie_specific.asm b/evm/src/cpu/kernel/asm/mpt/hash/hash_trie_specific.asm index e5734f80..2ffefb7d 100644 --- a/evm/src/cpu/kernel/asm/mpt/hash/hash_trie_specific.asm +++ b/evm/src/cpu/kernel/asm/mpt/hash/hash_trie_specific.asm @@ -1,116 +1,138 @@ // Hashing logic specific to a particular trie. global mpt_hash_state_trie: - // stack: retdest + // stack: cur_len, retdest PUSH encode_account %mload_global_metadata(@GLOBAL_METADATA_STATE_TRIE_ROOT) - // stack: node_ptr, encode_account, retdest + // stack: node_ptr, encode_account, cur_len, retdest %jump(mpt_hash) %macro mpt_hash_state_trie + // stack: cur_len PUSH %%after + SWAP1 %jump(mpt_hash_state_trie) %%after: %endmacro global mpt_hash_storage_trie: - // stack: node_ptr, retdest - %stack (node_ptr) -> (node_ptr, encode_storage_value) + // stack: node_ptr, cur_len, retdest + %stack (node_ptr, cur_len) -> (node_ptr, encode_storage_value, cur_len) %jump(mpt_hash) %macro mpt_hash_storage_trie - %stack (node_ptr) -> (node_ptr, %%after) + %stack (node_ptr, cur_len) -> (node_ptr, cur_len, %%after) %jump(mpt_hash_storage_trie) %%after: %endmacro global mpt_hash_txn_trie: - // stack: retdest + // stack: cur_len, retdest PUSH encode_txn %mload_global_metadata(@GLOBAL_METADATA_TXN_TRIE_ROOT) - // stack: node_ptr, encode_txn, retdest + // stack: node_ptr, encode_txn, cur_len, retdest %jump(mpt_hash) %macro mpt_hash_txn_trie + // stack: cur_len PUSH %%after + SWAP1 %jump(mpt_hash_txn_trie) %%after: %endmacro global mpt_hash_receipt_trie: - // stack: retdest + // stack: cur_len, retdest PUSH encode_receipt %mload_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_ROOT) - // stack: node_ptr, encode_receipt, retdest + // stack: node_ptr, encode_receipt, cur_len, retdest %jump(mpt_hash) %macro mpt_hash_receipt_trie + // stack: cur_len PUSH %%after + SWAP1 %jump(mpt_hash_receipt_trie) %%after: %endmacro global encode_account: - // stack: rlp_pos, value_ptr, retdest + // stack: rlp_pos, value_ptr, cur_len, retdest // First, we compute the length of the RLP data we're about to write. + // We also update the length of the trie data segment. // The nonce and balance fields are variable-length, so we need to load them // to determine their contribution, while the other two fields are fixed // 32-bytes integers. + + // First, we add 4 to the trie data length, for the nonce, + // the balance, the storage pointer and the code hash. + SWAP2 %add_const(4) SWAP2 + + // Now, we start the encoding. + // stack: rlp_pos, value_ptr, cur_len, retdest DUP2 %mload_trie_data // nonce = value[0] %rlp_scalar_len - // stack: nonce_rlp_len, rlp_pos, value_ptr, retdest + // stack: nonce_rlp_len, rlp_pos, value_ptr, cur_len, retdest DUP3 %increment %mload_trie_data // balance = value[1] %rlp_scalar_len - // stack: balance_rlp_len, nonce_rlp_len, rlp_pos, value_ptr, retdest + // stack: balance_rlp_len, nonce_rlp_len, rlp_pos, value_ptr, cur_len, retdest PUSH 66 // storage_root and code_hash fields each take 1 + 32 bytes ADD ADD - // stack: payload_len, rlp_pos, value_ptr, retdest + // stack: payload_len, rlp_pos, value_ptr, cur_len, retdest SWAP1 - // stack: rlp_pos, payload_len, value_ptr, retdest + // stack: rlp_pos, payload_len, value_ptr, cur_len, retdest DUP2 %rlp_list_len - // stack: list_len, rlp_pos, payload_len, value_ptr, retdest + // stack: list_len, rlp_pos, payload_len, value_ptr, cur_len, retdest SWAP1 - // stack: rlp_pos, list_len, payload_len, value_ptr, retdest + // stack: rlp_pos, list_len, payload_len, value_ptr, cur_len, retdest %encode_rlp_multi_byte_string_prefix - // stack: rlp_pos_2, payload_len, value_ptr, retdest + // stack: rlp_pos_2, payload_len, value_ptr, cur_len, retdest %encode_rlp_list_prefix - // stack: rlp_pos_3, value_ptr, retdest + // stack: rlp_pos_3, value_ptr, cur_len, retdest DUP2 %mload_trie_data // nonce = value[0] - // stack: nonce, rlp_pos_3, value_ptr, retdest + // stack: nonce, rlp_pos_3, value_ptr, cur_len, retdest SWAP1 %encode_rlp_scalar - // stack: rlp_pos_4, value_ptr, retdest + // stack: rlp_pos_4, value_ptr, cur_len, retdest DUP2 %increment %mload_trie_data // balance = value[1] - // stack: balance, rlp_pos_4, value_ptr, retdest + // stack: balance, rlp_pos_4, value_ptr, cur_len, retdest SWAP1 %encode_rlp_scalar - // stack: rlp_pos_5, value_ptr, retdest - DUP2 %add_const(2) %mload_trie_data // storage_root_ptr = value[2] - // stack: storage_root_ptr, rlp_pos_5, value_ptr, retdest + // stack: rlp_pos_5, value_ptr, cur_len, retdest + DUP3 + DUP3 %add_const(2) %mload_trie_data // storage_root_ptr = value[2] + // stack: storage_root_ptr, cur_len, rlp_pos_5, value_ptr, cur_len, retdest + + // Hash storage trie. %mpt_hash_storage_trie - // stack: storage_root_digest, rlp_pos_5, value_ptr, retdest - SWAP1 %encode_rlp_256 - // stack: rlp_pos_6, value_ptr, retdest + // stack: storage_root_digest, new_len, rlp_pos_5, value_ptr, cur_len, retdest + %stack(storage_root_digest, new_len, rlp_pos_five, value_ptr, cur_len) -> (rlp_pos_five, storage_root_digest, value_ptr, new_len) + %encode_rlp_256 + // stack: rlp_pos_6, value_ptr, new_len, retdest SWAP1 %add_const(3) %mload_trie_data // code_hash = value[3] - // stack: code_hash, rlp_pos_6, retdest + // stack: code_hash, rlp_pos_6, new_len, retdest SWAP1 %encode_rlp_256 - // stack: rlp_pos_7, retdest - SWAP1 + // stack: rlp_pos_7, new_len, retdest + %stack(rlp_pos_7, new_len, retdest) -> (retdest, rlp_pos_7, new_len) JUMP global encode_txn: - // stack: rlp_pos, value_ptr, retdest + // stack: rlp_pos, value_ptr, cur_len, retdest // Load the txn_rlp_len which is at the beginning of value_ptr DUP2 %mload_trie_data - // stack: txn_rlp_len, rlp_pos, value_ptr, retdest + // stack: txn_rlp_len, rlp_pos, value_ptr, cur_len, retdest + // We need to add 1+txn_rlp_len to the length of the trie data. + SWAP3 DUP4 %increment ADD + // stack: new_len, rlp_pos, value_ptr, txn_rlp_len, retdest + SWAP3 SWAP2 %increment - // stack: txn_rlp_ptr=value_ptr+1, rlp_pos, txn_rlp_len, retdest + // stack: txn_rlp_ptr=value_ptr+1, rlp_pos, txn_rlp_len, new_len, retdest %stack (txn_rlp_ptr, rlp_pos, txn_rlp_len) -> (rlp_pos, txn_rlp_len, txn_rlp_len, txn_rlp_ptr) // Encode the txn rlp prefix - // stack: rlp_pos, txn_rlp_len, txn_rlp_len, txn_rlp_ptr, retdest + // stack: rlp_pos, txn_rlp_len, txn_rlp_len, txn_rlp_ptr, cur_len, retdest %encode_rlp_multi_byte_string_prefix // copy txn_rlp to the new block - // stack: rlp_pos, txn_rlp_len, txn_rlp_ptr, retdest + // stack: rlp_pos, txn_rlp_len, txn_rlp_ptr, new_len, retdest %stack (rlp_pos, txn_rlp_len, txn_rlp_ptr) -> ( 0, @SEGMENT_RLP_RAW, rlp_pos, // dest addr 0, @SEGMENT_TRIE_DATA, txn_rlp_ptr, // src addr. Kernel has context 0 @@ -118,155 +140,176 @@ global encode_txn: txn_rlp_len, rlp_pos) %memcpy_bytes ADD - // stack new_rlp_pos, retdest - SWAP1 + // stack new_rlp_pos, new_len, retdest + %stack(new_rlp_pos, new_len, retdest) -> (retdest, new_rlp_pos, new_len) JUMP // We assume a receipt in memory is stored as: // [payload_len, status, cum_gas_used, bloom, logs_payload_len, num_logs, [logs]]. // A log is [payload_len, address, num_topics, [topics], data_len, [data]]. global encode_receipt: - // stack: rlp_pos, value_ptr, retdest + // stack: rlp_pos, value_ptr, cur_len, retdest + // First, we add 261 to the trie data length for all values before the logs besides the type. + // These are: the payload length, the status, cum_gas_used, the bloom filter (256 elements), + // the length of the logs payload and the length of the logs. + SWAP2 %add_const(261) SWAP2 // There is a double encoding! What we compute is: // either RLP(RLP(receipt)) for Legacy transactions or RLP(txn_type||RLP(receipt)) for transactions of type 1 or 2. // First encode the wrapper prefix. DUP2 %mload_trie_data - // stack: first_value, rlp_pos, value_ptr, retdest + // stack: first_value, rlp_pos, value_ptr, cur_len, retdest // The first value is either the transaction type or the payload length. // Since the receipt contains at least the 256-bytes long bloom filter, payload_len > 3. DUP1 %lt_const(3) %jumpi(encode_nonzero_receipt_type) // If we are here, then the first byte is the payload length. %rlp_list_len - // stack: rlp_receipt_len, rlp_pos, value_ptr, retdest + // stack: rlp_receipt_len, rlp_pos, value_ptr, cur_len, retdest SWAP1 %encode_rlp_multi_byte_string_prefix - // stack: rlp_pos, value_ptr, retdest + // stack: rlp_pos, value_ptr, cur_len, retdest encode_receipt_after_type: - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest // Then encode the receipt prefix. // `payload_ptr` is either `value_ptr` or `value_ptr+1`, depending on the transaction type. DUP2 %mload_trie_data - // stack: payload_len, rlp_pos, payload_len_ptr, retdest + // stack: payload_len, rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_list_prefix - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest // Encode status. DUP2 %increment %mload_trie_data - // stack: status, rlp_pos, payload_len_ptr, retdest + // stack: status, rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_scalar - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest // Encode cum_gas_used. DUP2 %add_const(2) %mload_trie_data - // stack: cum_gas_used, rlp_pos, payload_len_ptr, retdest + // stack: cum_gas_used, rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_scalar - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest // Encode bloom. PUSH 256 // Bloom length. DUP3 %add_const(3) PUSH @SEGMENT_TRIE_DATA PUSH 0 // MPT src address. DUP5 - // stack: rlp_pos, SRC, 256, rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, SRC, 256, rlp_pos, payload_len_ptr, cur_len, retdest %encode_rlp_string - // stack: rlp_pos, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, old_rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 POP - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest // Encode logs prefix. DUP2 %add_const(259) %mload_trie_data - // stack: logs_payload_len, rlp_pos, payload_len_ptr, retdest + // stack: logs_payload_len, rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_list_prefix - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len, retdest DUP2 %add_const(261) - // stack: logs_ptr, rlp_pos, payload_len_ptr, retdest + // stack: logs_ptr, rlp_pos, payload_len_ptr, cur_len, retdest DUP3 %add_const(260) %mload_trie_data - // stack: num_logs, logs_ptr, rlp_pos, payload_len_ptr, retdest + // stack: num_logs, logs_ptr, rlp_pos, payload_len_ptr, cur_len, retdest PUSH 0 encode_receipt_logs_loop: - // stack: i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, cur_len, retdest DUP2 DUP2 EQ - // stack: i == num_logs, i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: i == num_logs, i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, cur_len, retdest %jumpi(encode_receipt_end) - // stack: i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, retdest + // We add 4 to the trie data length for the fixed size elements in the current log. + SWAP5 %add_const(4) SWAP5 + // stack: i, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, cur_len, retdest DUP3 DUP5 - // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest // Encode log prefix. DUP2 %mload_trie_data - // stack: payload_len, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: payload_len, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_list_prefix - // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest // Encode address. DUP2 %increment %mload_trie_data - // stack: address, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: address, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest SWAP1 %encode_rlp_160 - // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest DUP2 %add_const(2) %mload_trie_data - // stack: num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest // Encode topics prefix. DUP1 %mul_const(33) - // stack: topics_payload_len, num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: topics_payload_len, num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest DUP3 %encode_rlp_list_prefix - // stack: new_rlp_pos, num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: new_rlp_pos, num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest SWAP2 POP - // stack: num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len, retdest + + // Add `num_topics` to the length of the trie data segment. + DUP1 SWAP9 + // stack: cur_len, num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, num_topics, retdest + ADD SWAP8 + + // stack: num_topics, rlp_pos, current_log_ptr, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest SWAP2 %add_const(3) - // stack: topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest PUSH 0 encode_receipt_topics_loop: - // stack: j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest DUP4 DUP2 EQ - // stack: j == num_topics, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: j == num_topics, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest %jumpi(encode_receipt_topics_end) - // stack: j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest DUP2 DUP2 ADD %mload_trie_data - // stack: current_topic, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: current_topic, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest DUP4 - // stack: rlp_pos, current_topic, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, current_topic, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest %encode_rlp_256 - // stack: new_rlp_pos, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: new_rlp_pos, j, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest SWAP3 POP - // stack: j, topics_ptr, new_rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: j, topics_ptr, new_rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest %increment %jump(encode_receipt_topics_loop) encode_receipt_topics_end: - // stack: num_topics, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: num_topics, topics_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest ADD - // stack: data_len_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: data_len_ptr, rlp_pos, num_topics, i, num_logs, current_log_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest SWAP5 POP - // stack: rlp_pos, num_topics, i, num_logs, data_len_ptr, old_rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, num_topics, i, num_logs, data_len_ptr, old_rlp_pos, payload_len_ptr, cur_len', retdest SWAP5 POP - // stack: num_topics, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, retdest + // stack: num_topics, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, cur_len', retdest POP - // stack: i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, retdest + // stack: i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, cur_len', retdest // Encode data prefix. DUP3 %mload_trie_data - // stack: data_len, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, retdest + // stack: data_len, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, cur_len', retdest + + // Add `data_len` to the length of the trie data. + DUP1 SWAP7 ADD SWAP6 + + // stack: data_len, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest DUP4 %increment DUP2 ADD - // stack: next_log_ptr, data_len, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, retdest + // stack: next_log_ptr, data_len, i, num_logs, data_len_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest SWAP4 %increment - // stack: data_ptr, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: data_ptr, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest PUSH @SEGMENT_TRIE_DATA PUSH 0 - // stack: SRC, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: SRC, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest DUP8 - // stack: rlp_pos, SRC, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, SRC, data_len, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest %encode_rlp_string - // stack: new_rlp_pos, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: new_rlp_pos, i, num_logs, next_log_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest SWAP4 POP - // stack: i, num_logs, next_log_ptr, new_rlp_pos, payload_len_ptr, retdest + // stack: i, num_logs, next_log_ptr, new_rlp_pos, payload_len_ptr, cur_len'', retdest %increment %jump(encode_receipt_logs_loop) encode_receipt_end: - // stack: num_logs, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, retdest + // stack: num_logs, num_logs, current_log_ptr, rlp_pos, payload_len_ptr, cur_len'', retdest %pop3 - // stack: rlp_pos, payload_len_ptr, retdest + // stack: rlp_pos, payload_len_ptr, cur_len'', retdest SWAP1 POP - // stack: rlp_pos, retdest - SWAP1 + // stack: rlp_pos, cur_len'', retdest + %stack(rlp_pos, new_len, retdest) -> (retdest, rlp_pos, new_len) JUMP encode_nonzero_receipt_type: - // stack: txn_type, rlp_pos, value_ptr, retdest + // stack: txn_type, rlp_pos, value_ptr, cur_len, retdest + // We have a nonlegacy receipt, so the type is also stored in the trie data segment. + SWAP3 %increment SWAP3 + // stack: txn_type, rlp_pos, value_ptr, cur_len, retdest DUP3 %increment %mload_trie_data // stack: payload_len, txn_type, rlp_pos, value_ptr, retdest // The transaction type is encoded in 1 byte @@ -285,15 +328,19 @@ encode_nonzero_receipt_type: %jump(encode_receipt_after_type) global encode_storage_value: - // stack: rlp_pos, value_ptr, retdest + // stack: rlp_pos, value_ptr, cur_len, retdest SWAP1 %mload_trie_data SWAP1 - // stack: rlp_pos, value, retdest + + // A storage value is a scalar, so we only need to add 1 to the trie data length. + SWAP2 %increment SWAP2 + + // stack: rlp_pos, value, cur_len, retdest // The YP says storage trie is a map "... to the RLP-encoded 256-bit integer values" // which seems to imply that this should be %encode_rlp_256. But %encode_rlp_scalar // causes the tests to pass, so it seems storage values should be treated as variable- // length after all. %doubly_encode_rlp_scalar - // stack: rlp_pos', retdest - SWAP1 + // stack: rlp_pos', cur_len, retdest + %stack (rlp_pos, cur_len, retdest) -> (retdest, rlp_pos, cur_len) JUMP diff --git a/evm/src/cpu/kernel/asm/mpt/load/load.asm b/evm/src/cpu/kernel/asm/mpt/load/load.asm deleted file mode 100644 index d787074b..00000000 --- a/evm/src/cpu/kernel/asm/mpt/load/load.asm +++ /dev/null @@ -1,173 +0,0 @@ -// Load all partial trie data from prover inputs. -global load_all_mpts: - // stack: retdest - // First set @GLOBAL_METADATA_TRIE_DATA_SIZE = 1. - // We don't want it to start at 0, as we use 0 as a null pointer. - PUSH 1 - %set_trie_data_size - - %load_mpt(mpt_load_state_trie_value) %mstore_global_metadata(@GLOBAL_METADATA_STATE_TRIE_ROOT) - %load_mpt(mpt_load_txn_trie_value) %mstore_global_metadata(@GLOBAL_METADATA_TXN_TRIE_ROOT) - %load_mpt(mpt_load_receipt_trie_value) %mstore_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_ROOT) - - // stack: retdest - JUMP - -// Load an MPT from prover inputs. -// Pre stack: load_value, retdest -// Post stack: node_ptr -global load_mpt: - // stack: load_value, retdest - PROVER_INPUT(mpt) - // stack: node_type, load_value, retdest - - DUP1 %eq_const(@MPT_NODE_EMPTY) %jumpi(load_mpt_empty) - DUP1 %eq_const(@MPT_NODE_BRANCH) %jumpi(load_mpt_branch) - DUP1 %eq_const(@MPT_NODE_EXTENSION) %jumpi(load_mpt_extension) - DUP1 %eq_const(@MPT_NODE_LEAF) %jumpi(load_mpt_leaf) - DUP1 %eq_const(@MPT_NODE_HASH) %jumpi(load_mpt_digest) - PANIC // Invalid node type - -load_mpt_empty: - // TRIE_DATA[0] = 0, and an empty node has type 0, so we can simply return the null pointer. - %stack (node_type, load_value, retdest) -> (retdest, 0) - JUMP - -load_mpt_branch: - // stack: node_type, load_value, retdest - %get_trie_data_size - // stack: node_ptr, node_type, load_value, retdest - SWAP1 %append_to_trie_data - // stack: node_ptr, load_value, retdest - // Save the offset of our 16 child pointers so we can write them later. - // Then advance our current trie pointer beyond them, so we can load the - // value and have it placed after our child pointers. - %get_trie_data_size - // stack: children_ptr, node_ptr, load_value, retdest - DUP1 %add_const(17) // Skip over 16 children plus the value pointer - // stack: end_of_branch_ptr, children_ptr, node_ptr, load_value, retdest - DUP1 %set_trie_data_size - // Now the top of the stack points to where the branch node will end and the - // value will begin, if there is a value. But we need to ask the prover if a - // value is present, and point to null if not. - // stack: end_of_branch_ptr, children_ptr, node_ptr, load_value, retdest - PROVER_INPUT(mpt) - // stack: is_value_present, end_of_branch_ptr, children_ptr, node_ptr, load_value, retdest - %jumpi(load_mpt_branch_value_present) - // There is no value present, so value_ptr = null. - %stack (end_of_branch_ptr) -> (0) - // stack: value_ptr, children_ptr, node_ptr, load_value, retdest - %jump(load_mpt_branch_after_load_value) -load_mpt_branch_value_present: - // stack: value_ptr, children_ptr, node_ptr, load_value, retdest - PUSH load_mpt_branch_after_load_value - DUP5 // load_value - JUMP -load_mpt_branch_after_load_value: - // stack: value_ptr, children_ptr, node_ptr, load_value, retdest - SWAP1 - // stack: children_ptr, value_ptr, node_ptr, load_value, retdest - - // Load the 16 children. - %rep 16 - DUP4 // load_value - %load_mpt - // stack: child_ptr, next_child_ptr_ptr, value_ptr, node_ptr, load_value, retdest - DUP2 - // stack: next_child_ptr_ptr, child_ptr, next_child_ptr_ptr, value_ptr, node_ptr, load_value, retdest - %mstore_trie_data - // stack: next_child_ptr_ptr, value_ptr, node_ptr, load_value, retdest - %increment - // stack: next_child_ptr_ptr, value_ptr, node_ptr, load_value, retdest - %endrep - - // stack: value_ptr_ptr, value_ptr, node_ptr, load_value, retdest - %mstore_trie_data - %stack (node_ptr, load_value, retdest) -> (retdest, node_ptr) - JUMP - -load_mpt_extension: - // stack: node_type, load_value, retdest - %get_trie_data_size - // stack: node_ptr, node_type, load_value, retdest - SWAP1 %append_to_trie_data - // stack: node_ptr, load_value, retdest - PROVER_INPUT(mpt) // read num_nibbles - %append_to_trie_data - PROVER_INPUT(mpt) // read packed_nibbles - %append_to_trie_data - // stack: node_ptr, load_value, retdest - - %get_trie_data_size - // stack: child_ptr_ptr, node_ptr, load_value, retdest - // Increment trie_data_size, to leave room for child_ptr_ptr, before we load our child. - DUP1 %increment %set_trie_data_size - %stack (child_ptr_ptr, node_ptr, load_value, retdest) - -> (load_value, load_mpt_extension_after_load_mpt, - child_ptr_ptr, retdest, node_ptr) - %jump(load_mpt) -load_mpt_extension_after_load_mpt: - // stack: child_ptr, child_ptr_ptr, retdest, node_ptr - SWAP1 %mstore_trie_data - // stack: retdest, node_ptr - JUMP - -load_mpt_leaf: - // stack: node_type, load_value, retdest - %get_trie_data_size - // stack: node_ptr, node_type, load_value, retdest - SWAP1 %append_to_trie_data - // stack: node_ptr, load_value, retdest - PROVER_INPUT(mpt) // read num_nibbles - %append_to_trie_data - PROVER_INPUT(mpt) // read packed_nibbles - %append_to_trie_data - // stack: node_ptr, load_value, retdest - // We save value_ptr_ptr = get_trie_data_size, then increment trie_data_size - // to skip over the slot for value_ptr_ptr. We will write to value_ptr_ptr - // after the load_value call. - %get_trie_data_size - // stack: value_ptr_ptr, node_ptr, load_value, retdest - DUP1 %increment - // stack: value_ptr, value_ptr_ptr, node_ptr, load_value, retdest - DUP1 %set_trie_data_size - // stack: value_ptr, value_ptr_ptr, node_ptr, load_value, retdest - %stack (value_ptr, value_ptr_ptr, node_ptr, load_value, retdest) - -> (load_value, load_mpt_leaf_after_load_value, - value_ptr_ptr, value_ptr, retdest, node_ptr) - JUMP -load_mpt_leaf_after_load_value: - // stack: value_ptr_ptr, value_ptr, retdest, node_ptr - %mstore_trie_data - // stack: retdest, node_ptr - JUMP - -load_mpt_digest: - // stack: node_type, load_value, retdest - %get_trie_data_size - // stack: node_ptr, node_type, load_value, retdest - SWAP1 %append_to_trie_data - // stack: node_ptr, load_value, retdest - PROVER_INPUT(mpt) // read digest - %append_to_trie_data - %stack (node_ptr, load_value, retdest) -> (retdest, node_ptr) - JUMP - -// Convenience macro to call load_mpt and return where we left off. -// Pre stack: load_value -// Post stack: node_ptr -%macro load_mpt - %stack (load_value) -> (load_value, %%after) - %jump(load_mpt) -%%after: -%endmacro - -// Convenience macro to call load_mpt and return where we left off. -// Pre stack: (empty) -// Post stack: node_ptr -%macro load_mpt(load_value) - PUSH %%after - PUSH $load_value - %jump(load_mpt) -%%after: -%endmacro diff --git a/evm/src/cpu/kernel/asm/mpt/load/load_trie_specific.asm b/evm/src/cpu/kernel/asm/mpt/load/load_trie_specific.asm deleted file mode 100644 index 92471fd8..00000000 --- a/evm/src/cpu/kernel/asm/mpt/load/load_trie_specific.asm +++ /dev/null @@ -1,150 +0,0 @@ -global mpt_load_state_trie_value: - // stack: retdest - - // Load and append the nonce and balance. - PROVER_INPUT(mpt) %append_to_trie_data - PROVER_INPUT(mpt) %append_to_trie_data - - // Now increment the trie data size by 2, to leave room for our storage trie - // pointer and code hash fields, before calling load_mpt which will append - // our storage trie data. - %get_trie_data_size - // stack: storage_trie_ptr_ptr, retdest - DUP1 %add_const(2) - // stack: storage_trie_ptr, storage_trie_ptr_ptr, retdest - %set_trie_data_size - // stack: storage_trie_ptr_ptr, retdest - - %load_mpt(mpt_load_storage_trie_value) - // stack: storage_trie_ptr, storage_trie_ptr_ptr, retdest - DUP2 %mstore_trie_data - // stack: storage_trie_ptr_ptr, retdest - %increment - // stack: code_hash_ptr, retdest - PROVER_INPUT(mpt) - // stack: code_hash, code_hash_ptr, retdest - SWAP1 %mstore_trie_data - // stack: retdest - JUMP - -global mpt_load_txn_trie_value: - // stack: retdest - PROVER_INPUT(mpt) - // stack: rlp_len, retdest - // The first element is the rlp length - DUP1 %append_to_trie_data - PUSH 0 - -mpt_load_loop: - // stack: i, rlp_len, retdest - DUP2 DUP2 EQ %jumpi(mpt_load_end) - PROVER_INPUT(mpt) %append_to_trie_data - %increment - %jump(mpt_load_loop) - -mpt_load_end: - // stack: i, rlp_len, retdest - %pop2 - JUMP - -global mpt_load_receipt_trie_value: - // stack: retdest - // Load first byte. It is either `payload_len` or the transaction type. - PROVER_INPUT(mpt) DUP1 %append_to_trie_data - // If the first byte is less than 3, then it is the transaction type, equal to either 1 or 2. - // In that case, we still need to load the payload length. - %lt_const(3) %jumpi(mpt_load_payload_len) - -mpt_load_after_type: - // Load status. - PROVER_INPUT(mpt) %append_to_trie_data - // Load cum_gas_used. - PROVER_INPUT(mpt) %append_to_trie_data - // Load bloom. - %rep 256 - PROVER_INPUT(mpt) %append_to_trie_data - %endrep - // Load logs_payload_len. - PROVER_INPUT(mpt) %append_to_trie_data - // Load num_logs. - PROVER_INPUT(mpt) - DUP1 - %append_to_trie_data - // stack: num_logs, retdest - // Load logs. - PUSH 0 - -mpt_load_receipt_trie_value_logs_loop: - // stack: i, num_logs, retdest - DUP2 DUP2 EQ - // stack: i == num_logs, i, num_logs, retdest - %jumpi(mpt_load_receipt_trie_value_end) - // stack: i, num_logs, retdest - // Load log_payload_len. - PROVER_INPUT(mpt) %append_to_trie_data - // Load address. - PROVER_INPUT(mpt) %append_to_trie_data - // Load num_topics. - PROVER_INPUT(mpt) - DUP1 - %append_to_trie_data - // stack: num_topics, i, num_logs, retdest - // Load topics. - PUSH 0 - -mpt_load_receipt_trie_value_topics_loop: - // stack: j, num_topics, i, num_logs, retdest - DUP2 DUP2 EQ - // stack: j == num_topics, j, num_topics, i, num_logs, retdest - %jumpi(mpt_load_receipt_trie_value_topics_end) - // stack: j, num_topics, i, num_logs, retdest - // Load topic. - PROVER_INPUT(mpt) %append_to_trie_data - %increment - %jump(mpt_load_receipt_trie_value_topics_loop) - -mpt_load_receipt_trie_value_topics_end: - // stack: num_topics, num_topics, i, num_logs, retdest - %pop2 - // stack: i, num_logs, retdest - // Load data_len. - PROVER_INPUT(mpt) - DUP1 - %append_to_trie_data - // stack: data_len, i, num_logs, retdest - // Load data. - PUSH 0 - -mpt_load_receipt_trie_value_data_loop: - // stack: j, data_len, i, num_logs, retdest - DUP2 DUP2 EQ - // stack: j == data_len, j, data_len, i, num_logs, retdest - %jumpi(mpt_load_receipt_trie_value_data_end) - // stack: j, data_len, i, num_logs, retdest - // Load data byte. - PROVER_INPUT(mpt) %append_to_trie_data - %increment - %jump(mpt_load_receipt_trie_value_data_loop) - -mpt_load_receipt_trie_value_data_end: - // stack: data_len, data_len, i, num_logs, retdest - %pop2 - %increment - %jump(mpt_load_receipt_trie_value_logs_loop) - -mpt_load_receipt_trie_value_end: - // stack: num_logs, num_logs, retdest - %pop2 - JUMP - -mpt_load_payload_len: - // stack: retdest - PROVER_INPUT(mpt) %append_to_trie_data - %jump(mpt_load_after_type) - -global mpt_load_storage_trie_value: - // stack: retdest - PROVER_INPUT(mpt) - %append_to_trie_data - // stack: retdest - JUMP diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index e72b4078..f187a480 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -275,6 +275,12 @@ impl<'a> Interpreter<'a> { code.into_iter().map(U256::from).collect(); } + pub(crate) fn set_memory_multi_addresses(&mut self, addrs: &[(MemoryAddress, U256)]) { + for &(addr, val) in addrs { + self.generation_state.memory.set(addr, val); + } + } + pub(crate) fn get_jumpdest_bits(&self, context: usize) -> Vec { self.generation_state.memory.contexts[context].segments[Segment::JumpdestBits as usize] .content diff --git a/evm/src/cpu/kernel/tests/account_code.rs b/evm/src/cpu/kernel/tests/account_code.rs index 2782e71f..dadfaf4b 100644 --- a/evm/src/cpu/kernel/tests/account_code.rs +++ b/evm/src/cpu/kernel/tests/account_code.rs @@ -13,12 +13,57 @@ use crate::cpu::kernel::constants::context_metadata::ContextMetadata::{self, Gas use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; use crate::cpu::kernel::tests::mpt::nibbles_64; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp}; +use crate::generation::mpt::{load_all_mpts, AccountRlp}; use crate::generation::TrieInputs; use crate::memory::segments::Segment; use crate::witness::memory::MemoryAddress; use crate::Node; +pub(crate) fn initialize_mpts(interpreter: &mut Interpreter, trie_inputs: &TrieInputs) { + // Load all MPTs. + let (trie_root_ptrs, trie_data) = + load_all_mpts(trie_inputs).expect("Invalid MPT data for preinitialization"); + + let state_addr = MemoryAddress::new( + 0, + Segment::GlobalMetadata, + GlobalMetadata::StateTrieRoot as usize, + ); + + let txn_addr = MemoryAddress::new( + 0, + Segment::GlobalMetadata, + GlobalMetadata::TransactionTrieRoot as usize, + ); + let receipts_addr = MemoryAddress::new( + 0, + Segment::GlobalMetadata, + GlobalMetadata::ReceiptTrieRoot as usize, + ); + let len_addr = MemoryAddress::new( + 0, + Segment::GlobalMetadata, + GlobalMetadata::TrieDataSize as usize, + ); + + let to_set = [ + (state_addr, trie_root_ptrs.state_root_ptr.into()), + (txn_addr, trie_root_ptrs.txn_root_ptr.into()), + (receipts_addr, trie_root_ptrs.receipt_root_ptr.into()), + (len_addr, trie_data.len().into()), + ]; + + interpreter.set_memory_multi_addresses(&to_set); + + for (i, data) in trie_data.iter().enumerate() { + let trie_addr = MemoryAddress::new(0, Segment::TrieData, i); + interpreter + .generation_state + .memory + .set(trie_addr, data.into()); + } +} + // Test account with a given code hash. fn test_account(code: &[u8]) -> AccountRlp { AccountRlp { @@ -42,20 +87,12 @@ fn prepare_interpreter( address: Address, account: &AccountRlp, ) -> Result<()> { - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_insert_state_trie = KERNEL.global_labels["mpt_insert_state_trie"]; let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; let mut state_trie: HashedPartialTrie = Default::default(); let trie_inputs = Default::default(); - interpreter.generation_state.registers.program_counter = load_all_mpts; - interpreter.push(0xDEADBEEFu32.into()); - - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; - assert_eq!(interpreter.stack(), vec![]); + initialize_mpts(interpreter, &trie_inputs); let k = nibbles_64(U256::from_big_endian( keccak(address.to_fixed_bytes()).as_bytes(), @@ -93,15 +130,16 @@ fn prepare_interpreter( // Now, execute mpt_hash_state_trie. interpreter.generation_state.registers.program_counter = mpt_hash_state_trie; interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initial length of the trie data segment, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack after hashing, found {:?}", + 2, + "Expected 2 items on stack after hashing, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let hash = H256::from_uint(&interpreter.stack()[1]); state_trie.insert(k, rlp::encode(account).to_vec()); let expected_state_trie_hash = state_trie.hash(); @@ -125,6 +163,7 @@ fn test_extcodesize() -> Result<()> { // Test `extcodesize` interpreter.generation_state.registers.program_counter = extcodesize; interpreter.pop(); + interpreter.pop(); assert!(interpreter.stack().is_empty()); interpreter.push(0xDEADBEEFu32.into()); interpreter.push(U256::from_big_endian(address.as_bytes())); @@ -173,6 +212,7 @@ fn test_extcodecopy() -> Result<()> { // Test `extcodecopy` interpreter.generation_state.registers.program_counter = extcodecopy; interpreter.pop(); + interpreter.pop(); assert!(interpreter.stack().is_empty()); interpreter.push(size.into()); interpreter.push(offset.into()); @@ -207,15 +247,7 @@ fn prepare_interpreter_all_accounts( code: &[u8], ) -> Result<()> { // Load all MPTs. - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - interpreter.generation_state.registers.program_counter = load_all_mpts; - interpreter.push(0xDEADBEEFu32.into()); - - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + initialize_mpts(interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Switch context and initialize memory with the data we need for the tests. @@ -311,16 +343,17 @@ fn sstore() -> Result<()> { interpreter.set_is_kernel(true); interpreter.set_context(0); interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initia length of the trie data segment, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack after hashing, found {:?}", + 2, + "Expected 2 items on stack after hashing, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let hash = H256::from_uint(&interpreter.stack()[1]); let mut expected_state_trie_after = HashedPartialTrie::from(Node::Empty); expected_state_trie_after.insert(addr_nibbles, rlp::encode(&account_after).to_vec()); @@ -389,16 +422,26 @@ fn sload() -> Result<()> { interpreter.set_is_kernel(true); interpreter.set_context(0); interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initia length of the trie data segment, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack after hashing, found {:?}", + 2, + "Expected 2 items on stack after hashing, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let trie_data_segment_len = interpreter.stack()[0]; + assert_eq!( + trie_data_segment_len, + interpreter + .get_memory_segment(Segment::TrieData) + .len() + .into() + ); + + let hash = H256::from_uint(&interpreter.stack()[1]); let expected_state_trie_hash = state_trie_before.hash(); assert_eq!(hash, expected_state_trie_hash); diff --git a/evm/src/cpu/kernel/tests/add11.rs b/evm/src/cpu/kernel/tests/add11.rs index 048dad86..a48bd450 100644 --- a/evm/src/cpu/kernel/tests/add11.rs +++ b/evm/src/cpu/kernel/tests/add11.rs @@ -12,7 +12,8 @@ use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::context_metadata::ContextMetadata; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp, LegacyReceiptRlp}; +use crate::cpu::kernel::tests::account_code::initialize_mpts; +use crate::generation::mpt::{AccountRlp, LegacyReceiptRlp}; use crate::generation::rlp::all_rlp_prover_inputs_reversed; use crate::generation::TrieInputs; use crate::memory::segments::Segment; @@ -28,14 +29,7 @@ fn prepare_interpreter( transaction: &[u8], contract_code: HashMap>, ) { - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - interpreter.generation_state.registers.program_counter = load_all_mpts; - interpreter.push(0xDEADBEEFu32.into()); - - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs).expect("Invalid MPT data."); - interpreter.run().expect("MPT loading failed."); + initialize_mpts(interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Set necessary `GlobalMetadata`. diff --git a/evm/src/cpu/kernel/tests/balance.rs b/evm/src/cpu/kernel/tests/balance.rs index 40214405..d7f92f3d 100644 --- a/evm/src/cpu/kernel/tests/balance.rs +++ b/evm/src/cpu/kernel/tests/balance.rs @@ -7,8 +7,9 @@ use rand::{thread_rng, Rng}; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::nibbles_64; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp}; +use crate::generation::mpt::AccountRlp; use crate::Node; // Test account with a given code hash. @@ -28,19 +29,12 @@ fn prepare_interpreter( address: Address, account: &AccountRlp, ) -> Result<()> { - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_insert_state_trie = KERNEL.global_labels["mpt_insert_state_trie"]; let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; let mut state_trie: HashedPartialTrie = Default::default(); let trie_inputs = Default::default(); - interpreter.generation_state.registers.program_counter = load_all_mpts; - interpreter.push(0xDEADBEEFu32.into()); - - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + initialize_mpts(interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let k = nibbles_64(U256::from_big_endian( @@ -79,15 +73,16 @@ fn prepare_interpreter( // Now, execute mpt_hash_state_trie. interpreter.generation_state.registers.program_counter = mpt_hash_state_trie; interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initial trie data segment size, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack after hashing, found {:?}", + 2, + "Expected 2 items on stack after hashing, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let hash = H256::from_uint(&interpreter.stack()[1]); state_trie.insert(k, rlp::encode(account).to_vec()); let expected_state_trie_hash = state_trie.hash(); @@ -110,6 +105,7 @@ fn test_balance() -> Result<()> { // Test `balance` interpreter.generation_state.registers.program_counter = KERNEL.global_labels["balance"]; interpreter.pop(); + interpreter.pop(); assert!(interpreter.stack().is_empty()); interpreter.push(0xDEADBEEFu32.into()); interpreter.push(U256::from_big_endian(address.as_bytes())); diff --git a/evm/src/cpu/kernel/tests/mpt/delete.rs b/evm/src/cpu/kernel/tests/mpt/delete.rs index 074eea26..edce3e58 100644 --- a/evm/src/cpu/kernel/tests/mpt/delete.rs +++ b/evm/src/cpu/kernel/tests/mpt/delete.rs @@ -6,8 +6,9 @@ use ethereum_types::{BigEndianHash, H256}; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::{nibbles_64, test_account_1_rlp, test_account_2}; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp}; +use crate::generation::mpt::AccountRlp; use crate::generation::TrieInputs; use crate::Node; @@ -65,16 +66,14 @@ fn test_state_trie( receipts_trie: Default::default(), storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_insert_state_trie = KERNEL.global_labels["mpt_insert_state_trie"]; let mpt_delete = KERNEL.global_labels["mpt_delete"]; let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs).map_err(|_| anyhow!("Invalid MPT data"))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Next, execute mpt_insert_state_trie. @@ -120,6 +119,7 @@ fn test_state_trie( // Now, execute mpt_hash_state_trie. interpreter.generation_state.registers.program_counter = mpt_hash_state_trie; interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initial length of the trie data segment, unused. interpreter.run()?; let state_trie_hash = H256::from_uint(&interpreter.pop()); diff --git a/evm/src/cpu/kernel/tests/mpt/hash.rs b/evm/src/cpu/kernel/tests/mpt/hash.rs index 05077a94..2902e566 100644 --- a/evm/src/cpu/kernel/tests/mpt/hash.rs +++ b/evm/src/cpu/kernel/tests/mpt/hash.rs @@ -4,8 +4,8 @@ use ethereum_types::{BigEndianHash, H256}; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::{extension_to_leaf, test_account_1_rlp, test_account_2_rlp}; -use crate::generation::mpt::all_mpt_prover_inputs_reversed; use crate::generation::TrieInputs; use crate::Node; @@ -108,28 +108,27 @@ fn mpt_hash_branch_to_leaf() -> Result<()> { } fn test_state_trie(trie_inputs: TrieInputs) -> Result<()> { - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs).map_err(|_| anyhow!("Invalid MPT data"))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Now, execute mpt_hash_state_trie. interpreter.generation_state.registers.program_counter = mpt_hash_state_trie; interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initial length of the trie data segment, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack, found {:?}", + 2, + "Expected 2 items on stack, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let hash = H256::from_uint(&interpreter.stack()[1]); let expected_state_trie_hash = trie_inputs.state_trie.hash(); assert_eq!(hash, expected_state_trie_hash); diff --git a/evm/src/cpu/kernel/tests/mpt/insert.rs b/evm/src/cpu/kernel/tests/mpt/insert.rs index 6fd95a30..e68e7d2f 100644 --- a/evm/src/cpu/kernel/tests/mpt/insert.rs +++ b/evm/src/cpu/kernel/tests/mpt/insert.rs @@ -6,10 +6,11 @@ use ethereum_types::{BigEndianHash, H256}; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::{ nibbles_64, nibbles_count, test_account_1_rlp, test_account_2, }; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, AccountRlp}; +use crate::generation::mpt::AccountRlp; use crate::generation::TrieInputs; use crate::Node; @@ -168,15 +169,13 @@ fn test_state_trie( receipts_trie: Default::default(), storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_insert_state_trie = KERNEL.global_labels["mpt_insert_state_trie"]; let mpt_hash_state_trie = KERNEL.global_labels["mpt_hash_state_trie"]; - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs).map_err(|_| anyhow!("Invalid MPT data"))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Next, execute mpt_insert_state_trie. @@ -212,15 +211,16 @@ fn test_state_trie( // Now, execute mpt_hash_state_trie. interpreter.generation_state.registers.program_counter = mpt_hash_state_trie; interpreter.push(0xDEADBEEFu32.into()); + interpreter.push(1.into()); // Initial length of the trie data segment, unused. interpreter.run()?; assert_eq!( interpreter.stack().len(), - 1, - "Expected 1 item on stack after hashing, found {:?}", + 2, + "Expected 2 items on stack after hashing, found {:?}", interpreter.stack() ); - let hash = H256::from_uint(&interpreter.stack()[0]); + let hash = H256::from_uint(&interpreter.stack()[1]); state_trie.insert(k, rlp::encode(&account).to_vec()); let expected_state_trie_hash = state_trie.hash(); diff --git a/evm/src/cpu/kernel/tests/mpt/load.rs b/evm/src/cpu/kernel/tests/mpt/load.rs index ae0bfa3b..68ba209d 100644 --- a/evm/src/cpu/kernel/tests/mpt/load.rs +++ b/evm/src/cpu/kernel/tests/mpt/load.rs @@ -10,8 +10,8 @@ use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::constants::trie_type::PartialTrieType; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::{extension_to_leaf, test_account_1, test_account_1_rlp}; -use crate::generation::mpt::all_mpt_prover_inputs_reversed; use crate::generation::TrieInputs; use crate::Node; @@ -24,17 +24,13 @@ fn load_all_mpts_empty() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); - assert_eq!(interpreter.get_trie_data(), vec![]); + // We need to have the first element in `TrieData` be 0. + assert_eq!(interpreter.get_trie_data(), vec![0.into()]); assert_eq!( interpreter.get_global_metadata_field(GlobalMetadata::StateTrieRoot), @@ -65,14 +61,9 @@ fn load_all_mpts_leaf() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let type_leaf = U256::from(PartialTrieType::Leaf as u32); @@ -116,14 +107,9 @@ fn load_all_mpts_hash() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let type_hash = U256::from(PartialTrieType::Hash as u32); @@ -159,14 +145,9 @@ fn load_all_mpts_empty_branch() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let type_branch = U256::from(PartialTrieType::Branch as u32); @@ -216,14 +197,9 @@ fn load_all_mpts_ext_to_leaf() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let type_extension = U256::from(PartialTrieType::Extension as u32); @@ -255,8 +231,6 @@ fn load_all_mpts_ext_to_leaf() -> Result<()> { #[test] fn load_mpt_txn_trie() -> Result<()> { - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; - let txn = hex!("f860010a830186a094095e7baea6a6c7c4c2dfeb977efac326af552e89808025a04a223955b0bd3827e3740a9a427d0ea43beb5bafa44a0204bf0a3306c8219f7ba0502c32d78f233e9e7ce9f5df3b576556d5d49731e0678fd5a068cdf359557b5b").to_vec(); let trie_inputs = TrieInputs { @@ -269,12 +243,9 @@ fn load_mpt_txn_trie() -> Result<()> { storage_tries: vec![], }; - let initial_stack = vec![0xDEADBEEFu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); let mut expected_trie_data = vec![ diff --git a/evm/src/cpu/kernel/tests/mpt/read.rs b/evm/src/cpu/kernel/tests/mpt/read.rs index f9ae94f0..67fea585 100644 --- a/evm/src/cpu/kernel/tests/mpt/read.rs +++ b/evm/src/cpu/kernel/tests/mpt/read.rs @@ -4,8 +4,8 @@ use ethereum_types::BigEndianHash; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::interpreter::Interpreter; +use crate::cpu::kernel::tests::account_code::initialize_mpts; use crate::cpu::kernel::tests::mpt::{extension_to_leaf, test_account_1, test_account_1_rlp}; -use crate::generation::mpt::all_mpt_prover_inputs_reversed; use crate::generation::TrieInputs; #[test] @@ -17,15 +17,11 @@ fn mpt_read() -> Result<()> { storage_tries: vec![], }; - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_read = KERNEL.global_labels["mpt_read"]; - let initial_stack = vec![0xdeadbeefu32.into()]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let initial_stack = vec![]; + let mut interpreter = Interpreter::new_with_kernel(0, initial_stack); + initialize_mpts(&mut interpreter, &trie_inputs); assert_eq!(interpreter.stack(), vec![]); // Now, execute mpt_read on the state trie. diff --git a/evm/src/cpu/kernel/tests/receipt.rs b/evm/src/cpu/kernel/tests/receipt.rs index e603561f..503a4a6a 100644 --- a/evm/src/cpu/kernel/tests/receipt.rs +++ b/evm/src/cpu/kernel/tests/receipt.rs @@ -8,7 +8,8 @@ use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::constants::txn_fields::NormalizedTxnField; use crate::cpu::kernel::interpreter::Interpreter; -use crate::generation::mpt::{all_mpt_prover_inputs_reversed, LegacyReceiptRlp, LogRlp}; +use crate::cpu::kernel::tests::account_code::initialize_mpts; +use crate::generation::mpt::{LegacyReceiptRlp, LogRlp}; use crate::memory::segments::Segment; #[test] @@ -126,7 +127,7 @@ fn test_receipt_encoding() -> Result<()> { // Get the expected RLP encoding. let expected_rlp = rlp::encode(&rlp::encode(&receipt_1)); - let initial_stack: Vec = vec![retdest, 0.into(), 0.into()]; + let initial_stack: Vec = vec![retdest, 0.into(), 0.into(), 0.into()]; let mut interpreter = Interpreter::new_with_kernel(encode_receipt, initial_stack); // Write data to memory. @@ -338,7 +339,6 @@ fn test_mpt_insert_receipt() -> Result<()> { let retdest = 0xDEADBEEFu32.into(); let trie_inputs = Default::default(); - let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; let mpt_insert = KERNEL.global_labels["mpt_insert_receipt_trie"]; let num_topics = 3; // Both transactions have the same number of topics. let payload_len = 423; // Total payload length for each receipt. @@ -409,11 +409,8 @@ fn test_mpt_insert_receipt() -> Result<()> { // First, we load all mpts. let initial_stack: Vec = vec![retdest]; - let mut interpreter = Interpreter::new_with_kernel(load_all_mpts, initial_stack); - interpreter.generation_state.mpt_prover_inputs = - all_mpt_prover_inputs_reversed(&trie_inputs) - .map_err(|err| anyhow!("Invalid MPT data: {:?}", err))?; - interpreter.run()?; + let mut interpreter = Interpreter::new_with_kernel(0, vec![]); + initialize_mpts(&mut interpreter, &trie_inputs); // If TrieData is empty, we need to push 0 because the first value is always 0. let mut cur_trie_data = interpreter.get_memory_segment(Segment::TrieData); @@ -514,9 +511,10 @@ fn test_mpt_insert_receipt() -> Result<()> { let mpt_hash_receipt = KERNEL.global_labels["mpt_hash_receipt_trie"]; interpreter.generation_state.registers.program_counter = mpt_hash_receipt; interpreter.push(retdest); + interpreter.push(1.into()); // Initial length of the trie data segment, unused. interpreter.run()?; assert_eq!( - interpreter.stack()[0], + interpreter.stack()[1], U256::from(hex!( "da46cdd329bfedace32da95f2b344d314bc6f55f027d65f9f4ac04ee425e1f98" )) diff --git a/evm/src/generation/mod.rs b/evm/src/generation/mod.rs index ddb1fe5d..db4a4047 100644 --- a/evm/src/generation/mod.rs +++ b/evm/src/generation/mod.rs @@ -33,6 +33,7 @@ pub(crate) mod rlp; pub(crate) mod state; mod trie_extractor; +use self::mpt::{load_all_mpts, TrieRootPtrs}; use crate::witness::util::mem_write_log; /// Inputs needed for trace generation. @@ -195,11 +196,6 @@ pub fn generate_traces, const D: usize>( timed!(timing, "simulate CPU", simulate_cpu(&mut state)?); - assert!( - state.mpt_prover_inputs.is_empty(), - "All MPT data should have been consumed" - ); - log::info!( "Trace lengths (before padding): {:?}", state.traces.get_lengths() @@ -220,6 +216,7 @@ pub fn generate_traces, const D: usize>( let gas_used_after = read_metadata(GlobalMetadata::BlockGasUsedAfter); let txn_number_after = read_metadata(GlobalMetadata::TxnNumberAfter); + let trie_root_ptrs = state.trie_root_ptrs; let extra_block_data = ExtraBlockData { genesis_state_trie_root: inputs.genesis_state_trie_root, txn_number_before: inputs.txn_number_before, diff --git a/evm/src/generation/mpt.rs b/evm/src/generation/mpt.rs index 8d944b27..a2abe1b2 100644 --- a/evm/src/generation/mpt.rs +++ b/evm/src/generation/mpt.rs @@ -9,9 +9,13 @@ use keccak_hash::keccak; use rlp::{Decodable, DecoderError, Encodable, PayloadInfo, Rlp, RlpStream}; use rlp_derive::{RlpDecodable, RlpEncodable}; +use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::constants::trie_type::PartialTrieType; use crate::generation::TrieInputs; +use crate::memory::segments::Segment; +use crate::util::h2u; use crate::witness::errors::{ProgramError, ProverInputError}; +use crate::witness::memory::MemoryAddress; use crate::Node; #[derive(RlpEncodable, RlpDecodable, Debug)] @@ -22,6 +26,13 @@ pub struct AccountRlp { pub code_hash: H256, } +#[derive(Clone, Debug)] +pub struct TrieRootPtrs { + pub state_root_ptr: usize, + pub txn_root_ptr: usize, + pub receipt_root_ptr: usize, +} + impl Default for AccountRlp { fn default() -> Self { Self { @@ -59,14 +70,6 @@ impl LegacyReceiptRlp { } } -pub(crate) fn all_mpt_prover_inputs_reversed( - trie_inputs: &TrieInputs, -) -> Result, ProgramError> { - let mut inputs = all_mpt_prover_inputs(trie_inputs)?; - inputs.reverse(); - Ok(inputs) -} - pub(crate) fn parse_receipts(rlp: &[u8]) -> Result, ProgramError> { let txn_type = match rlp.first().ok_or(ProgramError::InvalidRlp)? { 1 => 1, @@ -111,114 +114,114 @@ pub(crate) fn parse_receipts(rlp: &[u8]) -> Result, ProgramError> { Ok(parsed_receipt) } -/// Generate prover inputs for the initial MPT data, in the format expected by `mpt/load.asm`. -pub(crate) fn all_mpt_prover_inputs(trie_inputs: &TrieInputs) -> Result, ProgramError> { - let mut prover_inputs = vec![]; - let storage_tries_by_state_key = trie_inputs - .storage_tries - .iter() - .map(|(hashed_address, storage_trie)| { - let key = Nibbles::from_bytes_be(hashed_address.as_bytes()) - .expect("An H256 is 32 bytes long"); - (key, storage_trie) - }) - .collect(); - - mpt_prover_inputs_state_trie( - &trie_inputs.state_trie, - empty_nibbles(), - &mut prover_inputs, - &storage_tries_by_state_key, - )?; - - mpt_prover_inputs(&trie_inputs.transactions_trie, &mut prover_inputs, &|rlp| { - let mut parsed_txn = vec![U256::from(rlp.len())]; - parsed_txn.extend(rlp.iter().copied().map(U256::from)); - Ok(parsed_txn) - })?; - - mpt_prover_inputs( - &trie_inputs.receipts_trie, - &mut prover_inputs, - &parse_receipts, - )?; - - Ok(prover_inputs) +fn parse_storage_value(value_rlp: &[u8]) -> Result, ProgramError> { + let value: U256 = rlp::decode(value_rlp).map_err(|_| ProgramError::InvalidRlp)?; + Ok(vec![value]) } -/// Given a trie, generate the prover input data for that trie. In essence, this serializes a trie -/// into a `U256` array, in a simple format which the kernel understands. For example, a leaf node -/// is serialized as `(TYPE_LEAF, key, value)`, where key is a `(nibbles, depth)` pair and `value` -/// is a variable-length structure which depends on which trie we're dealing with. -pub(crate) fn mpt_prover_inputs( +const fn empty_nibbles() -> Nibbles { + Nibbles { + count: 0, + packed: U512::zero(), + } +} + +fn load_mpt( trie: &HashedPartialTrie, - prover_inputs: &mut Vec, + trie_data: &mut Vec, parse_value: &F, -) -> Result<(), ProgramError> +) -> Result where F: Fn(&[u8]) -> Result, ProgramError>, { - prover_inputs.push((PartialTrieType::of(trie) as u32).into()); + let node_ptr = trie_data.len(); + let type_of_trie = PartialTrieType::of(trie) as u32; + if type_of_trie > 0 { + trie_data.push(type_of_trie.into()); + } match trie.deref() { - Node::Empty => Ok(()), + Node::Empty => Ok(0), Node::Hash(h) => { - prover_inputs.push(U256::from_big_endian(h.as_bytes())); - Ok(()) + trie_data.push(h2u(*h)); + + Ok(node_ptr) } Node::Branch { children, value } => { + // First, set children pointers to 0. + let first_child_ptr = trie_data.len(); + trie_data.extend(vec![U256::zero(); 16]); + // Then, set value. if value.is_empty() { - prover_inputs.push(U256::zero()); // value_present = 0 + trie_data.push(U256::zero()); } else { let parsed_value = parse_value(value)?; - prover_inputs.push(U256::one()); // value_present = 1 - prover_inputs.extend(parsed_value); - } - for child in children { - mpt_prover_inputs(child, prover_inputs, parse_value)?; + trie_data.push((trie_data.len() + 1).into()); + trie_data.extend(parsed_value); } - Ok(()) + // Now, load all children and update their pointers. + for (i, child) in children.iter().enumerate() { + let child_ptr = load_mpt(child, trie_data, parse_value)?; + trie_data[first_child_ptr + i] = child_ptr.into(); + } + + Ok(node_ptr) } + Node::Extension { nibbles, child } => { - prover_inputs.push(nibbles.count.into()); - prover_inputs.push( + trie_data.push(nibbles.count.into()); + trie_data.push( nibbles .try_into_u256() .map_err(|_| ProgramError::IntegerTooLarge)?, ); - mpt_prover_inputs(child, prover_inputs, parse_value) + trie_data.push((trie_data.len() + 1).into()); + + let child_ptr = load_mpt(child, trie_data, parse_value)?; + if child_ptr == 0 { + trie_data.push(0.into()); + } + + Ok(node_ptr) } Node::Leaf { nibbles, value } => { - prover_inputs.push(nibbles.count.into()); - prover_inputs.push( + trie_data.push(nibbles.count.into()); + trie_data.push( nibbles .try_into_u256() .map_err(|_| ProgramError::IntegerTooLarge)?, ); - let leaf = parse_value(value)?; - prover_inputs.extend(leaf); - Ok(()) + // Set `value_ptr_ptr`. + trie_data.push((trie_data.len() + 1).into()); + + let leaf = parse_value(value)?; + trie_data.extend(leaf); + + Ok(node_ptr) } } } -/// Like `mpt_prover_inputs`, but for the state trie, which is a bit unique since each value -/// leads to a storage trie which we recursively traverse. -pub(crate) fn mpt_prover_inputs_state_trie( +fn load_state_trie( trie: &HashedPartialTrie, key: Nibbles, - prover_inputs: &mut Vec, + trie_data: &mut Vec, storage_tries_by_state_key: &HashMap, -) -> Result<(), ProgramError> { - prover_inputs.push((PartialTrieType::of(trie) as u32).into()); +) -> Result { + let node_ptr = trie_data.len(); + let type_of_trie = PartialTrieType::of(trie) as u32; + if type_of_trie > 0 { + trie_data.push(type_of_trie.into()); + } match trie.deref() { - Node::Empty => Ok(()), + Node::Empty => Ok(0), Node::Hash(h) => { - prover_inputs.push(U256::from_big_endian(h.as_bytes())); - Ok(()) + trie_data.push(h2u(*h)); + + Ok(node_ptr) } Node::Branch { children, value } => { if !value.is_empty() { @@ -226,37 +229,43 @@ pub(crate) fn mpt_prover_inputs_state_trie( ProverInputError::InvalidMptInput, )); } - prover_inputs.push(U256::zero()); // value_present = 0 + // First, set children pointers to 0. + let first_child_ptr = trie_data.len(); + trie_data.extend(vec![U256::zero(); 16]); + // Then, set value pointer to 0. + trie_data.push(U256::zero()); + // Now, load all children and update their pointers. for (i, child) in children.iter().enumerate() { let extended_key = key.merge_nibbles(&Nibbles { count: 1, packed: i.into(), }); - mpt_prover_inputs_state_trie( - child, - extended_key, - prover_inputs, - storage_tries_by_state_key, - )?; + let child_ptr = + load_state_trie(child, extended_key, trie_data, storage_tries_by_state_key)?; + + trie_data[first_child_ptr + i] = child_ptr.into(); } - Ok(()) + Ok(node_ptr) } Node::Extension { nibbles, child } => { - prover_inputs.push(nibbles.count.into()); - prover_inputs.push( + trie_data.push(nibbles.count.into()); + trie_data.push( nibbles .try_into_u256() .map_err(|_| ProgramError::IntegerTooLarge)?, ); + // Set `value_ptr_ptr`. + trie_data.push((trie_data.len() + 1).into()); let extended_key = key.merge_nibbles(nibbles); - mpt_prover_inputs_state_trie( - child, - extended_key, - prover_inputs, - storage_tries_by_state_key, - ) + let child_ptr = + load_state_trie(child, extended_key, trie_data, storage_tries_by_state_key)?; + if child_ptr == 0 { + trie_data.push(0.into()); + } + + Ok(node_ptr) } Node::Leaf { nibbles, value } => { let account: AccountRlp = rlp::decode(value).map_err(|_| ProgramError::InvalidRlp)?; @@ -275,34 +284,69 @@ pub(crate) fn mpt_prover_inputs_state_trie( .unwrap_or(&storage_hash_only); assert_eq!(storage_trie.hash(), storage_root, - "In TrieInputs, an account's storage_root didn't match the associated storage trie hash"); + "In TrieInputs, an account's storage_root didn't match the associated storage trie hash"); - prover_inputs.push(nibbles.count.into()); - prover_inputs.push( + trie_data.push(nibbles.count.into()); + trie_data.push( nibbles .try_into_u256() .map_err(|_| ProgramError::IntegerTooLarge)?, ); - prover_inputs.push(nonce); - prover_inputs.push(balance); - mpt_prover_inputs(storage_trie, prover_inputs, &parse_storage_value)?; - prover_inputs.push(code_hash.into_uint()); + // Set `value_ptr_ptr`. + trie_data.push((trie_data.len() + 1).into()); - Ok(()) + trie_data.push(nonce); + trie_data.push(balance); + // Storage trie ptr. + let storage_ptr_ptr = trie_data.len(); + trie_data.push((trie_data.len() + 2).into()); + trie_data.push(code_hash.into_uint()); + let storage_ptr = load_mpt(storage_trie, trie_data, &parse_storage_value)?; + if storage_ptr == 0 { + trie_data[storage_ptr_ptr] = 0.into(); + } + + Ok(node_ptr) } } } -fn parse_storage_value(value_rlp: &[u8]) -> Result, ProgramError> { - let value: U256 = rlp::decode(value_rlp).map_err(|_| ProgramError::InvalidRlp)?; - Ok(vec![value]) -} +pub(crate) fn load_all_mpts( + trie_inputs: &TrieInputs, +) -> Result<(TrieRootPtrs, Vec), ProgramError> { + let mut trie_data = vec![U256::zero()]; + let storage_tries_by_state_key = trie_inputs + .storage_tries + .iter() + .map(|(hashed_address, storage_trie)| { + let key = Nibbles::from_bytes_be(hashed_address.as_bytes()) + .expect("An H256 is 32 bytes long"); + (key, storage_trie) + }) + .collect(); -const fn empty_nibbles() -> Nibbles { - Nibbles { - count: 0, - packed: U512::zero(), - } + let state_root_ptr = load_state_trie( + &trie_inputs.state_trie, + empty_nibbles(), + &mut trie_data, + &storage_tries_by_state_key, + )?; + + let txn_root_ptr = load_mpt(&trie_inputs.transactions_trie, &mut trie_data, &|rlp| { + let mut parsed_txn = vec![U256::from(rlp.len())]; + parsed_txn.extend(rlp.iter().copied().map(U256::from)); + Ok(parsed_txn) + })?; + + let receipt_root_ptr = load_mpt(&trie_inputs.receipts_trie, &mut trie_data, &parse_receipts)?; + + let trie_root_ptrs = TrieRootPtrs { + state_root_ptr, + txn_root_ptr, + receipt_root_ptr, + }; + + Ok((trie_root_ptrs, trie_data)) } pub mod transaction_testing { diff --git a/evm/src/generation/prover_input.rs b/evm/src/generation/prover_input.rs index 37176f76..6d40193f 100644 --- a/evm/src/generation/prover_input.rs +++ b/evm/src/generation/prover_input.rs @@ -36,10 +36,10 @@ impl GenerationState { pub(crate) fn prover_input(&mut self, input_fn: &ProverInputFn) -> Result { match input_fn.0[0].as_str() { "no_txn" => self.no_txn(), + "trie_ptr" => self.run_trie_ptr(input_fn), "ff" => self.run_ff(input_fn), "sf" => self.run_sf(input_fn), "ffe" => self.run_ffe(input_fn), - "mpt" => self.run_mpt(), "rlp" => self.run_rlp(), "current_hash" => self.run_current_hash(), "account_code" => self.run_account_code(input_fn), @@ -54,6 +54,16 @@ impl GenerationState { Ok(U256::from(self.inputs.signed_txn.is_none() as u8)) } + fn run_trie_ptr(&mut self, input_fn: &ProverInputFn) -> Result { + let trie = input_fn.0[1].as_str(); + match trie { + "state" => Ok(U256::from(self.trie_root_ptrs.state_root_ptr)), + "txn" => Ok(U256::from(self.trie_root_ptrs.txn_root_ptr)), + "receipt" => Ok(U256::from(self.trie_root_ptrs.receipt_root_ptr)), + _ => Err(ProgramError::ProverInputError(InvalidInput)), + } + } + /// Finite field operations. fn run_ff(&self, input_fn: &ProverInputFn) -> Result { let field = EvmField::from_str(input_fn.0[1].as_str()) @@ -109,13 +119,6 @@ impl GenerationState { Ok(field.field_extension_inverse(n, f)) } - /// MPT data. - fn run_mpt(&mut self) -> Result { - self.mpt_prover_inputs - .pop() - .ok_or(ProgramError::ProverInputError(OutOfMptData)) - } - /// RLP data. fn run_rlp(&mut self) -> Result { self.rlp_prover_inputs diff --git a/evm/src/generation/state.rs b/evm/src/generation/state.rs index 938e83b8..89ff0c5a 100644 --- a/evm/src/generation/state.rs +++ b/evm/src/generation/state.rs @@ -2,11 +2,14 @@ use std::collections::HashMap; use ethereum_types::{Address, BigEndianHash, H160, H256, U256}; use keccak_hash::keccak; +use plonky2::field::extension::Extendable; use plonky2::field::types::Field; +use plonky2::hash::hash_types::RichField; +use super::mpt::{load_all_mpts, TrieRootPtrs}; +use super::TrieInputs; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::constants::context_metadata::ContextMetadata; -use crate::generation::mpt::all_mpt_prover_inputs_reversed; use crate::generation::rlp::all_rlp_prover_inputs_reversed; use crate::generation::GenerationInputs; use crate::memory::segments::Segment; @@ -29,10 +32,6 @@ pub(crate) struct GenerationState { pub(crate) memory: MemoryState, pub(crate) traces: Traces, - /// Prover inputs containing MPT data, in reverse order so that the next input can be obtained - /// via `pop()`. - pub(crate) mpt_prover_inputs: Vec, - /// Prover inputs containing RLP data, in reverse order so that the next input can be obtained /// via `pop()`. pub(crate) rlp_prover_inputs: Vec, @@ -48,9 +47,20 @@ pub(crate) struct GenerationState { /// inputs are obtained in big-endian order via `pop()`). Contains both the remainder and the /// quotient, in that order. pub(crate) bignum_modmul_result_limbs: Vec, + + /// Pointers, within the `TrieData` segment, of the three MPTs. + pub(crate) trie_root_ptrs: TrieRootPtrs, } impl GenerationState { + fn preinitialize_mpts(&mut self, trie_inputs: &TrieInputs) -> TrieRootPtrs { + let (trie_roots_ptrs, trie_data) = + load_all_mpts(trie_inputs).expect("Invalid MPT data for preinitialization"); + + self.memory.contexts[0].segments[Segment::TrieData as usize].content = trie_data; + + trie_roots_ptrs + } pub(crate) fn new(inputs: GenerationInputs, kernel_code: &[u8]) -> Result { log::debug!("Input signed_txn: {:?}", &inputs.signed_txn); log::debug!("Input state_trie: {:?}", &inputs.tries.state_trie); @@ -61,23 +71,31 @@ impl GenerationState { log::debug!("Input receipts_trie: {:?}", &inputs.tries.receipts_trie); log::debug!("Input storage_tries: {:?}", &inputs.tries.storage_tries); log::debug!("Input contract_code: {:?}", &inputs.contract_code); - let mpt_prover_inputs = all_mpt_prover_inputs_reversed(&inputs.tries)?; + let rlp_prover_inputs = - all_rlp_prover_inputs_reversed(inputs.signed_txn.as_ref().unwrap_or(&vec![])); + all_rlp_prover_inputs_reversed(inputs.clone().signed_txn.as_ref().unwrap_or(&vec![])); let withdrawal_prover_inputs = all_withdrawals_prover_inputs_reversed(&inputs.withdrawals); let bignum_modmul_result_limbs = Vec::new(); - Ok(Self { - inputs, + let mut state = Self { + inputs: inputs.clone(), registers: Default::default(), memory: MemoryState::new(kernel_code), traces: Traces::default(), - mpt_prover_inputs, rlp_prover_inputs, withdrawal_prover_inputs, state_key_to_address: HashMap::new(), bignum_modmul_result_limbs, - }) + trie_root_ptrs: TrieRootPtrs { + state_root_ptr: 0, + txn_root_ptr: 0, + receipt_root_ptr: 0, + }, + }; + let trie_root_ptrs = state.preinitialize_mpts(&inputs.tries); + + state.trie_root_ptrs = trie_root_ptrs; + Ok(state) } /// Updates `program_counter`, and potentially adds some extra handling if we're jumping to a diff --git a/evm/src/memory/memory_stark.rs b/evm/src/memory/memory_stark.rs index 3d36a33a..4dfdc913 100644 --- a/evm/src/memory/memory_stark.rs +++ b/evm/src/memory/memory_stark.rs @@ -13,6 +13,7 @@ use plonky2::util::timing::TimingTree; use plonky2::util::transpose; use plonky2_maybe_rayon::*; +use super::segments::Segment; use crate::constraint_consumer::{ConstraintConsumer, RecursiveConstraintConsumer}; use crate::cross_table_lookup::{Column, Filter}; use crate::evaluation_frame::{StarkEvaluationFrame, StarkFrame}; @@ -349,7 +350,11 @@ impl, const D: usize> Stark for MemoryStark, const D: usize> Stark for MemoryStark anyhow::Result<()> { // Preprocess all circuits. let all_circuits = AllRecursiveCircuits::::new( &all_stark, - &[16..17, 14..16, 16..18, 14..15, 10..11, 12..13, 19..20], + &[16..17, 14..16, 16..18, 14..15, 9..10, 12..13, 19..20], &config, );