From a8e5613bc5c7ff58aecd55fad8b257f3a2a3145e Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Thu, 20 Apr 2023 06:56:47 +0200 Subject: [PATCH] EOA to precompiles logic (#993) * Start * Progress * Comments * Minor --- .../kernel/asm/core/precompiles/bn_add.asm | 4 +- .../kernel/asm/core/precompiles/bn_mul.asm | 4 +- .../cpu/kernel/asm/core/precompiles/ecrec.asm | 4 +- .../cpu/kernel/asm/core/precompiles/id.asm | 4 +- .../cpu/kernel/asm/core/precompiles/main.asm | 40 +++++++++++++++++-- .../kernel/asm/core/precompiles/rip160.asm | 4 +- .../kernel/asm/core/precompiles/sha256.asm | 4 +- evm/src/cpu/kernel/asm/core/process_txn.asm | 13 +++--- 8 files changed, 55 insertions(+), 22 deletions(-) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm b/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm index ca8bbb5a..ee036355 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/bn_add.asm @@ -1,7 +1,7 @@ global precompile_bn_add: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm b/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm index 554849ab..d83597ba 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/bn_mul.asm @@ -1,7 +1,7 @@ global precompile_bn_mul: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm b/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm index e4a03a99..f19b57be 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/ecrec.asm @@ -1,7 +1,7 @@ global precompile_ecrec: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/id.asm b/evm/src/cpu/kernel/asm/core/precompiles/id.asm index 167d99f5..7cfb6dfc 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/id.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/id.asm @@ -1,7 +1,7 @@ global precompile_id: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/main.asm b/evm/src/cpu/kernel/asm/core/precompiles/main.asm index edf53a13..df9b77ec 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/main.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/main.asm @@ -1,16 +1,16 @@ %macro handle_precompiles - // stack: address, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, new_ctx, (old stack) PUSH %%after SWAP1 - // stack: address, %%after, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, %%after, new_ctx, (old stack) %jump(handle_precompiles) %%after: - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) %pop4 %endmacro global handle_precompiles: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) DUP1 %eq_const(@ECREC) %jumpi(precompile_ecrec) DUP1 %eq_const(@SHA256) %jumpi(precompile_sha256) DUP1 %eq_const(@RIP160) %jumpi(precompile_rip160) @@ -31,6 +31,38 @@ global pop_and_return_success: PUSH 1 // success %jump(terminate_common) +%macro handle_precompiles_from_eoa + // stack: retdest + %mload_txn_field(@TXN_FIELD_TO) + // stack: addr, retdest + DUP1 %ge_const(@ECREC) DUP2 %le_const(@BLAKE2_F) + // stack: addr<=9, addr>=1, addr, retdest + MUL // Cheaper than AND + %jumpi(handle_precompiles_from_eoa) + // stack: addr, retdest + POP +%endmacro + +global handle_precompiles_from_eoa: + // stack: addr, retdest + %create_context + // stack: new_ctx, addr, retdest + %set_new_ctx_parent_pc(process_message_txn_after_call) + %non_intrinisic_gas %set_new_ctx_gas_limit + // stack: new_ctx, addr, retdest + + // Set calldatasize and copy txn data to calldata. + %mload_txn_field(@TXN_FIELD_DATA_LEN) + %stack (calldata_size, new_ctx) -> (calldata_size, new_ctx, calldata_size) + %set_new_ctx_calldata_size + %stack (new_ctx, calldata_size) -> (new_ctx, @SEGMENT_CALLDATA, 0, 0, @SEGMENT_TXN_DATA, 0, calldata_size, handle_precompiles_from_eoa_finish, new_ctx) + %jump(memcpy) + +handle_precompiles_from_eoa_finish: + %stack (new_ctx, addr, retdest) -> (addr, new_ctx, retdest) + %handle_precompiles + PANIC // We already checked that a precompile is called, so this should be unreachable. + %macro zero_out_kernel_general PUSH 0 PUSH 0 %mstore_kernel_general PUSH 0 PUSH 1 %mstore_kernel_general diff --git a/evm/src/cpu/kernel/asm/core/precompiles/rip160.asm b/evm/src/cpu/kernel/asm/core/precompiles/rip160.asm index 2f7b2c32..70711234 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/rip160.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/rip160.asm @@ -1,7 +1,7 @@ global precompile_rip160: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/precompiles/sha256.asm b/evm/src/cpu/kernel/asm/core/precompiles/sha256.asm index 86461a59..9ed59d8b 100644 --- a/evm/src/cpu/kernel/asm/core/precompiles/sha256.asm +++ b/evm/src/cpu/kernel/asm/core/precompiles/sha256.asm @@ -1,7 +1,7 @@ global precompile_sha256: - // stack: address, retdest, new_ctx, kexit_info, ret_offset, ret_size + // stack: address, retdest, new_ctx, (old stack) %pop2 - // stack: new_ctx, kexit_info, ret_offset, ret_size + // stack: new_ctx, (old stack) DUP1 SET_CONTEXT // stack: (empty) diff --git a/evm/src/cpu/kernel/asm/core/process_txn.asm b/evm/src/cpu/kernel/asm/core/process_txn.asm index a626cd39..4f72fe94 100644 --- a/evm/src/cpu/kernel/asm/core/process_txn.asm +++ b/evm/src/cpu/kernel/asm/core/process_txn.asm @@ -165,6 +165,13 @@ global process_message_txn: %jumpi(process_message_txn_insufficient_balance) // stack: retdest + %handle_precompiles_from_eoa + + // If to's code is empty, return. + %mload_txn_field(@TXN_FIELD_TO) %ext_code_empty + // stack: code_empty, retdest + %jumpi(process_message_txn_return) + // Add precompiles to accessed addresses. PUSH @ECREC %insert_accessed_addresses_no_return PUSH @SHA256 %insert_accessed_addresses_no_return @@ -175,12 +182,6 @@ global process_message_txn: PUSH @BN_MUL %insert_accessed_addresses_no_return PUSH @SNARKV %insert_accessed_addresses_no_return PUSH @BLAKE2_F %insert_accessed_addresses_no_return - // TODO: Handle precompiles. - - // If to's code is empty, return. - %mload_txn_field(@TXN_FIELD_TO) %ext_code_empty - // stack: code_empty, retdest - %jumpi(process_message_txn_return) // Otherwise, load to's code and execute it in a new context. // stack: retdest