From 817156cd479612d7c16369e462550c8ecd6e1894 Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Sat, 8 Oct 2022 13:23:00 -0700 Subject: [PATCH] Begin MPT insert --- evm/src/cpu/kernel/aggregator.rs | 1 + evm/src/cpu/kernel/asm/mpt/delete.asm | 6 ++++ evm/src/cpu/kernel/asm/mpt/read.asm | 2 +- evm/src/cpu/kernel/asm/mpt/write.asm | 50 +++++++++++++++++++++++++-- 4 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 evm/src/cpu/kernel/asm/mpt/delete.asm diff --git a/evm/src/cpu/kernel/aggregator.rs b/evm/src/cpu/kernel/aggregator.rs index 0d94c86f..2dcbd41c 100644 --- a/evm/src/cpu/kernel/aggregator.rs +++ b/evm/src/cpu/kernel/aggregator.rs @@ -39,6 +39,7 @@ pub(crate) fn combined_kernel() -> Kernel { include_str!("asm/memory/metadata.asm"), include_str!("asm/memory/packing.asm"), include_str!("asm/memory/txn_fields.asm"), + include_str!("asm/mpt/delete.asm"), include_str!("asm/mpt/hash.asm"), include_str!("asm/mpt/hash_trie_specific.asm"), include_str!("asm/mpt/hex_prefix.asm"), diff --git a/evm/src/cpu/kernel/asm/mpt/delete.asm b/evm/src/cpu/kernel/asm/mpt/delete.asm new file mode 100644 index 00000000..3e0b8afe --- /dev/null +++ b/evm/src/cpu/kernel/asm/mpt/delete.asm @@ -0,0 +1,6 @@ +// Return a copy of the given node with the given key deleted. +// +// Pre stack: node_ptr, num_nibbles, key, retdest +// Post stack: updated_node_ptr +global mpt_delete: + PANIC // TODO diff --git a/evm/src/cpu/kernel/asm/mpt/read.asm b/evm/src/cpu/kernel/asm/mpt/read.asm index 32ab8f7f..c6f36204 100644 --- a/evm/src/cpu/kernel/asm/mpt/read.asm +++ b/evm/src/cpu/kernel/asm/mpt/read.asm @@ -39,7 +39,7 @@ global mpt_read: DUP1 %eq_const(@MPT_NODE_EXTENSION) %jumpi(mpt_read_extension) DUP1 %eq_const(@MPT_NODE_LEAF) %jumpi(mpt_read_leaf) - // There's still the MPT_NODE_HASH case, but if we hit a digest node, + // There's still the MPT_NODE_HASH case, but if we hit a hash node, // it means the prover failed to provide necessary Merkle data, so panic. PANIC diff --git a/evm/src/cpu/kernel/asm/mpt/write.asm b/evm/src/cpu/kernel/asm/mpt/write.asm index 5b59d016..eab51d3e 100644 --- a/evm/src/cpu/kernel/asm/mpt/write.asm +++ b/evm/src/cpu/kernel/asm/mpt/write.asm @@ -1,3 +1,47 @@ -global mpt_write: - // stack: node_ptr, num_nibbles, key, retdest - // TODO +// TODO: Need a special case for deleting, if value = ''. +// Or canonicalize once, before final hashing, to remove empty leaves etc. + +// Return a copy of the given node, with the given key set to the given value. +// +// Pre stack: node_ptr, num_nibbles, key, value_ptr, retdest +// Post stack: updated_node_ptr +global mpt_insert: + // stack: node_ptr, num_nibbles, key, value_ptr, retdest + DUP1 %mload_trie_data + // stack: node_type, node_ptr, num_nibbles, key, value_ptr, retdest + // Increment node_ptr, so it points to the node payload instead of its type. + SWAP1 %increment SWAP1 + // stack: node_type, node_payload_ptr, num_nibbles, key, value_ptr, retdest + + DUP1 %eq_const(@MPT_NODE_EMPTY) %jumpi(mpt_insert_empty) + DUP1 %eq_const(@MPT_NODE_BRANCH) %jumpi(mpt_insert_branch) + DUP1 %eq_const(@MPT_NODE_EXTENSION) %jumpi(mpt_insert_extension) + DUP1 %eq_const(@MPT_NODE_LEAF) %jumpi(mpt_insert_leaf) + + // There's still the MPT_NODE_HASH case, but if we hit a hash node, + // it means the prover failed to provide necessary Merkle data, so panic. + PANIC + +mpt_insert_empty: + // stack: node_type, node_payload_ptr, num_nibbles, key, value_ptr, retdest + POP + // stack: node_payload_ptr, num_nibbles, key, value_ptr, retdest + PANIC // TODO + +mpt_insert_branch: + // stack: node_type, node_payload_ptr, num_nibbles, key, value_ptr, retdest + POP + // stack: node_payload_ptr, num_nibbles, key, value_ptr, retdest + PANIC // TODO + +mpt_insert_extension: + // stack: node_type, node_payload_ptr, num_nibbles, key, value_ptr, retdest + POP + // stack: node_payload_ptr, num_nibbles, key, value_ptr, retdest + PANIC // TODO + +mpt_insert_leaf: + // stack: node_type, node_payload_ptr, num_nibbles, key, value_ptr, retdest + POP + // stack: node_payload_ptr, num_nibbles, key, value_ptr, retdest + PANIC // TODO