ethereum.forks.paris.vm.gasethereum.forks.shanghai.vm.gas

Ethereum Virtual Machine (EVM) Gas.

.. contents:: Table of Contents :backlinks: none :local:

Introduction

EVM gas constants and calculators.

GasCosts

Constant gas values for the EVM.

class GasCosts:

BASE

33
    BASE = Uint(2)

VERY_LOW

34
    VERY_LOW = Uint(3)

LOW

35
    LOW = Uint(5)

MID

36
    MID = Uint(8)

HIGH

37
    HIGH = Uint(10)

WARM_ACCESS

40
    WARM_ACCESS = Uint(100)

COLD_ACCOUNT_ACCESS

41
    COLD_ACCOUNT_ACCESS = Uint(2600)

COLD_STORAGE_ACCESS

42
    COLD_STORAGE_ACCESS = Uint(2100)

STORAGE_SET

45
    STORAGE_SET = Uint(20000)

COLD_STORAGE_WRITE

46
    COLD_STORAGE_WRITE = Uint(5000)

CALL_VALUE

49
    CALL_VALUE = Uint(9000)

CALL_STIPEND

50
    CALL_STIPEND = Uint(2300)

NEW_ACCOUNT

51
    NEW_ACCOUNT = Uint(25000)

CODE_DEPOSIT_PER_BYTE

54
    CODE_DEPOSIT_PER_BYTE = Uint(200)

CODE_INIT_PER_WORD

55
    CODE_INIT_PER_WORD = Uint(2)

ZERO

58
    ZERO = Uint(0)

MEMORY_PER_WORD

59
    MEMORY_PER_WORD = Uint(3)

FAST_STEP

60
    FAST_STEP = Uint(5)

REFUND_STORAGE_CLEAR

63
    REFUND_STORAGE_CLEAR = 4800

PRECOMPILE_ECRECOVER

66
    PRECOMPILE_ECRECOVER = Uint(3000)

PRECOMPILE_SHA256_BASE

67
    PRECOMPILE_SHA256_BASE = Uint(60)

PRECOMPILE_SHA256_PER_WORD

68
    PRECOMPILE_SHA256_PER_WORD = Uint(12)

PRECOMPILE_RIPEMD160_BASE

69
    PRECOMPILE_RIPEMD160_BASE = Uint(600)

PRECOMPILE_RIPEMD160_PER_WORD

70
    PRECOMPILE_RIPEMD160_PER_WORD = Uint(120)

PRECOMPILE_IDENTITY_BASE

71
    PRECOMPILE_IDENTITY_BASE = Uint(15)

PRECOMPILE_IDENTITY_PER_WORD

72
    PRECOMPILE_IDENTITY_PER_WORD = Uint(3)

PRECOMPILE_BLAKE2F_PER_ROUND

73
    PRECOMPILE_BLAKE2F_PER_ROUND = Uint(1)

PRECOMPILE_ECADD

74
    PRECOMPILE_ECADD = Uint(150)

PRECOMPILE_ECMUL

75
    PRECOMPILE_ECMUL = Uint(6000)

PRECOMPILE_ECPAIRING_BASE

76
    PRECOMPILE_ECPAIRING_BASE = Uint(45000)

PRECOMPILE_ECPAIRING_PER_POINT

77
    PRECOMPILE_ECPAIRING_PER_POINT = Uint(34000)

TX_BASE

80
    TX_BASE = Uint(21000)

TX_CREATE

81
    TX_CREATE = Uint(32000)

TX_DATA_PER_ZERO

82
    TX_DATA_PER_ZERO = Uint(4)

TX_DATA_PER_NON_ZERO

83
    TX_DATA_PER_NON_ZERO = Uint(16)

TX_ACCESS_LIST_ADDRESS

84
    TX_ACCESS_LIST_ADDRESS = Uint(2400)

TX_ACCESS_LIST_STORAGE_KEY

85
    TX_ACCESS_LIST_STORAGE_KEY = Uint(1900)

LIMIT_ADJUSTMENT_FACTOR

88
    LIMIT_ADJUSTMENT_FACTOR = Uint(1024)

LIMIT_MINIMUM

89
    LIMIT_MINIMUM = Uint(5000)

OPCODE_ADD

92
    OPCODE_ADD = VERY_LOW

OPCODE_SUB

93
    OPCODE_SUB = VERY_LOW

OPCODE_MUL

94
    OPCODE_MUL = LOW

OPCODE_DIV

95
    OPCODE_DIV = LOW

OPCODE_SDIV

