From c7b03cfe9a5d02b0fcf5db237fd8ced65d5cb429 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Thu, 22 Sep 2022 20:09:48 -0700 Subject: [PATCH] More MPT logic --- evm/spec/framework.tex | 2 - evm/spec/tries.tex | 14 +- evm/spec/zkevm.pdf | Bin 146723 -> 150705 bytes evm/src/cpu/kernel/aggregator.rs | 1 + evm/src/cpu/kernel/asm/core/intrinsic_gas.asm | 3 - evm/src/cpu/kernel/asm/core/process_txn.asm | 2 + evm/src/cpu/kernel/asm/memory/metadata.asm | 10 +- evm/src/cpu/kernel/asm/mpt/load.asm | 178 ++++++++++++++- evm/src/cpu/kernel/asm/mpt/read.asm | 8 +- evm/src/cpu/kernel/asm/mpt/util.asm | 26 +++ evm/src/cpu/kernel/assembler.rs | 52 ++--- evm/src/cpu/kernel/interpreter.rs | 203 +++++++++--------- evm/src/cpu/kernel/tests/mod.rs | 1 + evm/src/cpu/kernel/tests/mpt/load.rs | 67 ++++++ evm/src/cpu/kernel/tests/mpt/mod.rs | 1 + evm/src/generation/mod.rs | 17 +- evm/src/generation/mpt.rs | 40 ++-- evm/src/generation/prover_input.rs | 16 +- evm/src/generation/state.rs | 6 +- evm/tests/transfer_to_new_addr.rs | 12 +- 20 files changed, 475 insertions(+), 184 deletions(-) create mode 100644 evm/src/cpu/kernel/tests/mpt/load.rs create mode 100644 evm/src/cpu/kernel/tests/mpt/mod.rs diff --git a/evm/spec/framework.tex b/evm/spec/framework.tex index 122e1c75..d99a31bb 100644 --- a/evm/spec/framework.tex +++ b/evm/spec/framework.tex @@ -6,8 +6,6 @@ Our zkEVM is designed for efficient verification by STARKs \cite{stark}, particularly by an AIR with degree 3 constraints. In this model, the prover bottleneck is typically constructing Merkle trees, particularly constructing the tree containing low-degree extensions of witness polynomials. -More specifically, we target a constraint system of degree 3. - \subsection{Field selection} \label{field} diff --git a/evm/spec/tries.tex b/evm/spec/tries.tex index d8fc2674..fed78f40 100644 --- a/evm/spec/tries.tex +++ b/evm/spec/tries.tex @@ -1,4 +1,16 @@ \section{Merkle Patricia tries} \label{tries} -TODO +\subsection{Internal memory format} + +Withour our zkEVM's kernel memory, +\begin{enumerate} + \item An empty node is encoded as $(\texttt{MPT\_NODE\_EMPTY})$. + \item A branch node is encoded as $(\texttt{MPT\_NODE\_BRANCH}, c_1, \dots, c_{16}, v)$, where each $c_i$ is a pointer to a child node, and $v$ is a leaf payload. + \item An extension node is encoded as $(\texttt{MPT\_NODE\_EXTENSION}, k, c)$, $k$ is a 2-tuple $(\texttt{packed\_nibbles}, \texttt{num\_nibbles})$, and $c$ is a pointer to a child node. + \item A leaf node is encoded as $(\texttt{MPT\_NODE\_LEAF}, k, v)$, where $k$ is a 2-tuple as above, and $v$ is a leaf payload. + \item A digest node is encoded as $(\texttt{MPT\_NODE\_DIGEST}, d)$, where $d$ is a Keccak256 digest. +\end{enumerate} + + +\subsection{Prover input format} diff --git a/evm/spec/zkevm.pdf b/evm/spec/zkevm.pdf index 8501cfbb9e6ce463f65f0f2369c78cd08d445096..aff46edac15c99d96ac36fb631373c0924c9b040 100644 GIT binary patch delta 69180 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 delta 65360 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

