mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 00:03:10 +00:00
Couple fixes & minor refactor
This commit is contained in:
parent
c491a98961
commit
47fac8e35b
@ -17,6 +17,7 @@ pub(crate) fn combined_kernel() -> Kernel {
|
||||
include_str!("asm/core/call.asm"),
|
||||
include_str!("asm/core/create.asm"),
|
||||
include_str!("asm/core/create_addresses.asm"),
|
||||
include_str!("asm/core/gas.asm"),
|
||||
include_str!("asm/core/intrinsic_gas.asm"),
|
||||
include_str!("asm/core/invalid.asm"),
|
||||
include_str!("asm/core/jumpdest_analysis.asm"),
|
||||
|
||||
49
evm/src/cpu/kernel/asm/core/gas.asm
Normal file
49
evm/src/cpu/kernel/asm/core/gas.asm
Normal file
@ -0,0 +1,49 @@
|
||||
global sys_gas:
|
||||
// stack: kexit_info
|
||||
%charge_gas_const(@GAS_BASE)
|
||||
// stack: kexit_info
|
||||
DUP1 %shr_const(192)
|
||||
// stack: gas_used, kexit_info
|
||||
%ctx_gas_limit
|
||||
// stack: gas_limit, gas_used, kexit_info
|
||||
SUB
|
||||
// stack: gas_remaining, kexit_info
|
||||
SWAP1
|
||||
EXIT_KERNEL
|
||||
|
||||
%macro ctx_gas_limit
|
||||
%mload_context_metadata(@CTX_METADATA_GAS_LIMIT)
|
||||
%endmacro
|
||||
|
||||
// Charge gas. Faults if we exceed the limit for the current context.
|
||||
%macro charge_gas
|
||||
// stack: gas, kexit_info
|
||||
%shl_const(192)
|
||||
ADD
|
||||
// stack: kexit_info'
|
||||
%ctx_gas_limit
|
||||
// stack: gas_limit, kexit_info'
|
||||
DUP2 %shr_const(192)
|
||||
// stack: gas_used, gas_limit, kexit_info'
|
||||
GT
|
||||
// stack: out_of_gas, kexit_info'
|
||||
%jumpi(fault_exception)
|
||||
// stack: kexit_info'
|
||||
%endmacro
|
||||
|
||||
// Charge a constant amount of gas.
|
||||
%macro charge_gas_const(gas)
|
||||
// stack: kexit_info
|
||||
PUSH $gas
|
||||
// stack: gas, kexit_info
|
||||
%charge_gas
|
||||
// stack: kexit_info'
|
||||
%endmacro
|
||||
|
||||
// Charge gas and exit kernel code.
|
||||
%macro charge_gas_and_exit
|
||||
// stack: gas, kexit_info
|
||||
%charge_gas
|
||||
// stack: kexit_info'
|
||||
EXIT_KERNEL
|
||||
%endmacro
|
||||
@ -60,16 +60,6 @@ global sys_selfbalance:
|
||||
PANIC
|
||||
global sys_basefee:
|
||||
PANIC
|
||||
global sys_gas:
|
||||
// stack: kexit_info
|
||||
DUP1 %shr_const(192)
|
||||
// stack: gas_used, kexit_info
|
||||
%mload_context_metadata(@CTX_METADATA_GAS_LIMIT)
|
||||
// stack: gas_limit, gas_used, kexit_info
|
||||
SUB
|
||||
// stack: gas_remaining, kexit_info
|
||||
SWAP1
|
||||
EXIT_KERNEL
|
||||
global sys_log0:
|
||||
PANIC
|
||||
global sys_log1:
|
||||
|
||||
@ -37,7 +37,7 @@ global sys_revert:
|
||||
PUSH 0 // success
|
||||
%jump(terminate_common)
|
||||
|
||||
// The execution is in an exceptional halt-ing state if
|
||||
// The execution is in an exceptional halting state if
|
||||
// - there is insufficient gas
|
||||
// - the instruction is invalid
|
||||
// - there are insufficient stack items
|
||||
|
||||
@ -106,19 +106,7 @@ ecdsa_after_precompute_loop_end:
|
||||
// Take a public key (PKx, PKy) and return the associated address KECCAK256(PKx || PKy)[-20:].
|
||||
pubkey_to_addr:
|
||||
// stack: PKx, PKy, retdest
|
||||
PUSH 0
|
||||
// stack: 0, PKx, PKy, retdest
|
||||
MSTORE // TODO: switch to kernel memory (like `%mstore_kernel(@SEGMENT_KERNEL_GENERAL)`).
|
||||
// stack: PKy, retdest
|
||||
PUSH 0x20
|
||||
// stack: 0x20, PKy, retdest
|
||||
MSTORE
|
||||
// stack: retdest
|
||||
PUSH 0x40
|
||||
// stack: 0x40, retdest
|
||||
PUSH 0
|
||||
// stack: 0, 0x40, retdest
|
||||
KECCAK256
|
||||
%keccak256_u256_pair
|
||||
// stack: hash, retdest
|
||||
PUSH 0xffffffffffffffffffffffffffffffffffffffff
|
||||
// stack: 2^160-1, hash, retdest
|
||||
|
||||
@ -147,3 +147,16 @@ global sys_msize:
|
||||
ADD
|
||||
// stack: cost = num_words^2 / 512 + num_words * GAS_MEMORY
|
||||
%endmacro
|
||||
|
||||
// Faults if the given offset is "unreasonable", i.e. the associated memory expansion cost
|
||||
// would exceed any reasonable block limit.
|
||||
// We do this to avoid overflows in future gas-related calculations.
|
||||
%macro ensure_reasonable_offset
|
||||
// stack: offset
|
||||
// The memory expansion cost, (50000000 / 32)^2 / 512, is around 2^32 gas,
|
||||
// i.e. greater than any reasonable block limit.
|
||||
%gt_const(50000000)
|
||||
// stack: is_unreasonable
|
||||
%jumpi(fault_exception)
|
||||
// stack: (empty)
|
||||
%endmacro
|
||||
|
||||
@ -1,4 +1,6 @@
|
||||
global sys_mload:
|
||||
// stack: kexit_info, offset
|
||||
DUP2 %ensure_reasonable_offset
|
||||
// stack: kexit_info, offset
|
||||
%charge_gas_const(@GAS_VERYLOW)
|
||||
// stack: kexit_info, offset
|
||||
@ -44,6 +46,8 @@ global sys_mload:
|
||||
EXIT_KERNEL
|
||||
|
||||
global sys_mstore:
|
||||
// stack: kexit_info, offset, value
|
||||
DUP2 %ensure_reasonable_offset
|
||||
// stack: kexit_info, offset, value
|
||||
%charge_gas_const(@GAS_VERYLOW)
|
||||
// stack: kexit_info, offset, value
|
||||
@ -87,6 +91,8 @@ global sys_mstore:
|
||||
EXIT_KERNEL
|
||||
|
||||
global sys_mstore8:
|
||||
// stack: kexit_info, offset, value
|
||||
DUP2 %ensure_reasonable_offset
|
||||
// stack: kexit_info, offset, value
|
||||
%charge_gas_const(@GAS_VERYLOW)
|
||||
// stack: kexit_info, offset, value
|
||||
|
||||
@ -345,28 +345,3 @@
|
||||
%endrep
|
||||
// stack: a || b || c || d
|
||||
%endmacro
|
||||
|
||||
// Charge gas.
|
||||
%macro charge_gas
|
||||
// stack: gas, kexit_info
|
||||
%shl_const(192)
|
||||
ADD
|
||||
// stack: kexit_info'
|
||||
%endmacro
|
||||
|
||||
// Charge a constant amount of gas.
|
||||
%macro charge_gas_const(gas)
|
||||
// stack: kexit_info
|
||||
PUSH $gas
|
||||
// stack: gas, kexit_info
|
||||
%charge_gas
|
||||
// stack: kexit_info'
|
||||
%endmacro
|
||||
|
||||
// Charge gas and exit kernel code.
|
||||
%macro charge_gas_and_exit
|
||||
// stack: gas, kexit_info
|
||||
%charge_gas
|
||||
// stack: kexit_info'
|
||||
EXIT_KERNEL
|
||||
%endmacro
|
||||
|
||||
@ -23,3 +23,21 @@ global sys_keccak256:
|
||||
%stack (offset) -> (0, @SEGMENT_KERNEL_GENERAL, 0, $num_bytes) // context, segment, offset, len
|
||||
KECCAK_GENERAL
|
||||
%endmacro
|
||||
|
||||
// Computes Keccak256(a || b). Clobbers @SEGMENT_KERNEL_GENERAL.
|
||||
//
|
||||
// Pre stack: a, b
|
||||
// Post stack: hash
|
||||
%macro keccak256_u256_pair
|
||||
// Since KECCAK_GENERAL takes its input from memory, we will first write
|
||||
// a's bytes to @SEGMENT_KERNEL_GENERAL[0..32], then b's bytes to
|
||||
// @SEGMENT_KERNEL_GENERAL[32..64].
|
||||
%stack (a) -> (0, @SEGMENT_KERNEL_GENERAL, 0, a, 32, %%after_mstore_a)
|
||||
%jump(mstore_unpacking)
|
||||
%%after_mstore_a:
|
||||
%stack (offset, b) -> (0, @SEGMENT_KERNEL_GENERAL, 32, b, 32, %%after_mstore_b)
|
||||
%jump(mstore_unpacking)
|
||||
%%after_mstore_b:
|
||||
%stack (offset) -> (0, @SEGMENT_KERNEL_GENERAL, 0, 64) // context, segment, offset, len
|
||||
KECCAK_GENERAL
|
||||
%endmacro
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user