96
    OPCODE_SDIV = LOW

OPCODE_MOD

97
    OPCODE_MOD = LOW

OPCODE_SMOD

98
    OPCODE_SMOD = LOW

OPCODE_ADDMOD

99
    OPCODE_ADDMOD = MID

OPCODE_MULMOD

100
    OPCODE_MULMOD = MID

OPCODE_SIGNEXTEND

101
    OPCODE_SIGNEXTEND = LOW

OPCODE_LT

102
    OPCODE_LT = VERY_LOW

OPCODE_GT

103
    OPCODE_GT = VERY_LOW

OPCODE_SLT

104
    OPCODE_SLT = VERY_LOW

OPCODE_SGT

105
    OPCODE_SGT = VERY_LOW

OPCODE_EQ

106
    OPCODE_EQ = VERY_LOW

OPCODE_ISZERO

107
    OPCODE_ISZERO = VERY_LOW

OPCODE_AND

108
    OPCODE_AND = VERY_LOW

OPCODE_OR

109
    OPCODE_OR = VERY_LOW

OPCODE_XOR

110
    OPCODE_XOR = VERY_LOW

OPCODE_NOT

111
    OPCODE_NOT = VERY_LOW

OPCODE_BYTE

112
    OPCODE_BYTE = VERY_LOW

OPCODE_SHL

113
    OPCODE_SHL = VERY_LOW

OPCODE_SHR

114
    OPCODE_SHR = VERY_LOW

OPCODE_SAR

115
    OPCODE_SAR = VERY_LOW

OPCODE_JUMP

116
    OPCODE_JUMP = MID

OPCODE_JUMPI

117
    OPCODE_JUMPI = HIGH

OPCODE_JUMPDEST

118
    OPCODE_JUMPDEST = Uint(1)

OPCODE_CALLDATALOAD

119
    OPCODE_CALLDATALOAD = VERY_LOW

OPCODE_BLOCKHASH

120
    OPCODE_BLOCKHASH = Uint(20)

OPCODE_COINBASE

121
    OPCODE_COINBASE = BASE

OPCODE_POP

122
    OPCODE_POP = BASE

OPCODE_MSIZE

123
    OPCODE_MSIZE = BASE

OPCODE_PC

124
    OPCODE_PC = BASE

OPCODE_GAS

125
    OPCODE_GAS = BASE

OPCODE_ADDRESS

126
    OPCODE_ADDRESS = BASE

OPCODE_ORIGIN

127
    OPCODE_ORIGIN = BASE

OPCODE_CALLER

128
    OPCODE_CALLER = BASE

OPCODE_CALLVALUE

129
    OPCODE_CALLVALUE = BASE

OPCODE_CALLDATASIZE

130
    OPCODE_CALLDATASIZE = BASE

OPCODE_CODESIZE

131
    OPCODE_CODESIZE = BASE

OPCODE_GASPRICE

132
    OPCODE_GASPRICE = BASE

OPCODE_TIMESTAMP

133
    OPCODE_TIMESTAMP = BASE

OPCODE_NUMBER

134
    OPCODE_NUMBER = BASE

OPCODE_GASLIMIT

135
    OPCODE_GASLIMIT = BASE

OPCODE_PREVRANDAO

136
    OPCODE_PREVRANDAO = BASE

OPCODE_RETURNDATASIZE

137
    OPCODE_RETURNDATASIZE = BASE

OPCODE_CHAINID

138
    OPCODE_CHAINID = BASE

OPCODE_BASEFEE

139
    OPCODE_BASEFEE = BASE

OPCODE_PUSH

140
    OPCODE_PUSH = VERY_LOW

OPCODE_PUSH0

141
    OPCODE_PUSH0 = BASE

OPCODE_DUP

142
    OPCODE_DUP = VERY_LOW

OPCODE_SWAP

143
    OPCODE_SWAP = VERY_LOW

OPCODE_RETURNDATACOPY_BASE

146
    OPCODE_RETURNDATACOPY_BASE = VERY_LOW

OPCODE_RETURNDATACOPY_PER_WORD

147
    OPCODE_RETURNDATACOPY_PER_WORD = Uint(3)

OPCODE_CALLDATACOPY_BASE

148
    OPCODE_CALLDATACOPY_BASE = VERY_LOW

OPCODE_CODECOPY_BASE

149
    OPCODE_CODECOPY_BASE = VERY_LOW

OPCODE_MLOAD_BASE

150
    OPCODE_MLOAD_BASE = VERY_LOW

OPCODE_MSTORE_BASE