d+WYL;rr?gr_%>G8C%&8cR*U#7^m4%d)5PX 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 Kernel { include_str!("asm/rlp/decode.asm"), include_str!("asm/rlp/read_to_memory.asm"), include_str!("asm/mpt/hash.asm"), + include_str!("asm/mpt/load.asm"), include_str!("asm/mpt/read.asm"), include_str!("asm/mpt/storage_read.asm"), include_str!("asm/mpt/storage_write.asm"), diff --git a/evm/src/cpu/kernel/asm/core/intrinsic_gas.asm b/evm/src/cpu/kernel/asm/core/intrinsic_gas.asm index 3c6f47b6..931a6a7b 100644 --- a/evm/src/cpu/kernel/asm/core/intrinsic_gas.asm +++ b/evm/src/cpu/kernel/asm/core/intrinsic_gas.asm @@ -1,6 +1,3 @@ -// After the transaction data has been parsed into a normalized set of fields -// (see NormalizedTxnField), this routine processes the transaction. - global intrinsic_gas: // stack: retdest // Calculate the number of zero and nonzero bytes in the txn data. diff --git a/evm/src/cpu/kernel/asm/core/process_txn.asm b/evm/src/cpu/kernel/asm/core/process_txn.asm index b3d92131..ac52c53d 100644 --- a/evm/src/cpu/kernel/asm/core/process_txn.asm +++ b/evm/src/cpu/kernel/asm/core/process_txn.asm @@ -1,6 +1,8 @@ // After the transaction data has been parsed into a normalized set of fields // (see NormalizedTxnField), this routine processes the transaction. +// TODO: Save checkpoints in @CTX_METADATA_STATE_TRIE_CHECKPOINT_PTR and @SEGMENT_STORAGE_TRIE_CHECKPOINT_PTRS. + global process_normalized_txn: // stack: (empty) PUSH validate diff --git a/evm/src/cpu/kernel/asm/memory/metadata.asm b/evm/src/cpu/kernel/asm/memory/metadata.asm index 23c45d13..644699e0 100644 --- a/evm/src/cpu/kernel/asm/memory/metadata.asm +++ b/evm/src/cpu/kernel/asm/memory/metadata.asm @@ -12,7 +12,7 @@ // stack: value PUSH $field // stack: offset, value - %mload_kernel(@SEGMENT_GLOBAL_METADATA) + %mstore_kernel(@SEGMENT_GLOBAL_METADATA) // stack: (empty) %endmacro @@ -30,18 +30,18 @@ // stack: value PUSH $field // stack: offset, value - %mload_current(@SEGMENT_CONTEXT_METADATA) + %mstore_current(@SEGMENT_CONTEXT_METADATA) // stack: (empty) %endmacro %macro address - %mload_context_metadata(0) // TODO: Read proper field. + %mload_context_metadata(@CTX_METADATA_ADDRESS) %endmacro %macro sender - %mload_context_metadata(0) // TODO: Read proper field. + %mload_context_metadata(@CTX_METADATA_CALLER) %endmacro %macro callvalue - %mload_context_metadata(0) // TODO: Read proper field. + %mload_context_metadata(@CTX_METADATA_CALL_VALUE) %endmacro diff --git a/evm/src/cpu/kernel/asm/mpt/load.asm b/evm/src/cpu/kernel/asm/mpt/load.asm index e58e32dc..208b7221 100644 --- a/evm/src/cpu/kernel/asm/mpt/load.asm +++ b/evm/src/cpu/kernel/asm/mpt/load.asm @@ -1,12 +1,176 @@ +// TODO: Receipt trie leaves are variable-length, so we need to be careful not +// to permit buffer over-reads. + // Load all partial trie data from prover inputs. -global mpt_load_all: - // First set GLOBAL_METADATA_TRIE_DATA_SIZE = 1. +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 - %mstore(@GLOBAL_METADATA_TRIE_DATA_SIZE) + %set_trie_data_size - TODO + %load_mpt_and_return_root_ptr + %mstore_global_metadata(@GLOBAL_METADATA_STATE_TRIE_ROOT) + %load_mpt_and_return_root_ptr %mstore_global_metadata(@GLOBAL_METADATA_TXN_TRIE_ROOT) + %load_mpt_and_return_root_ptr %mstore_global_metadata(@GLOBAL_METADATA_RECEIPT_TRIE_ROOT) -mpt_load_state: - PROVER_INPUT(mpt::state) - TODO + PROVER_INPUT(mpt) + // stack: num_storage_tries, retdest + DUP1 %mstore_global_metadata(@GLOBAL_METADATA_NUM_STORAGE_TRIES) + // stack: num_storage_tries, retdest + PUSH 0 // i = 0 + // stack: i, num_storage_tries, retdest +storage_trie_loop: + DUP2 DUP2 EQ + // stack: i == num_storage_tries, i, num_storage_tries, retdest + %jumpi(storage_trie_loop_end) + // stack: i, num_storage_tries, retdest + PROVER_INPUT(mpt) + // stack: storage_trie_addr, i, num_storage_tries, retdest + DUP2 + // stack: i, storage_trie_addr, i, num_storage_tries, retdest + %mstore_kernel(@SEGMENT_STORAGE_TRIE_ADDRS) + // stack: i, num_storage_tries, retdest + %load_mpt_and_return_root_ptr + // stack: root_ptr, i, num_storage_tries, retdest + DUP2 + // stack: i, root_ptr, i, num_storage_tries, retdest + %mstore_kernel(@SEGMENT_STORAGE_TRIE_PTRS) + // stack: i, num_storage_tries, retdest + %jump(storage_trie_loop) +storage_trie_loop_end: + // TODO: Hash tries and set @GLOBAL_METADATA_STATE_TRIE_DIGEST_BEFORE, etc. + // stack: i, num_storage_tries, retdest + %pop2 + // stack: retdest + JUMP + +// Load an MPT from prover inputs. +// Pre stack: retdest +// Post stack: (empty) +load_mpt: + // stack: retdest + PROVER_INPUT(mpt) + // stack: node_type, retdest + DUP1 %append_to_trie_data + // stack: node_type, 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: + // stack: node_type, retdest + POP + // stack: retdest + JUMP + +load_mpt_branch: + // stack: node_type, retdest + POP + // stack: retdest + %get_trie_data_size + // stack: ptr_children, retdest + DUP1 %add_const(16) + // stack: ptr_leaf, ptr_children, retdest + %set_trie_data_size + // stack: ptr_children, retdest + %load_leaf_value + + // Save the current trie_data_size (which now points to the end of the leaf) + // for later, then have it point to the start of our 16 child pointers. + %get_trie_data_size + // stack: ptr_end_of_leaf, ptr_children, retdest + SWAP1 + %set_trie_data_size + // stack: ptr_end_of_leaf, retdest + + // Load the 16 children. + %rep 16 + %load_mpt_and_return_root_ptr + // stack: child_ptr, ptr_end_of_leaf, retdest + %append_to_trie_data + // stack: ptr_end_of_leaf, retdest + %endrep + + %set_trie_data_size + // stack: retdest + JUMP + +load_mpt_extension: + // stack: node_type, retdest + POP + // stack: retdest + PROVER_INPUT(mpt) // read num_nibbles + %append_to_trie_data + PROVER_INPUT(mpt) // read packed_nibbles + %append_to_trie_data + // stack: retdest + + %load_mpt_and_return_root_ptr + // stack: child_ptr, retdest + %append_to_trie_data + // stack: retdest + JUMP + +load_mpt_leaf: + // stack: node_type, retdest + POP + // stack: retdest + PROVER_INPUT(mpt) // read num_nibbles + %append_to_trie_data + PROVER_INPUT(mpt) // read packed_nibbles + %append_to_trie_data + // stack: retdest + %load_leaf_value + // stack: retdest + JUMP + +load_mpt_digest: + // stack: node_type, retdest + POP + // stack: retdest + PROVER_INPUT(mpt) // read digest + %append_to_trie_data + // stack: retdest + JUMP + +// Convenience macro to call load_mpt and return where we left off. +%macro load_mpt + PUSH %%after + %jump(load_mpt) +%%after: +%endmacro + +%macro load_mpt_and_return_root_ptr + // stack: (empty) + %get_trie_data_size + // stack: ptr + %load_mpt + // stack: ptr +%endmacro + +// Load a leaf from prover input, and append it to trie data. +%macro load_leaf_value + // stack: (empty) + PROVER_INPUT(mpt) + // stack: leaf_len +%%loop: + DUP1 ISZERO + // stack: leaf_len == 0, leaf_len + %jumpi(%%finish) + // stack: leaf_len + PROVER_INPUT(mpt) + // stack: leaf_part, leaf_len + %append_to_trie_data + // stack: leaf_len + %sub_const(1) + // stack: leaf_len' + %jump(%%loop) +%%finish: + POP + // stack: (empty) +%endmacro diff --git a/evm/src/cpu/kernel/asm/mpt/read.asm b/evm/src/cpu/kernel/asm/mpt/read.asm index 1dc497c8..fb61df06 100644 --- a/evm/src/cpu/kernel/asm/mpt/read.asm +++ b/evm/src/cpu/kernel/asm/mpt/read.asm @@ -16,12 +16,12 @@ global mpt_read: SWAP1 %add_const(1) SWAP1 // stack: node_type, node_payload_ptr, key, nibbles, retdest - DUP1 %eq_const(@MPT_NODE_EMPTY) %jumpi(mpt_read_empty) - DUP1 %eq_const(@MPT_NODE_BRANCH) %jumpi(mpt_read_branch) + DUP1 %eq_const(@MPT_NODE_EMPTY) %jumpi(mpt_read_empty) + DUP1 %eq_const(@MPT_NODE_BRANCH) %jumpi(mpt_read_branch) DUP1 %eq_const(@MPT_NODE_EXTENSION) %jumpi(mpt_read_extension) - DUP1 %eq_const(@MPT_NODE_LEAF) %jumpi(mpt_read_leaf) + DUP1 %eq_const(@MPT_NODE_LEAF) %jumpi(mpt_read_leaf) - // There's still the MPT_NODE_DIGEST case, but if we hit a digest node, + // There's still the MPT_NODE_HASH case, but if we hit a digest node, // it means the prover failed to provide necessary Merkle data, so panic. PANIC diff --git a/evm/src/cpu/kernel/asm/mpt/util.asm b/evm/src/cpu/kernel/asm/mpt/util.asm index 96c0ed9e..86208866 100644 --- a/evm/src/cpu/kernel/asm/mpt/util.asm +++ b/evm/src/cpu/kernel/asm/mpt/util.asm @@ -9,3 +9,29 @@ %mstore_kernel(@SEGMENT_TRIE_DATA) // stack: (empty) %endmacro + +%macro get_trie_data_size + // stack: (empty) + %mload_global_metadata(@GLOBAL_METADATA_TRIE_DATA_SIZE) + // stack: trie_data_size +%endmacro + +%macro set_trie_data_size + // stack: trie_data_size + %mstore_global_metadata(@GLOBAL_METADATA_TRIE_DATA_SIZE) + // stack: (empty) +%endmacro + +// Equivalent to: trie_data[trie_data_size++] = value +%macro append_to_trie_data + // stack: value + %get_trie_data_size + // stack: trie_data_size, value + DUP1 + %add_const(1) + // stack: trie_data_size', trie_data_size, value + %set_trie_data_size + // stack: trie_data_size, value + %mstore_trie_data + // stack: (empty) +%endmacro diff --git a/evm/src/cpu/kernel/assembler.rs b/evm/src/cpu/kernel/assembler.rs index 8937aa2c..ede60a29 100644 --- a/evm/src/cpu/kernel/assembler.rs +++ b/evm/src/cpu/kernel/assembler.rs @@ -85,20 +85,20 @@ pub(crate) fn assemble( let mut local_labels = Vec::with_capacity(files.len()); let mut macro_counter = 0; for file in files { - let expanded_file = expand_macros(file.body, ¯os, &mut macro_counter); - let expanded_file = expand_repeats(expanded_file); - let expanded_file = inline_constants(expanded_file, &constants); - let mut expanded_file = expand_stack_manipulation(expanded_file); + let mut file = file.body; + file = expand_macros(file, ¯os, &mut macro_counter); + file = inline_constants(file, &constants); + file = expand_stack_manipulation(file); if optimize { - optimize_asm(&mut expanded_file); + optimize_asm(&mut file); } local_labels.push(find_labels( - &expanded_file, + &file, &mut offset, &mut global_labels, &mut prover_inputs, )); - expanded_files.push(expanded_file); + expanded_files.push(file); } let mut code = vec![]; for (file, locals) in izip!(expanded_files, local_labels) { @@ -146,6 +146,11 @@ fn expand_macros( Item::MacroCall(m, args) => { expanded.extend(expand_macro_call(m, args, macros, macro_counter)); } + Item::Repeat(count, body) => { + for _ in 0..count.as_usize() { + expanded.extend(expand_macros(body.clone(), macros, macro_counter)); + } + } item => { expanded.push(item); } @@ -187,12 +192,10 @@ fn expand_macro_call( Item::MacroCall(name, args) => { let expanded_args = args .iter() - .map(|arg| { - if let PushTarget::MacroVar(var) = arg { - get_arg(var) - } else { - arg.clone() - } + .map(|arg| match arg { + PushTarget::MacroVar(var) => get_arg(var), + PushTarget::MacroLabel(l) => PushTarget::Label(get_actual_label(l)), + _ => arg.clone(), }) .collect(); Item::MacroCall(name.clone(), expanded_args) @@ -220,21 +223,6 @@ fn expand_macro_call( expand_macros(expanded_item, macros, macro_counter) } -fn expand_repeats(body: Vec) -> Vec { - let mut expanded = vec![]; - for item in body { - if let Item::Repeat(count, block) = item { - let reps = count.as_usize(); - for _ in 0..reps { - expanded.extend(block.clone()); - } - } else { - expanded.push(item); - } - } - expanded -} - fn inline_constants(body: Vec, constants: &HashMap) -> Vec { let resolve_const = |c| { *constants @@ -494,7 +482,8 @@ mod tests { #[test] fn macro_with_label() { let files = &[ - "%macro spin %%start: PUSH %%start JUMP %endmacro", + "%macro jump(x) PUSH $x JUMP %endmacro", + "%macro spin %%start: %jump(%%start) %endmacro", "%spin %spin", ]; let kernel = parse_and_assemble_ext(files, HashMap::new(), false); @@ -535,6 +524,11 @@ mod tests { assert_eq!(kernel.code, vec![push1, 5, push1, 6, push1, 7]); } + #[test] + fn pop2_macro() { + parse_and_assemble(&["%macro pop2 %rep 2 pop %endrep %endmacro", "%pop2"]); + } + #[test] #[should_panic] fn macro_with_wrong_vars() { diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index 6c2d1e6c..4a1f588b 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -1,12 +1,13 @@ use std::collections::HashMap; -use anyhow::{anyhow, bail}; +use anyhow::{anyhow, bail, ensure}; use ethereum_types::{BigEndianHash, U256, U512}; use keccak_hash::keccak; use plonky2::field::goldilocks_field::GoldilocksField; use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::assembler::Kernel; +use crate::cpu::kernel::global_metadata::GlobalMetadata; use crate::cpu::kernel::txn_fields::NormalizedTxnField; use crate::generation::memory::{MemoryContextState, MemorySegmentState}; use crate::generation::prover_input::ProverInputFn; @@ -60,7 +61,7 @@ pub struct Interpreter<'a> { offset: usize, context: usize, pub(crate) memory: InterpreterMemory, - generation_state: GenerationState, + pub(crate) generation_state: GenerationState, prover_inputs_map: &'a HashMap, pub(crate) halt_offsets: Vec, running: bool, @@ -151,6 +152,14 @@ impl<'a> Interpreter<'a> { &self.memory.context_memory[0].segments[Segment::TxnData as usize].content } + pub(crate) fn get_global_metadata_field(&self, field: GlobalMetadata) -> U256 { + self.memory.context_memory[0].segments[Segment::GlobalMetadata as usize].get(field as usize) + } + + pub(crate) fn get_trie_data(&self) -> &[U256] { + &self.memory.context_memory[0].segments[Segment::TrieData as usize].content + } + pub(crate) fn get_rlp_memory(&self) -> Vec { self.memory.context_memory[self.context].segments[Segment::RlpRaw as usize] .content @@ -192,99 +201,99 @@ impl<'a> Interpreter<'a> { let opcode = self.code().get(self.offset).byte(0); self.incr(1); match opcode { - 0x00 => self.run_stop(), // "STOP", - 0x01 => self.run_add(), // "ADD", - 0x02 => self.run_mul(), // "MUL", - 0x03 => self.run_sub(), // "SUB", - 0x04 => self.run_div(), // "DIV", - 0x05 => todo!(), // "SDIV", - 0x06 => self.run_mod(), // "MOD", - 0x07 => todo!(), // "SMOD", - 0x08 => self.run_addmod(), // "ADDMOD", - 0x09 => self.run_mulmod(), // "MULMOD", - 0x0a => self.run_exp(), // "EXP", - 0x0b => todo!(), // "SIGNEXTEND", - 0x10 => self.run_lt(), // "LT", - 0x11 => self.run_gt(), // "GT", - 0x12 => todo!(), // "SLT", - 0x13 => todo!(), // "SGT", - 0x14 => self.run_eq(), // "EQ", - 0x15 => self.run_iszero(), // "ISZERO", - 0x16 => self.run_and(), // "AND", - 0x17 => self.run_or(), // "OR", - 0x18 => self.run_xor(), // "XOR", - 0x19 => self.run_not(), // "NOT", - 0x1a => self.run_byte(), // "BYTE", - 0x1b => self.run_shl(), // "SHL", - 0x1c => todo!(), // "SHR", - 0x1d => todo!(), // "SAR", - 0x20 => self.run_keccak256(), // "KECCAK256", - 0x30 => todo!(), // "ADDRESS", - 0x31 => todo!(), // "BALANCE", - 0x32 => todo!(), // "ORIGIN", - 0x33 => todo!(), // "CALLER", - 0x34 => todo!(), // "CALLVALUE", - 0x35 => todo!(), // "CALLDATALOAD", - 0x36 => todo!(), // "CALLDATASIZE", - 0x37 => todo!(), // "CALLDATACOPY", - 0x38 => todo!(), // "CODESIZE", - 0x39 => todo!(), // "CODECOPY", - 0x3a => todo!(), // "GASPRICE", - 0x3b => todo!(), // "EXTCODESIZE", - 0x3c => todo!(), // "EXTCODECOPY", - 0x3d => todo!(), // "RETURNDATASIZE", - 0x3e => todo!(), // "RETURNDATACOPY", - 0x3f => todo!(), // "EXTCODEHASH", - 0x40 => todo!(), // "BLOCKHASH", - 0x41 => todo!(), // "COINBASE", - 0x42 => todo!(), // "TIMESTAMP", - 0x43 => todo!(), // "NUMBER", - 0x44 => todo!(), // "DIFFICULTY", - 0x45 => todo!(), // "GASLIMIT", - 0x46 => todo!(), // "CHAINID", - 0x48 => todo!(), // "BASEFEE", - 0x49 => self.run_prover_input()?, // "PROVER_INPUT", - 0x50 => self.run_pop(), // "POP", - 0x51 => self.run_mload(), // "MLOAD", - 0x52 => self.run_mstore(), // "MSTORE", - 0x53 => self.run_mstore8(), // "MSTORE8", - 0x54 => todo!(), // "SLOAD", - 0x55 => todo!(), // "SSTORE", - 0x56 => self.run_jump(), // "JUMP", - 0x57 => self.run_jumpi(), // "JUMPI", - 0x58 => todo!(), // "GETPC", - 0x59 => todo!(), // "MSIZE", - 0x5a => todo!(), // "GAS", - 0x5b => self.run_jumpdest(), // "JUMPDEST", - 0x5c => todo!(), // "GET_STATE_ROOT", - 0x5d => todo!(), // "SET_STATE_ROOT", - 0x5e => todo!(), // "GET_RECEIPT_ROOT", - 0x5f => todo!(), // "SET_RECEIPT_ROOT", - x if (0x60..0x80).contains(&x) => self.run_push(x - 0x5f), // "PUSH" - x if (0x80..0x90).contains(&x) => self.run_dup(x - 0x7f), // "DUP" - x if (0x90..0xa0).contains(&x) => self.run_swap(x - 0x8f), // "SWAP" - 0xa0 => todo!(), // "LOG0", - 0xa1 => todo!(), // "LOG1", - 0xa2 => todo!(), // "LOG2", - 0xa3 => todo!(), // "LOG3", - 0xa4 => todo!(), // "LOG4", - 0xa5 => bail!("Executed PANIC"), // "PANIC", - 0xf0 => todo!(), // "CREATE", - 0xf1 => todo!(), // "CALL", - 0xf2 => todo!(), // "CALLCODE", - 0xf3 => todo!(), // "RETURN", - 0xf4 => todo!(), // "DELEGATECALL", - 0xf5 => todo!(), // "CREATE2", - 0xf6 => self.run_get_context(), // "GET_CONTEXT", - 0xf7 => self.run_set_context(), // "SET_CONTEXT", - 0xf8 => todo!(), // "CONSUME_GAS", - 0xf9 => todo!(), // "EXIT_KERNEL", - 0xfa => todo!(), // "STATICCALL", - 0xfb => self.run_mload_general(), // "MLOAD_GENERAL", - 0xfc => self.run_mstore_general(), // "MSTORE_GENERAL", - 0xfd => todo!(), // "REVERT", - 0xfe => bail!("Executed INVALID"), // "INVALID", - 0xff => todo!(), // "SELFDESTRUCT", + 0x00 => self.run_stop(), // "STOP", + 0x01 => self.run_add(), // "ADD", + 0x02 => self.run_mul(), // "MUL", + 0x03 => self.run_sub(), // "SUB", + 0x04 => self.run_div(), // "DIV", + 0x05 => todo!(), // "SDIV", + 0x06 => self.run_mod(), // "MOD", + 0x07 => todo!(), // "SMOD", + 0x08 => self.run_addmod(), // "ADDMOD", + 0x09 => self.run_mulmod(), // "MULMOD", + 0x0a => self.run_exp(), // "EXP", + 0x0b => todo!(), // "SIGNEXTEND", + 0x10 => self.run_lt(), // "LT", + 0x11 => self.run_gt(), // "GT", + 0x12 => todo!(), // "SLT", + 0x13 => todo!(), // "SGT", + 0x14 => self.run_eq(), // "EQ", + 0x15 => self.run_iszero(), // "ISZERO", + 0x16 => self.run_and(), // "AND", + 0x17 => self.run_or(), // "OR", + 0x18 => self.run_xor(), // "XOR", + 0x19 => self.run_not(), // "NOT", + 0x1a => self.run_byte(), // "BYTE", + 0x1b => self.run_shl(), // "SHL", + 0x1c => todo!(), // "SHR", + 0x1d => todo!(), // "SAR", + 0x20 => self.run_keccak256(), // "KECCAK256", + 0x30 => todo!(), // "ADDRESS", + 0x31 => todo!(), // "BALANCE", + 0x32 => todo!(), // "ORIGIN", + 0x33 => todo!(), // "CALLER", + 0x34 => todo!(), // "CALLVALUE", + 0x35 => todo!(), // "CALLDATALOAD", + 0x36 => todo!(), // "CALLDATASIZE", + 0x37 => todo!(), // "CALLDATACOPY", + 0x38 => todo!(), // "CODESIZE", + 0x39 => todo!(), // "CODECOPY", + 0x3a => todo!(), // "GASPRICE", + 0x3b => todo!(), // "EXTCODESIZE", + 0x3c => todo!(), // "EXTCODECOPY", + 0x3d => todo!(), // "RETURNDATASIZE", + 0x3e => todo!(), // "RETURNDATACOPY", + 0x3f => todo!(), // "EXTCODEHASH", + 0x40 => todo!(), // "BLOCKHASH", + 0x41 => todo!(), // "COINBASE", + 0x42 => todo!(), // "TIMESTAMP", + 0x43 => todo!(), // "NUMBER", + 0x44 => todo!(), // "DIFFICULTY", + 0x45 => todo!(), // "GASLIMIT", + 0x46 => todo!(), // "CHAINID", + 0x48 => todo!(), // "BASEFEE", + 0x49 => self.run_prover_input()?, // "PROVER_INPUT", + 0x50 => self.run_pop(), // "POP", + 0x51 => self.run_mload(), // "MLOAD", + 0x52 => self.run_mstore(), // "MSTORE", + 0x53 => self.run_mstore8(), // "MSTORE8", + 0x54 => todo!(), // "SLOAD", + 0x55 => todo!(), // "SSTORE", + 0x56 => self.run_jump(), // "JUMP", + 0x57 => self.run_jumpi(), // "JUMPI", + 0x58 => todo!(), // "GETPC", + 0x59 => todo!(), // "MSIZE", + 0x5a => todo!(), // "GAS", + 0x5b => self.run_jumpdest(), // "JUMPDEST", + 0x5c => todo!(), // "GET_STATE_ROOT", + 0x5d => todo!(), // "SET_STATE_ROOT", + 0x5e => todo!(), // "GET_RECEIPT_ROOT", + 0x5f => todo!(), // "SET_RECEIPT_ROOT", + x if (0x60..0x80).contains(&x) => self.run_push(x - 0x5f), // "PUSH" + x if (0x80..0x90).contains(&x) => self.run_dup(x - 0x7f), // "DUP" + x if (0x90..0xa0).contains(&x) => self.run_swap(x - 0x8f)?, // "SWAP" + 0xa0 => todo!(), // "LOG0", + 0xa1 => todo!(), // "LOG1", + 0xa2 => todo!(), // "LOG2", + 0xa3 => todo!(), // "LOG3", + 0xa4 => todo!(), // "LOG4", + 0xa5 => bail!("Executed PANIC"), // "PANIC", + 0xf0 => todo!(), // "CREATE", + 0xf1 => todo!(), // "CALL", + 0xf2 => todo!(), // "CALLCODE", + 0xf3 => todo!(), // "RETURN", + 0xf4 => todo!(), // "DELEGATECALL", + 0xf5 => todo!(), // "CREATE2", + 0xf6 => self.run_get_context(), // "GET_CONTEXT", + 0xf7 => self.run_set_context(), // "SET_CONTEXT", + 0xf8 => todo!(), // "CONSUME_GAS", + 0xf9 => todo!(), // "EXIT_KERNEL", + 0xfa => todo!(), // "STATICCALL", + 0xfb => self.run_mload_general(), // "MLOAD_GENERAL", + 0xfc => self.run_mstore_general(), // "MSTORE_GENERAL", + 0xfd => todo!(), // "REVERT", + 0xfe => bail!("Executed INVALID"), // "INVALID", + 0xff => todo!(), // "SELFDESTRUCT", _ => bail!("Unrecognized opcode {}.", opcode), }; Ok(()) @@ -522,9 +531,11 @@ impl<'a> Interpreter<'a> { self.push(self.stack()[self.stack().len() - n as usize]); } - fn run_swap(&mut self, n: u8) { + fn run_swap(&mut self, n: u8) -> anyhow::Result<()> { let len = self.stack().len(); + ensure!(len > n as usize); self.stack_mut().swap(len - 1, len - n as usize - 1); + Ok(()) } fn run_get_context(&mut self) { diff --git a/evm/src/cpu/kernel/tests/mod.rs b/evm/src/cpu/kernel/tests/mod.rs index 925db56f..a9c8c08c 100644 --- a/evm/src/cpu/kernel/tests/mod.rs +++ b/evm/src/cpu/kernel/tests/mod.rs @@ -2,6 +2,7 @@ mod core; mod curve_ops; mod ecrecover; mod exp; +mod mpt; mod packing; mod rlp; mod transaction_parsing; diff --git a/evm/src/cpu/kernel/tests/mpt/load.rs b/evm/src/cpu/kernel/tests/mpt/load.rs new file mode 100644 index 00000000..871a8682 --- /dev/null +++ b/evm/src/cpu/kernel/tests/mpt/load.rs @@ -0,0 +1,67 @@ +use anyhow::Result; +use eth_trie_utils::partial_trie::{Nibbles, PartialTrie}; +use ethereum_types::U256; + +use crate::cpu::kernel::aggregator::KERNEL; +use crate::cpu::kernel::constants::trie_type::PartialTrieType; +use crate::cpu::kernel::global_metadata::GlobalMetadata; +use crate::cpu::kernel::interpreter::Interpreter; +use crate::generation::mpt::all_mpt_prover_inputs_reversed; +use crate::generation::TrieInputs; + +#[test] +fn load_all_mpts() -> Result<()> { + let nonce = U256::from(1111); + let balance = U256::from(2222); + let storage_root = U256::from(3333); + let code_hash = U256::from(4444); + + let value_rlp = rlp::encode_list(&[nonce, balance, storage_root, code_hash]); + + let trie_inputs = TrieInputs { + state_trie: PartialTrie::Leaf { + nibbles: Nibbles { + count: 2, + packed: 123.into(), + }, + value: value_rlp.to_vec(), + }, + transactions_trie: Default::default(), + receipts_trie: Default::default(), + storage_tries: vec![], + }; + + let load_all_mpts = KERNEL.global_labels["load_all_mpts"]; + + // Contract creation transaction. + 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); + interpreter.run()?; + assert_eq!(interpreter.stack(), vec![]); + + let type_empty = U256::from(PartialTrieType::Empty as u32); + let type_leaf = U256::from(PartialTrieType::Leaf as u32); + assert_eq!( + interpreter.get_trie_data(), + vec![ + 0.into(), // First address is unused, so 0 can be treated as a null pointer. + type_leaf, + 2.into(), + 123.into(), + nonce, + balance, + storage_root, + code_hash, + type_empty, + type_empty, + ] + ); + + assert_eq!( + interpreter.get_global_metadata_field(GlobalMetadata::NumStorageTries), + trie_inputs.storage_tries.len().into() + ); + + Ok(()) +} diff --git a/evm/src/cpu/kernel/tests/mpt/mod.rs b/evm/src/cpu/kernel/tests/mpt/mod.rs new file mode 100644 index 00000000..4295c3bf --- /dev/null +++ b/evm/src/cpu/kernel/tests/mpt/mod.rs @@ -0,0 +1 @@ +mod load; diff --git a/evm/src/generation/mod.rs b/evm/src/generation/mod.rs index f91b70d2..511aa009 100644 --- a/evm/src/generation/mod.rs +++ b/evm/src/generation/mod.rs @@ -30,6 +30,17 @@ pub(crate) mod state; pub struct GenerationInputs { pub signed_txns: Vec>, + pub tries: TrieInputs, + + /// Mapping between smart contract code hashes and the contract byte code. + /// All account smart contracts that are invoked will have an entry present. + pub contract_code: HashMap>, + + pub block_metadata: BlockMetadata, +} + +#[derive(Clone, Debug, Deserialize, Serialize, Default)] +pub struct TrieInputs { /// A partial version of the state trie prior to these transactions. It should include all nodes /// that will be accessed by these transactions. pub state_trie: PartialTrie, @@ -45,12 +56,6 @@ pub struct GenerationInputs { /// A partial version of each storage trie prior to these transactions. It should include all /// storage tries, and nodes therein, that will be accessed by these transactions. pub storage_tries: Vec<(Address, PartialTrie)>, - - /// Mapping between smart contract code hashes and the contract byte code. - /// All account smart contracts that are invoked will have an entry present. - pub contract_code: HashMap>, - - pub block_metadata: BlockMetadata, } pub(crate) fn generate_traces, const D: usize>( diff --git a/evm/src/generation/mpt.rs b/evm/src/generation/mpt.rs index eba53781..f689b613 100644 --- a/evm/src/generation/mpt.rs +++ b/evm/src/generation/mpt.rs @@ -2,22 +2,34 @@ use eth_trie_utils::partial_trie::PartialTrie; use ethereum_types::U256; use crate::cpu::kernel::constants::trie_type::PartialTrieType; -use crate::generation::GenerationInputs; +use crate::generation::TrieInputs; -pub(crate) fn all_mpt_prover_inputs(inputs: &GenerationInputs) -> Vec { +pub(crate) fn all_mpt_prover_inputs_reversed(trie_inputs: &TrieInputs) -> Vec { + let mut inputs = all_mpt_prover_inputs(trie_inputs); + inputs.reverse(); + inputs +} + +/// 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) -> Vec { let mut prover_inputs = vec![]; - mpt_prover_inputs(&inputs.state_trie, &mut prover_inputs, &|_rlp| vec![]); // TODO + mpt_prover_inputs(&trie_inputs.state_trie, &mut prover_inputs, &|rlp| { + rlp::decode_list(rlp) + }); - mpt_prover_inputs( - &inputs.transactions_trie, - &mut prover_inputs, - &|_rlp| vec![], - ); // TODO + mpt_prover_inputs(&trie_inputs.transactions_trie, &mut prover_inputs, &|rlp| { + rlp::decode_list(rlp) + }); - mpt_prover_inputs(&inputs.receipts_trie, &mut prover_inputs, &|_rlp| vec![]); // TODO + mpt_prover_inputs(&trie_inputs.receipts_trie, &mut prover_inputs, &|_rlp| { + // TODO: Decode receipt RLP. + vec![] + }); - for (_addr, storage_trie) in &inputs.storage_tries { + prover_inputs.push(trie_inputs.storage_tries.len().into()); + for (addr, storage_trie) in &trie_inputs.storage_tries { + prover_inputs.push(addr.0.as_ref().into()); mpt_prover_inputs(storage_trie, &mut prover_inputs, &|leaf_be| { vec![U256::from_big_endian(leaf_be)] }); @@ -45,7 +57,9 @@ pub(crate) fn mpt_prover_inputs( for child in children { mpt_prover_inputs(child, prover_inputs, parse_leaf); } - prover_inputs.extend(parse_leaf(value)); + let leaf = parse_leaf(value); + prover_inputs.push(leaf.len().into()); + prover_inputs.extend(leaf); } PartialTrie::Extension { nibbles, child } => { prover_inputs.push(nibbles.count.into()); @@ -55,7 +69,9 @@ pub(crate) fn mpt_prover_inputs( PartialTrie::Leaf { nibbles, value } => { prover_inputs.push(nibbles.count.into()); prover_inputs.push(nibbles.packed); - prover_inputs.extend(parse_leaf(value)); + let leaf = parse_leaf(value); + prover_inputs.push(leaf.len().into()); + prover_inputs.extend(leaf); } } } diff --git a/evm/src/generation/prover_input.rs b/evm/src/generation/prover_input.rs index 7b49807c..c6051a4d 100644 --- a/evm/src/generation/prover_input.rs +++ b/evm/src/generation/prover_input.rs @@ -25,7 +25,7 @@ impl GenerationState { pub(crate) fn prover_input(&mut self, stack: &[U256], input_fn: &ProverInputFn) -> U256 { match input_fn.0[0].as_str() { "ff" => self.run_ff(stack, input_fn), - "mpt" => self.run_mpt(input_fn), + "mpt" => self.run_mpt(), _ => panic!("Unrecognized prover input function."), } } @@ -39,16 +39,10 @@ impl GenerationState { } /// MPT data. - fn run_mpt(&mut self, input_fn: &ProverInputFn) -> U256 { - let operation = input_fn.0[1].as_str(); - match operation { - "trie_data" => self - .mpt_prover_inputs - .pop() - .unwrap_or_else(|| panic!("Out of MPT data")), - "num_storage_tries" => self.inputs.storage_tries.len().into(), - _ => panic!("Unrecognized MPT operation."), - } + fn run_mpt(&mut self) -> U256 { + self.mpt_prover_inputs + .pop() + .unwrap_or_else(|| panic!("Out of MPT data")) } } diff --git a/evm/src/generation/state.rs b/evm/src/generation/state.rs index 3319a604..b8ae9735 100644 --- a/evm/src/generation/state.rs +++ b/evm/src/generation/state.rs @@ -6,7 +6,7 @@ use tiny_keccak::keccakf; use crate::cpu::columns::{CpuColumnsView, NUM_CPU_COLUMNS}; use crate::generation::memory::MemoryState; -use crate::generation::mpt::all_mpt_prover_inputs; +use crate::generation::mpt::all_mpt_prover_inputs_reversed; use crate::generation::GenerationInputs; use crate::keccak_memory::keccak_memory_stark::KeccakMemoryOp; use crate::memory::memory_stark::MemoryOp; @@ -17,6 +17,7 @@ use crate::{keccak, logic}; #[derive(Debug)] pub(crate) struct GenerationState { + #[allow(unused)] // TODO: Should be used soon. pub(crate) inputs: GenerationInputs, pub(crate) cpu_rows: Vec<[F; NUM_CPU_COLUMNS]>, pub(crate) current_cpu_row: CpuColumnsView, @@ -35,8 +36,7 @@ pub(crate) struct GenerationState { impl GenerationState { pub(crate) fn new(inputs: GenerationInputs) -> Self { - let mut mpt_prover_inputs = all_mpt_prover_inputs(&inputs); - mpt_prover_inputs.reverse(); + let mpt_prover_inputs = all_mpt_prover_inputs_reversed(&inputs.tries); Self { inputs, diff --git a/evm/tests/transfer_to_new_addr.rs b/evm/tests/transfer_to_new_addr.rs index 82f4938b..1c74366e 100644 --- a/evm/tests/transfer_to_new_addr.rs +++ b/evm/tests/transfer_to_new_addr.rs @@ -7,7 +7,7 @@ use plonky2::plonk::config::PoseidonGoldilocksConfig; use plonky2::util::timing::TimingTree; use plonky2_evm::all_stark::AllStark; use plonky2_evm::config::StarkConfig; -use plonky2_evm::generation::GenerationInputs; +use plonky2_evm::generation::{GenerationInputs, TrieInputs}; use plonky2_evm::proof::BlockMetadata; use plonky2_evm::prover::prove; use plonky2_evm::verifier::verify_proof; @@ -29,10 +29,12 @@ fn test_simple_transfer() -> anyhow::Result<()> { let inputs = GenerationInputs { signed_txns: vec![txn.to_vec()], - state_trie: PartialTrie::Empty, - transactions_trie: PartialTrie::Empty, - receipts_trie: PartialTrie::Empty, - storage_tries: vec![], + tries: TrieInputs { + state_trie: PartialTrie::Empty, + transactions_trie: PartialTrie::Empty, + receipts_trie: PartialTrie::Empty, + storage_tries: vec![], + }, contract_code: HashMap::new(), block_metadata, };