ethereum.forks.constantinople.vm.instructions.control_flowethereum.forks.istanbul.vm.instructions.control_flow
Ethereum Virtual Machine (EVM) Control Flow Instructions.
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Implementations of the EVM control flow instructions.
stop
Stop further execution of EVM code.
Parameters
evm : The current EVM frame.
def stop(evm: Evm) -> None:
| 23 | """ |
|---|---|
| 24 | Stop further execution of EVM code. |
| 25 | |
| 26 | Parameters |
| 27 | ---------- |
| 28 | evm : |
| 29 | The current EVM frame. |
| 30 | |
| 31 | """ |
| 32 | # STACK |
| 33 | pass |
| 34 | |
| 35 | # GAS |
| 36 | pass |
| 37 | |
| 38 | # OPERATION |
| 39 | evm.running = False |
| 40 | |
| 41 | # PROGRAM COUNTER |
| 42 | evm.pc += Uint(1) |
jump
Alter the program counter to the location specified by the top of the stack.
Parameters
evm : The current EVM frame.
def jump(evm: Evm) -> None:
| 46 | """ |
|---|---|
| 47 | Alter the program counter to the location specified by the top of the |
| 48 | stack. |
| 49 | |
| 50 | Parameters |
| 51 | ---------- |
| 52 | evm : |
| 53 | The current EVM frame. |
| 54 | |
| 55 | """ |
| 56 | # STACK |
| 57 | jump_dest = Uint(pop(evm.stack)) |
| 58 | |
| 59 | # GAS |
| 60 | charge_gas(evm, GAS_MID) |
| 61 | |
| 62 | # OPERATION |
| 63 | if jump_dest not in evm.valid_jump_destinations: |
| 64 | raise InvalidJumpDestError |
| 65 | |
| 66 | # PROGRAM COUNTER |
| 67 | evm.pc = Uint(jump_dest) |
jumpi
Alter the program counter to the specified location if and only if a condition is true. If the condition is not true, then the program counter would increase only by 1.
Parameters
evm : The current EVM frame.
def jumpi(evm: Evm) -> None:
| 71 | """ |
|---|---|
| 72 | Alter the program counter to the specified location if and only if a |
| 73 | condition is true. If the condition is not true, then the program counter |
| 74 | would increase only by 1. |
| 75 | |
| 76 | Parameters |
| 77 | ---------- |
| 78 | evm : |
| 79 | The current EVM frame. |
| 80 | |
| 81 | """ |
| 82 | # STACK |
| 83 | jump_dest = Uint(pop(evm.stack)) |
| 84 | conditional_value = pop(evm.stack) |
| 85 | |
| 86 | # GAS |
| 87 | charge_gas(evm, GAS_HIGH) |
| 88 | |
| 89 | # OPERATION |
| 90 | if conditional_value == 0: |
| 91 | destination = evm.pc + Uint(1) |
| 92 | elif jump_dest not in evm.valid_jump_destinations: |
| 93 | raise InvalidJumpDestError |
| 94 | else: |
| 95 | destination = jump_dest |
| 96 | |
| 97 | # PROGRAM COUNTER |
| 98 | evm.pc = destination |
pc
Push onto the stack the value of the program counter after reaching the current instruction and without increasing it for the next instruction.
Parameters
evm : The current EVM frame.
def pc(evm: Evm) -> None:
| 102 | """ |
|---|---|
| 103 | Push onto the stack the value of the program counter after reaching the |
| 104 | current instruction and without increasing it for the next instruction. |
| 105 | |
| 106 | Parameters |
| 107 | ---------- |
| 108 | evm : |
| 109 | The current EVM frame. |
| 110 | |
| 111 | """ |
| 112 | # STACK |
| 113 | pass |
| 114 | |
| 115 | # GAS |
| 116 | charge_gas(evm, GAS_BASE) |
| 117 | |
| 118 | # OPERATION |
| 119 | push(evm.stack, U256(evm.pc)) |
| 120 | |
| 121 | # PROGRAM COUNTER |
| 122 | evm.pc += Uint(1) |
gas_left
Push the amount of available gas (including the corresponding reduction for the cost of this instruction) onto the stack.
Parameters
evm : The current EVM frame.
def gas_left(evm: Evm) -> None:
| 126 | """ |
|---|---|
| 127 | Push the amount of available gas (including the corresponding reduction |
| 128 | for the cost of this instruction) onto the stack. |
| 129 | |
| 130 | Parameters |
| 131 | ---------- |
| 132 | evm : |
| 133 | The current EVM frame. |
| 134 | |
| 135 | """ |
| 136 | # STACK |
| 137 | pass |
| 138 | |
| 139 | # GAS |
| 140 | charge_gas(evm, GAS_BASE) |
| 141 | |
| 142 | # OPERATION |
| 143 | push(evm.stack, U256(evm.gas_left)) |
| 144 | |
| 145 | # PROGRAM COUNTER |
| 146 | evm.pc += Uint(1) |
jumpdest
Mark a valid destination for jumps. This is a noop, present only
to be used by JUMP and JUMPI opcodes to verify that their jump is
valid.
Parameters
evm : The current EVM frame.
def jumpdest(evm: Evm) -> None:
| 150 | """ |
|---|---|
| 151 | Mark a valid destination for jumps. This is a noop, present only |
| 152 | to be used by `JUMP` and `JUMPI` opcodes to verify that their jump is |
| 153 | valid. |
| 154 | |
| 155 | Parameters |
| 156 | ---------- |
| 157 | evm : |
| 158 | The current EVM frame. |
| 159 | |
| 160 | """ |
| 161 | # STACK |
| 162 | pass |
| 163 | |
| 164 | # GAS |
| 165 | charge_gas(evm, GAS_JUMPDEST) |
| 166 | |
| 167 | # OPERATION |
| 168 | pass |
| 169 | |
| 170 | # PROGRAM COUNTER |
| 171 | evm.pc += Uint(1) |