From 06936c7649066d6dc59b2d2a2e25ea05ad49d1c9 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 22 Mar 2023 06:42:14 +0100 Subject: [PATCH 1/2] Implement various syscalls (#930) * Bunch of syscalls * Minor * Minor * Minor * Add todo for overflow --- evm/src/cpu/kernel/asm/account_code.asm | 6 -- evm/src/cpu/kernel/asm/core/syscall_stubs.asm | 23 ----- evm/src/cpu/kernel/asm/memory/metadata.asm | 91 +++++++++++++++++++ evm/src/cpu/kernel/asm/memory/syscalls.asm | 29 ++++++ evm/src/cpu/kernel/asm/memory/txn_fields.asm | 13 +++ 5 files changed, 133 insertions(+), 29 deletions(-) diff --git a/evm/src/cpu/kernel/asm/account_code.asm b/evm/src/cpu/kernel/asm/account_code.asm index 9f8cafcb..10d0a686 100644 --- a/evm/src/cpu/kernel/asm/account_code.asm +++ b/evm/src/cpu/kernel/asm/account_code.asm @@ -55,12 +55,6 @@ global extcodesize: // stack: extcodesize(address), retdest SWAP1 JUMP -%macro codecopy - // stack: dest_offset, offset, size - %address - %extcodecopy -%endmacro - %macro extcodecopy // stack: address, dest_offset, offset, size %stack (address, dest_offset, offset, size) -> (address, dest_offset, offset, size, %%after) diff --git a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm index 610c7502..f94bcad4 100644 --- a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm +++ b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm @@ -13,32 +13,11 @@ global sys_sgt: PANIC global sys_sar: PANIC -global sys_origin: - PANIC -global sys_calldatasize: - PANIC -global sys_calldatacopy: - PANIC -global sys_codecopy: - PANIC -global sys_returndatasize: - PANIC -global sys_returndatacopy: - PANIC global sys_blockhash: PANIC -global sys_coinbase: - PANIC -global sys_timestamp: - PANIC -global sys_number: - PANIC global sys_prevrandao: // TODO: What semantics will this have for Edge? PANIC -global sys_gaslimit: - // TODO: Return the block's gas limit. - PANIC global sys_chainid: // TODO: Return the block's chain ID instead of the txn's, even though they should match. // stack: kexit_info @@ -48,8 +27,6 @@ global sys_chainid: // stack: chain_id, kexit_info SWAP1 EXIT_KERNEL -global sys_basefee: - PANIC global sys_log0: PANIC global sys_log1: diff --git a/evm/src/cpu/kernel/asm/memory/metadata.asm b/evm/src/cpu/kernel/asm/memory/metadata.asm index 89b39707..d891c0d1 100644 --- a/evm/src/cpu/kernel/asm/memory/metadata.asm +++ b/evm/src/cpu/kernel/asm/memory/metadata.asm @@ -104,6 +104,97 @@ global sys_msize: SWAP1 EXIT_KERNEL +%macro calldatasize + %mload_context_metadata(@CTX_METADATA_CALLDATA_SIZE) +%endmacro + +global sys_calldatasize: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %calldatasize + // stack: calldatasize, kexit_info + SWAP1 + EXIT_KERNEL + +%macro returndatasize + %mload_context_metadata(@CTX_METADATA_RETURNDATA_SIZE) +%endmacro + +global sys_returndatasize: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %returndatasize + // stack: returndatasize, kexit_info + SWAP1 + EXIT_KERNEL + +%macro coinbase + %mload_global_metadata(@GLOBAL_METADATA_BLOCK_BENEFICIARY) +%endmacro + +global sys_coinbase: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %coinbase + // stack: coinbase, kexit_info + SWAP1 + EXIT_KERNEL + +%macro timestamp + %mload_global_metadata(@GLOBAL_METADATA_BLOCK_TIMESTAMP) +%endmacro + +global sys_timestamp: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %timestamp + // stack: timestamp, kexit_info + SWAP1 + EXIT_KERNEL + +%macro blocknumber + %mload_global_metadata(@GLOBAL_METADATA_BLOCK_NUMBER) +%endmacro + +global sys_number: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %blocknumber + // stack: blocknumber, kexit_info + SWAP1 + EXIT_KERNEL + +%macro blockgaslimit + %mload_global_metadata(@GLOBAL_METADATA_BLOCK_GAS_LIMIT) +%endmacro + +global sys_gaslimit: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %blockgaslimit + // stack: blockgaslimit, kexit_info + SWAP1 + EXIT_KERNEL + +%macro basefee + %mload_global_metadata(@GLOBAL_METADATA_BLOCK_BASE_FEE) +%endmacro + +global sys_basefee: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %basefee + // stack: basefee, kexit_info + SWAP1 + EXIT_KERNEL + %macro update_mem_words // stack: num_words, kexit_info %mem_words diff --git a/evm/src/cpu/kernel/asm/memory/syscalls.asm b/evm/src/cpu/kernel/asm/memory/syscalls.asm index 3045be6d..11f8054b 100644 --- a/evm/src/cpu/kernel/asm/memory/syscalls.asm +++ b/evm/src/cpu/kernel/asm/memory/syscalls.asm @@ -118,3 +118,32 @@ sys_calldataload_after_mload_packing: SWAP1 EXIT_KERNEL PANIC + +// Macro for {CALLDATA,CODE,RETURNDATA}COPY (W_copy in Yellow Paper). +%macro wcopy(segment) + // stack: kexit_info, dest_offset, offset, size + DUP4 %num_bytes_to_num_words %mul_const(@GAS_COPY) %add_const(@GAS_VERYLOW) %charge_gas + + %stack (kexit_info, dest_offset, offset, size) -> (dest_offset, size, dest_offset, offset, size, kexit_info) + ADD // TODO: check for overflow, see discussion here https://github.com/mir-protocol/plonky2/pull/930/files/a4ea0965d79561c345e2f77836c07949c7e0bc69#r1143630253 + // stack: expanded_num_bytes, dest_offset, offset, size, kexit_info + DUP1 %ensure_reasonable_offset + %update_mem_bytes + + GET_CONTEXT + %stack (context, dest_offset, offset, size, kexit_info) -> + (context, @SEGMENT_MAIN_MEMORY, dest_offset, context, $segment, offset, size, %%after, kexit_info) + %jump(memcpy) +%%after: + // stack: kexit_info + EXIT_KERNEL +%endmacro + +global sys_calldatacopy: + %wcopy(@SEGMENT_CALLDATA) + +global sys_codecopy: + %wcopy(@SEGMENT_CODE) + +global sys_returndatacopy: + %wcopy(@SEGMENT_RETURNDATA) diff --git a/evm/src/cpu/kernel/asm/memory/txn_fields.asm b/evm/src/cpu/kernel/asm/memory/txn_fields.asm index d15b7264..e4e6b875 100644 --- a/evm/src/cpu/kernel/asm/memory/txn_fields.asm +++ b/evm/src/cpu/kernel/asm/memory/txn_fields.asm @@ -15,3 +15,16 @@ %mstore_kernel(@SEGMENT_NORMALIZED_TXN) // stack: (empty) %endmacro + +%macro origin + %mload_txn_field(@TXN_FIELD_ORIGIN) +%endmacro + +global sys_origin: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %origin + // stack: origin, kexit_info + SWAP1 + EXIT_KERNEL From d0b2b81e11af606b45f5e7f5e9206b9ce11d72dc Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 22 Mar 2023 18:43:41 +0100 Subject: [PATCH 2/2] More MemoryError (#932) --- evm/src/witness/operation.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/evm/src/witness/operation.rs b/evm/src/witness/operation.rs index 43576ff4..8ed0e551 100644 --- a/evm/src/witness/operation.rs +++ b/evm/src/witness/operation.rs @@ -11,7 +11,9 @@ use crate::cpu::membus::NUM_GP_CHANNELS; use crate::cpu::simple_logic::eq_iszero::generate_pinv_diff; use crate::generation::state::GenerationState; use crate::memory::segments::Segment; +use crate::witness::errors::MemoryError::{ContextTooLarge, SegmentTooLarge, VirtTooLarge}; use crate::witness::errors::ProgramError; +use crate::witness::errors::ProgramError::MemoryError; use crate::witness::memory::{MemoryAddress, MemoryOp}; use crate::witness::util::{ keccak_sponge_log, mem_read_gp_with_log_and_fill, mem_write_gp_log_and_fill, @@ -632,9 +634,15 @@ pub(crate) fn generate_mstore_general( stack_pop_with_log_and_fill::<4, _>(state, &mut row)?; let address = MemoryAddress { - context: context.as_usize(), - segment: segment.as_usize(), - virt: virt.as_usize(), + context: context + .try_into() + .map_err(|_| MemoryError(ContextTooLarge { context }))?, + segment: segment + .try_into() + .map_err(|_| MemoryError(SegmentTooLarge { segment }))?, + virt: virt + .try_into() + .map_err(|_| MemoryError(VirtTooLarge { virt }))?, }; let log_write = mem_write_gp_log_and_fill(4, address, state, &mut row, val);