151
    OPCODE_MSTORE_BASE = VERY_LOW

OPCODE_MSTORE8_BASE

152
    OPCODE_MSTORE8_BASE = VERY_LOW

OPCODE_COPY_PER_WORD

153
    OPCODE_COPY_PER_WORD = Uint(3)

OPCODE_CREATE_BASE

154
    OPCODE_CREATE_BASE = Uint(32000)

OPCODE_EXP_BASE

155
    OPCODE_EXP_BASE = Uint(10)

OPCODE_EXP_PER_BYTE

156
    OPCODE_EXP_PER_BYTE = Uint(50)

OPCODE_KECCAK256_BASE

157
    OPCODE_KECCAK256_BASE = Uint(30)

OPCODE_KECCACK256_PER_WORD

158
    OPCODE_KECCACK256_PER_WORD = Uint(6)

OPCODE_LOG_BASE

159
    OPCODE_LOG_BASE = Uint(375)

OPCODE_LOG_DATA_PER_BYTE

160
    OPCODE_LOG_DATA_PER_BYTE = Uint(8)

OPCODE_LOG_TOPIC

161
    OPCODE_LOG_TOPIC = Uint(375)

OPCODE_SELFDESTRUCT_BASE

162
    OPCODE_SELFDESTRUCT_BASE = Uint(5000)

OPCODE_SELFDESTRUCT_NEW_ACCOUNT

163
    OPCODE_SELFDESTRUCT_NEW_ACCOUNT = Uint(25000)

ExtendMemory

Define the parameters for memory extension in opcodes.

cost: ethereum.base_types.Uint The gas required to perform the extension expand_by: ethereum.base_types.Uint The size by which the memory will be extended

166
@dataclass
class ExtendMemory:

cost

177
    cost: Uint

expand_by

178
    expand_by: Uint

MessageCallGas

Define the gas cost and gas given to the sub-call for executing the call opcodes.

cost: ethereum.base_types.Uint The gas required to execute the call opcode, excludes memory expansion costs. sub_call: ethereum.base_types.Uint The portion of gas available to sub-calls that is refundable if not consumed.

181
@dataclass
class MessageCallGas:

cost

195
    cost: Uint

sub_call

196
    sub_call: Uint

charge_gas

Subtracts amount from evm.gas_left.

Parameters

evm : The current EVM. amount : The amount of gas the current operation requires.

def charge_gas(evm: Evm, ​​amount: Uint) -> None:
200
    """
201
    Subtracts `amount` from `evm.gas_left`.
202
203
    Parameters
204
    ----------
205
    evm :
206
        The current EVM.
207
    amount :
208
        The amount of gas the current operation requires.
209
210
    """
211
    evm_trace(evm, GasAndRefund(int(amount)))
212
213
    if evm.gas_left < amount:
214
        raise OutOfGasError
215
    else:
216
        evm.gas_left -= amount

calculate_memory_gas_cost

Calculates the gas cost for allocating memory to the smallest multiple of 32 bytes, such that the allocated size is at least as big as the given size.

Parameters

size_in_bytes : The size of the data in bytes.

Returns

total_gas_cost : ethereum.base_types.Uint The gas cost for storing data in memory.

def calculate_memory_gas_cost(size_in_bytes: Uint) -> Uint:
220
    """
221
    Calculates the gas cost for allocating memory
222
    to the smallest multiple of 32 bytes,
223
    such that the allocated size is at least as big as the given size.
224
225
    Parameters
226
    ----------
227
    size_in_bytes :
228
        The size of the data in bytes.
229
230
    Returns
231
    -------
232
    total_gas_cost : `ethereum.base_types.Uint`
233
        The gas cost for storing data in memory.
234
235
    """
236
    size_in_words = ceil32(size_in_bytes) // Uint(32)
237
    linear_cost = size_in_words * GasCosts.MEMORY_PER_WORD
238
    quadratic_cost = size_in_words ** Uint(2) // Uint(512)
239
    total_gas_cost = linear_cost + quadratic_cost
240
    try:
241
        return total_gas_cost
242
    except ValueError as e:
243
        raise OutOfGasError from e

calculate_gas_extend_memory

Calculates the gas amount to extend memory.

Parameters

memory : Memory contents of the EVM. extensions: List of extensions to be made to the memory. Consists of a tuple of start position and size.

Returns

extend_memory: ExtendMemory

