mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-05 23:33:07 +00:00
Check if context is static for state-changing opcodes (#973)
* Check if context is static for state-changing opcodes * PR feedback
This commit is contained in:
parent
142be4e114
commit
c7e60073f0
@ -2,7 +2,15 @@
|
|||||||
|
|
||||||
// Creates a new sub context and executes the code of the given account.
|
// Creates a new sub context and executes the code of the given account.
|
||||||
global sys_call:
|
global sys_call:
|
||||||
|
// Check that the value is zero if the context is static.
|
||||||
// stack: kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size
|
// stack: kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size
|
||||||
|
DUP4 ISZERO %not_bit
|
||||||
|
// stack: value≠0, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size
|
||||||
|
%mload_context_metadata(@CTX_METADATA_STATIC)
|
||||||
|
// stack: is_static, value≠0, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size
|
||||||
|
MUL // Cheaper than AND
|
||||||
|
%jumpi(fault_exception)
|
||||||
|
|
||||||
SWAP2
|
SWAP2
|
||||||
// stack: address, gas, kexit_info, value, args_offset, args_size, ret_offset, ret_size
|
// stack: address, gas, kexit_info, value, args_offset, args_size, ret_offset, ret_size
|
||||||
%u256_to_addr // Truncate to 160 bits
|
%u256_to_addr // Truncate to 160 bits
|
||||||
@ -311,7 +319,7 @@ global after_call_instruction:
|
|||||||
|
|
||||||
// Compute C_xfer
|
// Compute C_xfer
|
||||||
// stack: Caaccess, address, gas, kexit_info, value
|
// stack: Caaccess, address, gas, kexit_info, value
|
||||||
DUP5 ISZERO PUSH 1 SUB
|
DUP5 ISZERO %not_bit
|
||||||
// stack: value≠0, Caaccess, address, gas, kexit_info, value
|
// stack: value≠0, Caaccess, address, gas, kexit_info, value
|
||||||
DUP1
|
DUP1
|
||||||
%mul_const(@GAS_CALLVALUE)
|
%mul_const(@GAS_CALLVALUE)
|
||||||
@ -336,7 +344,7 @@ global after_call_instruction:
|
|||||||
// stack: leftover_gas<Cextra, leftover_gas, Cextra, address, gas, kexit_info, value
|
// stack: leftover_gas<Cextra, leftover_gas, Cextra, address, gas, kexit_info, value
|
||||||
DUP5 DUP2 MUL
|
DUP5 DUP2 MUL
|
||||||
// stack: (leftover_gas<Cextra)*gas, leftover_gas<Cextra, leftover_gas, Cextra, address, gas, kexit_info, value
|
// stack: (leftover_gas<Cextra)*gas, leftover_gas<Cextra, leftover_gas, Cextra, address, gas, kexit_info, value
|
||||||
SWAP1 PUSH 1 SUB
|
SWAP1 %not_bit
|
||||||
// stack: leftover_gas>=Cextra, (leftover_gas<Cextra)*gas, leftover_gas, Cextra, address, gas, kexit_info, value
|
// stack: leftover_gas>=Cextra, (leftover_gas<Cextra)*gas, leftover_gas, Cextra, address, gas, kexit_info, value
|
||||||
DUP4 DUP4 SUB
|
DUP4 DUP4 SUB
|
||||||
// stack: leftover_gas - Cextra, leftover_gas>=Cextra, (leftover_gas<Cextra)*gas, leftover_gas, Cextra, address, gas, kexit_info, value
|
// stack: leftover_gas - Cextra, leftover_gas>=Cextra, (leftover_gas<Cextra)*gas, leftover_gas, Cextra, address, gas, kexit_info, value
|
||||||
@ -355,7 +363,7 @@ global after_call_instruction:
|
|||||||
// Compute C_callgas
|
// Compute C_callgas
|
||||||
%stack (kexit_info, Cgascap, address, gas, value) ->
|
%stack (kexit_info, Cgascap, address, gas, value) ->
|
||||||
(Cgascap, address, gas, kexit_info, value)
|
(Cgascap, address, gas, kexit_info, value)
|
||||||
DUP5 ISZERO PUSH 1 SUB
|
DUP5 ISZERO %not_bit
|
||||||
// stack: value!=0, Cgascap, address, gas, kexit_info, value
|
// stack: value!=0, Cgascap, address, gas, kexit_info, value
|
||||||
%mul_const(@GAS_CALLSTIPEND) ADD
|
%mul_const(@GAS_CALLSTIPEND) ADD
|
||||||
%stack (C_callgas, address, gas, kexit_info, value) ->
|
%stack (C_callgas, address, gas, kexit_info, value) ->
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
// Pre stack: kexit_info, value, code_offset, code_len
|
// Pre stack: kexit_info, value, code_offset, code_len
|
||||||
// Post stack: address
|
// Post stack: address
|
||||||
global sys_create:
|
global sys_create:
|
||||||
|
%check_static
|
||||||
// stack: kexit_info, value, code_offset, code_len
|
// stack: kexit_info, value, code_offset, code_len
|
||||||
// TODO: Charge gas.
|
// TODO: Charge gas.
|
||||||
%stack (kexit_info, value, code_offset, code_len)
|
%stack (kexit_info, value, code_offset, code_len)
|
||||||
@ -25,6 +26,7 @@ sys_create_got_address:
|
|||||||
// Pre stack: kexit_info, value, code_offset, code_len, salt
|
// Pre stack: kexit_info, value, code_offset, code_len, salt
|
||||||
// Post stack: address
|
// Post stack: address
|
||||||
global sys_create2:
|
global sys_create2:
|
||||||
|
%check_static
|
||||||
// stack: kexit_info, value, code_offset, code_len, salt
|
// stack: kexit_info, value, code_offset, code_len, salt
|
||||||
// TODO: Charge gas.
|
// TODO: Charge gas.
|
||||||
SWAP4
|
SWAP4
|
||||||
|
|||||||
@ -16,12 +16,17 @@ global sys_chainid:
|
|||||||
SWAP1
|
SWAP1
|
||||||
EXIT_KERNEL
|
EXIT_KERNEL
|
||||||
global sys_log0:
|
global sys_log0:
|
||||||
|
%check_static
|
||||||
PANIC
|
PANIC
|
||||||
global sys_log1:
|
global sys_log1:
|
||||||
|
%check_static
|
||||||
PANIC
|
PANIC
|
||||||
global sys_log2:
|
global sys_log2:
|
||||||
|
%check_static
|
||||||
PANIC
|
PANIC
|
||||||
global sys_log3:
|
global sys_log3:
|
||||||
|
%check_static
|
||||||
PANIC
|
PANIC
|
||||||
global sys_log4:
|
global sys_log4:
|
||||||
|
%check_static
|
||||||
PANIC
|
PANIC
|
||||||
|
|||||||
@ -45,6 +45,7 @@ sys_return_finish:
|
|||||||
%jump(terminate_common)
|
%jump(terminate_common)
|
||||||
|
|
||||||
global sys_selfdestruct:
|
global sys_selfdestruct:
|
||||||
|
%check_static
|
||||||
// stack: kexit_info, recipient
|
// stack: kexit_info, recipient
|
||||||
SWAP1 %u256_to_addr
|
SWAP1 %u256_to_addr
|
||||||
%address DUP1 %balance
|
%address DUP1 %balance
|
||||||
|
|||||||
@ -283,3 +283,10 @@ global sys_basefee:
|
|||||||
%jumpi(fault_exception)
|
%jumpi(fault_exception)
|
||||||
// stack: (empty)
|
// stack: (empty)
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
|
// Convenience macro for checking if the current context is static.
|
||||||
|
// Called before state-changing opcodes.
|
||||||
|
%macro check_static
|
||||||
|
%mload_context_metadata(@CTX_METADATA_STATIC)
|
||||||
|
%jumpi(fault_exception)
|
||||||
|
%endmacro
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
// Post stack: (empty)
|
// Post stack: (empty)
|
||||||
|
|
||||||
global sys_sstore:
|
global sys_sstore:
|
||||||
|
%check_static
|
||||||
%stack (kexit_info, slot, value) -> (slot, kexit_info, slot, value)
|
%stack (kexit_info, slot, value) -> (slot, kexit_info, slot, value)
|
||||||
%address %insert_accessed_storage_keys POP // TODO: Use return value in gas calculation.
|
%address %insert_accessed_storage_keys POP // TODO: Use return value in gas calculation.
|
||||||
// TODO: Assuming a cold zero -> nonzero write for now.
|
// TODO: Assuming a cold zero -> nonzero write for now.
|
||||||
|
|||||||
@ -360,8 +360,6 @@
|
|||||||
|
|
||||||
%macro not_bit
|
%macro not_bit
|
||||||
// stack: b
|
// stack: b
|
||||||
PUSH 1
|
ISZERO
|
||||||
// stack: 1, b
|
// stack: not b
|
||||||
SUB
|
|
||||||
// stack: 1 - b
|
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user