3.3 KiB
eip | title | description | author | discussions-to | status | type | category | created | requires |
---|---|---|---|---|---|---|---|---|---|
6206 | EOF - JUMPF instruction | Introduces instruction for chaining function calls. | Andrei Maiboroda (@gumb0), Alex Beregszaszi (@axic), Paweł Bylica (@chfast), Matt Garnett (@lightclient) | https://ethereum-magicians.org/t/eip-4750-eof-functions/8195 | Draft | Standards Track | Core | 2022-12-21 | 4750, 5450 |
Abstract
This EIP allows for tail call optimizations in EOF functions (EIP-4750) by introducing a new instruction JUMPF
, which jumps to a code section without adding a new return stack frame.
Motivation
It is common for functions to make a call at the end of the routine only to then return. JUMPF
optimizes this behavior by changing code sections without needing to update the return stack.
Specification
A new instruction, JUMPF (0xb2)
, is introduced.
Execution Semantics
JUMPF
has one immediate argument,code_section_index
, encoded as a 16-bit unsigned big-endian value.- If the operand stack size exceeds
1024 - type[code_section_index].max_stack_height
(i.e. if the called function may exceed the global stack height limit), execution results in an exceptional halt. This guarantees that the stack height after the call is within the limits. JUMPF
costs 5 gas.JUMPF
neither pops nor pushes anything to the operand stack.
Code Validation
Let the definition of type[i]
be inherited from EIP-4750 and define stack_height
to be the height of the stack at a certain instruction during the instruction flow traversal if the operand stack at the start of the function were equal to type[i].inputs
.
- The immediate argument of
JUMPF
MUST be less than the total number of code sections. - For each
JUMPF
instructiontype[current_section_index].outputs
MUST be greater or equaltype[code_section_index].outputs
. - The stack height at
JUMPF
MUST be equal totype[current_section_index].outputs + type[code_section_index].inputs - type[code_section_index].outputs
. This means thatcode_section_index
can output less stack elements than the original code section called by the top element on the return stack, if thecurrent_section_index
code section leaves the deltatype[current_section_index].outputs - type[code_section_index].outputs
element(s) on the stack. - The code validation defined in EIP-4200 also fails if any
RJUMP*
offset points to one of the two bytes directly following aJUMPF
instruction.
Rationale
Allowing JUMPF
to section with less outputs
As long as JUMPF
prepares the delta type[current_section_index].outputs - type[code_section_index].outputs
stack elements before changing code sections, it is possible to jump to a section with less outputs than was originally entered via CALLF
. This will reduce duplicated code as it will allow compilers more flexibility during code generation such that certain helpers can be used generically by functions, regardless of their output values.
Backwards Compatibility
This change is backward compatible as EOF does not allow undefined instructions to be used or deployed, meaning no contracts will be affected.
Security Considerations
Needs discussion.
Copyright
Copyright and related rights waived via CC0.