def calculate_gas_extend_memory(memory: bytearray, ​​extensions: List[Tuple[U256, U256]]) -> ExtendMemory:
249
    """
250
    Calculates the gas amount to extend memory.
251
252
    Parameters
253
    ----------
254
    memory :
255
        Memory contents of the EVM.
256
    extensions:
257
        List of extensions to be made to the memory.
258
        Consists of a tuple of start position and size.
259
260
    Returns
261
    -------
262
    extend_memory: `ExtendMemory`
263
264
    """
265
    size_to_extend = Uint(0)
266
    to_be_paid = Uint(0)
267
    current_size = ulen(memory)
268
    for start_position, size in extensions:
269
        if size == 0:
270
            continue
271
        before_size = ceil32(current_size)
272
        after_size = ceil32(Uint(start_position) + Uint(size))
273
        if after_size <= before_size:
274
            continue
275
276
        size_to_extend += after_size - before_size
277
        already_paid = calculate_memory_gas_cost(before_size)
278
        total_cost = calculate_memory_gas_cost(after_size)
279
        to_be_paid += total_cost - already_paid
280
281
        current_size = after_size
282
283
    return ExtendMemory(to_be_paid, size_to_extend)

calculate_message_call_gas

Calculates the MessageCallGas (cost and gas made available to the sub-call) for executing call Opcodes.

Parameters

value: The amount of ETH that needs to be transferred. gas : The amount of gas provided to the message-call. gas_left : The amount of gas left in the current frame. memory_cost : The amount needed to extend the memory in the current frame. extra_gas : The amount of gas needed for transferring value + creating a new account inside a message call. call_stipend : The amount of stipend provided to a message call to execute code while transferring value (ETH).

Returns

message_call_gas: MessageCallGas

def calculate_message_call_gas(value: U256, ​​gas: Uint, ​​gas_left: Uint, ​​memory_cost: Uint, ​​extra_gas: Uint, ​​call_stipend: Uint) -> MessageCallGas:
294
    """
295
    Calculates the MessageCallGas (cost and gas made available to the sub-call)
296
    for executing call Opcodes.
297
298
    Parameters
299
    ----------
300
    value:
301
        The amount of `ETH` that needs to be transferred.
302
    gas :
303
        The amount of gas provided to the message-call.
304
    gas_left :
305
        The amount of gas left in the current frame.
306
    memory_cost :
307
        The amount needed to extend the memory in the current frame.
308
    extra_gas :
309
        The amount of gas needed for transferring value + creating a new
310
        account inside a message call.
311
    call_stipend :
312
        The amount of stipend provided to a message call to execute code while
313
        transferring value (ETH).
314
315
    Returns
316
    -------
317
    message_call_gas: `MessageCallGas`
318
319
    """
320
    call_stipend = Uint(0) if value == 0 else call_stipend
321
    if gas_left < extra_gas + memory_cost:
322
        return MessageCallGas(gas + extra_gas, gas + call_stipend)
323
324
    gas = min(gas, max_message_call_gas(gas_left - memory_cost - extra_gas))
325
326
    return MessageCallGas(gas + extra_gas, gas + call_stipend)

max_message_call_gas

Calculates the maximum gas that is allowed for making a message call.

Parameters

gas : The amount of gas provided to the message-call.

Returns

max_allowed_message_call_gas: ethereum.base_types.Uint The maximum gas allowed for making the message-call.

def max_message_call_gas(gas: Uint) -> Uint:
330
    """
331
    Calculates the maximum gas that is allowed for making a message call.
332
333
    Parameters
334
    ----------
335
    gas :
336
        The amount of gas provided to the message-call.
337
338
    Returns
339
    -------
340
    max_allowed_message_call_gas: `ethereum.base_types.Uint`
341
        The maximum gas allowed for making the message-call.
342
343
    """
344
    return gas - (gas // Uint(64))

init_code_cost

Calculates the gas to be charged for the init code in CREATE* opcodes as well as create transactions.

Parameters

init_code_length : The length of the init code provided to the opcode or a create transaction

Returns

init_code_gas: ethereum.base_types.Uint The gas to be charged for the init code.

def init_code_cost(init_code_length: Uint) -> Uint:
348
    """
349
    Calculates the gas to be charged for the init code in CREATE*
350
    opcodes as well as create transactions.
351
352
    Parameters
353
    ----------
354
    init_code_length :
355
        The length of the init code provided to the opcode
356
        or a create transaction
357
358
    Returns
359
    -------
360
    init_code_gas: `ethereum.base_types.Uint`
361
        The gas to be charged for the init code.
362
363
    """
364
    return GasCosts.CODE_INIT_PER_WORD * ceil32(init_code_length) // Uint(32)