mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 00:03:10 +00:00
parent
c0ced26f5e
commit
a8e5613bc5
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user