Abstract

Jets are optimization marks. Using jets, users can place optmization marks in an EVM program. An EVM interpreter will then verify the optimization mark claim, and if the verification passes, execute a native code version of the program that is equivalent to the original program.

Specification

The optimization mark is defined as two adjencent opcodes.

PUSH11 45 56 4d 4a 45 54 53 <4 bytes of registry ID>
POP

Readers can immediately follow that this optimization mark does not have side effects other than costing 5 gases. 45 56 4d 4a 45 54 53 is a magic code. The <4 bytes of registry ID> is interpreted as a big-endian unsigned integer.

EVMs, on doing the initial JUMPDEST validity map execution round, can optionally search for the optimization mark as defined above. If an optimization mark is found, it then checks whether the registry ID is supported. Each registry ID has an associated code length. The EVM then verify that opcodes followed by the optimization mark, of code length, is a pre-defined one. If so, it can mark the beginning of that code region A (including the optimization mark) as "jet-able". When the program counter reads up to A, the EVM can choose to execute the jet-ed native code that results in the same state, and costs the same gas. However, if the program counter instead jumps to the middle of the code region, it should use the not-jet-ed unoptimized opcode.

Registry ID Assignments

Registry ID of spec-2017-0001 can be assigned in a looser process but similar to how RFC works. EVM implementors can choose to implement any registry ID or not, but should avoid conflicting registry ID assignments. An assigment must also contain:

  • The code length of the optimizing block.
  • The opcode sequence of the optimizing block.
  • Sample implementation of the optimizing block.

Example

Usually for an opcode sequence to be replacable by native codes, it is required that it to be static:

  • Jumps need to be deterministic. The sequence can use PC opcode to jump to an offset of the current position.
  • It cannot jump out of its region.

Below we consider the opcode MUL does not exist, and implement a jet-able version of MUL using ADD:

PUSH1 00
DUP2
DUP4
ADD
ADD
SWAP2
PUSH1 01
SWAP1
SUB
SWAP2
DUP3
PC
PUSH1 11
SUB
SWAP1
JUMPI
SWAP2
POP
POP

This can be simplified by MUL -- taking two items from the stack, and push one new item which is the multiply of the two items. Its gas cost can also be simplified as 12 + 51 * <mul second item>.