ethereum.forks.byzantium.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)

SLOAD

40
    SLOAD = Uint(200)

STORAGE_SET

43
    STORAGE_SET = Uint(20000)

COLD_STORAGE_WRITE

44
    COLD_STORAGE_WRITE = Uint(5000)

CALL_VALUE

47
    CALL_VALUE = Uint(9000)

CALL_STIPEND

48
    CALL_STIPEND = Uint(2300)

NEW_ACCOUNT

49
    NEW_ACCOUNT = Uint(25000)

CODE_DEPOSIT_PER_BYTE

52
    CODE_DEPOSIT_PER_BYTE = Uint(200)

ZERO

55
    ZERO = Uint(0)

MEMORY_PER_WORD

56
    MEMORY_PER_WORD = Uint(3)

REFUND_STORAGE_CLEAR

59
    REFUND_STORAGE_CLEAR = 15000

REFUND_SELF_DESTRUCT

60
    REFUND_SELF_DESTRUCT = 24000

PRECOMPILE_ECRECOVER

63
    PRECOMPILE_ECRECOVER = Uint(3000)

PRECOMPILE_SHA256_BASE

64
    PRECOMPILE_SHA256_BASE = Uint(60)

PRECOMPILE_SHA256_PER_WORD

65
    PRECOMPILE_SHA256_PER_WORD = Uint(12)

PRECOMPILE_RIPEMD160_BASE

66
    PRECOMPILE_RIPEMD160_BASE = Uint(600)

PRECOMPILE_RIPEMD160_PER_WORD

67
    PRECOMPILE_RIPEMD160_PER_WORD = Uint(120)

PRECOMPILE_IDENTITY_BASE

68
    PRECOMPILE_IDENTITY_BASE = Uint(15)

PRECOMPILE_IDENTITY_PER_WORD

69
    PRECOMPILE_IDENTITY_PER_WORD = Uint(3)

PRECOMPILE_ECADD

70
    PRECOMPILE_ECADD = Uint(500)

PRECOMPILE_ECMUL

71
    PRECOMPILE_ECMUL = Uint(40000)

PRECOMPILE_ECPAIRING_BASE

72
    PRECOMPILE_ECPAIRING_BASE = Uint(100000)

PRECOMPILE_ECPAIRING_PER_POINT

73
    PRECOMPILE_ECPAIRING_PER_POINT = Uint(80000)

TX_BASE

76
    TX_BASE = Uint(21000)

TX_CREATE

77
    TX_CREATE = Uint(32000)

TX_DATA_PER_ZERO

78
    TX_DATA_PER_ZERO = Uint(4)

TX_DATA_PER_NON_ZERO

79
    TX_DATA_PER_NON_ZERO = Uint(68)

LIMIT_ADJUSTMENT_FACTOR

82
    LIMIT_ADJUSTMENT_FACTOR = Uint(1024)

LIMIT_MINIMUM

83
    LIMIT_MINIMUM = Uint(5000)

OPCODE_ADD

86
    OPCODE_ADD = VERY_LOW

OPCODE_SUB

87
    OPCODE_SUB = VERY_LOW

OPCODE_MUL

88
    OPCODE_MUL = LOW

OPCODE_DIV

89
    OPCODE_DIV = LOW

OPCODE_SDIV

90
    OPCODE_SDIV = LOW

OPCODE_MOD

91
    OPCODE_MOD = LOW

OPCODE_SMOD

92
    OPCODE_SMOD = LOW

OPCODE_ADDMOD

93
    OPCODE_ADDMOD = MID

OPCODE_MULMOD

94
    OPCODE_MULMOD = MID

OPCODE_SIGNEXTEND

95
    OPCODE_SIGNEXTEND = LOW

OPCODE_LT

96
    OPCODE_LT = VERY_LOW

OPCODE_GT

97
    OPCODE_GT = VERY_LOW

OPCODE_SLT

98
    OPCODE_SLT = VERY_LOW

OPCODE_SGT

99
    OPCODE_SGT = VERY_LOW

OPCODE_EQ

100
    OPCODE_EQ = VERY_LOW

OPCODE_ISZERO

101
    OPCODE_ISZERO = VERY_LOW

OPCODE_AND

102
    OPCODE_AND = VERY_LOW

OPCODE_OR

103
    OPCODE_OR = VERY_LOW

OPCODE_XOR

104
    OPCODE_XOR = VERY_LOW

OPCODE_NOT

105
    OPCODE_NOT = VERY_LOW

OPCODE_BYTE

106
    OPCODE_BYTE = VERY_LOW

OPCODE_JUMP

107
    OPCODE_JUMP = MID

OPCODE_JUMPI

108
    OPCODE_JUMPI = HIGH

OPCODE_JUMPDEST

109
    OPCODE_JUMPDEST = Uint(1)

OPCODE_CALLDATALOAD

110
    OPCODE_CALLDATALOAD = VERY_LOW

OPCODE_BLOCKHASH

111
    OPCODE_BLOCKHASH = Uint(20)

OPCODE_COINBASE

112
    OPCODE_COINBASE = BASE

OPCODE_POP

113
    OPCODE_POP = BASE

OPCODE_MSIZE

114
    OPCODE_MSIZE = BASE

OPCODE_PC

115
    OPCODE_PC = BASE

OPCODE_GAS

116
    OPCODE_GAS = BASE

OPCODE_ADDRESS

117
    OPCODE_ADDRESS = BASE

OPCODE_ORIGIN

118
    OPCODE_ORIGIN = BASE

OPCODE_CALLER

119
    OPCODE_CALLER = BASE

OPCODE_CALLVALUE

120
    OPCODE_CALLVALUE = BASE

OPCODE_CALLDATASIZE

121
    OPCODE_CALLDATASIZE = BASE

OPCODE_CODESIZE

122
    OPCODE_CODESIZE = BASE

OPCODE_GASPRICE

123
    OPCODE_GASPRICE = BASE

OPCODE_TIMESTAMP

124
    OPCODE_TIMESTAMP = BASE

OPCODE_NUMBER

125
    OPCODE_NUMBER = BASE

OPCODE_GASLIMIT

126
    OPCODE_GASLIMIT = BASE

OPCODE_DIFFICULTY

127
    OPCODE_DIFFICULTY = BASE

OPCODE_RETURNDATASIZE

128
    OPCODE_RETURNDATASIZE = BASE

OPCODE_PUSH

129
    OPCODE_PUSH = VERY_LOW

OPCODE_DUP

130
    OPCODE_DUP = VERY_LOW

OPCODE_SWAP

131
    OPCODE_SWAP = VERY_LOW

OPCODE_RETURNDATACOPY_BASE

134
    OPCODE_RETURNDATACOPY_BASE = VERY_LOW

OPCODE_RETURNDATACOPY_PER_WORD

135
    OPCODE_RETURNDATACOPY_PER_WORD = Uint(3)

OPCODE_CALLDATACOPY_BASE

136
    OPCODE_CALLDATACOPY_BASE = VERY_LOW

OPCODE_CODECOPY_BASE

137
    OPCODE_CODECOPY_BASE = VERY_LOW

OPCODE_MLOAD_BASE

138
    OPCODE_MLOAD_BASE = VERY_LOW

OPCODE_MSTORE_BASE

139
    OPCODE_MSTORE_BASE = VERY_LOW

OPCODE_MSTORE8_BASE

140
    OPCODE_MSTORE8_BASE = VERY_LOW

OPCODE_COPY_PER_WORD

141
    OPCODE_COPY_PER_WORD = Uint(3)

OPCODE_CREATE_BASE

142
    OPCODE_CREATE_BASE = Uint(32000)

OPCODE_EXP_BASE

143
    OPCODE_EXP_BASE = Uint(10)

OPCODE_EXP_PER_BYTE

144
    OPCODE_EXP_PER_BYTE = Uint(50)

OPCODE_KECCAK256_BASE

145
    OPCODE_KECCAK256_BASE = Uint(30)

OPCODE_KECCACK256_PER_WORD

146
    OPCODE_KECCACK256_PER_WORD = Uint(6)

OPCODE_LOG_BASE

147
    OPCODE_LOG_BASE = Uint(375)

OPCODE_LOG_DATA_PER_BYTE

148
    OPCODE_LOG_DATA_PER_BYTE = Uint(8)

OPCODE_LOG_TOPIC

149
    OPCODE_LOG_TOPIC = Uint(375)

OPCODE_SELFDESTRUCT_BASE

150
    OPCODE_SELFDESTRUCT_BASE = Uint(5000)

OPCODE_SELFDESTRUCT_NEW_ACCOUNT

151
    OPCODE_SELFDESTRUCT_NEW_ACCOUNT = Uint(25000)

OPCODE_EXTERNAL_BASE

152
    OPCODE_EXTERNAL_BASE = Uint(700)

OPCODE_BALANCE

153
    OPCODE_BALANCE = Uint(400)

OPCODE_CALL_BASE

154
    OPCODE_CALL_BASE = Uint(700)

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

157
@dataclass
class ExtendMemory:

cost

168
    cost: Uint

expand_by

169
    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.

172
@dataclass
class MessageCallGas:

cost

186
    cost: Uint

sub_call

187
    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:
191
    """
192
    Subtracts `amount` from `evm.gas_left`.
193
194
    Parameters
195
    ----------
196
    evm :
197
        The current EVM.
198
    amount :
199
        The amount of gas the current operation requires.
200
201
    """
202
    evm_trace(evm, GasAndRefund(int(amount)))
203
204
    if evm.gas_left < amount:
205
        raise OutOfGasError
206
    else:
207
        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:
211
    """
212
    Calculates the gas cost for allocating memory
213
    to the smallest multiple of 32 bytes,
214
    such that the allocated size is at least as big as the given size.
215
216
    Parameters
217
    ----------
218
    size_in_bytes :
219
        The size of the data in bytes.
220
221
    Returns
222
    -------
223
    total_gas_cost : `ethereum.base_types.Uint`
224
        The gas cost for storing data in memory.
225
226
    """
227
    size_in_words = ceil32(size_in_bytes) // Uint(32)
228
    linear_cost = size_in_words * GasCosts.MEMORY_PER_WORD
229
    quadratic_cost = size_in_words ** Uint(2) // Uint(512)
230
    total_gas_cost = linear_cost + quadratic_cost
231
    try:
232
        return total_gas_cost
233
    except ValueError as e:
234
        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:
240
    """
241
    Calculates the gas amount to extend memory.
242
243
    Parameters
244
    ----------
245
    memory :
246
        Memory contents of the EVM.
247
    extensions:
248
        List of extensions to be made to the memory.
249
        Consists of a tuple of start position and size.
250
251
    Returns
252
    -------
253
    extend_memory: `ExtendMemory`
254
255
    """
256
    size_to_extend = Uint(0)
257
    to_be_paid = Uint(0)
258
    current_size = ulen(memory)
259
    for start_position, size in extensions:
260
        if size == 0:
261
            continue
262
        before_size = ceil32(current_size)
263
        after_size = ceil32(Uint(start_position) + Uint(size))
264
        if after_size <= before_size:
265
            continue
266
267
        size_to_extend += after_size - before_size
268
        already_paid = calculate_memory_gas_cost(before_size)
269
        total_cost = calculate_memory_gas_cost(after_size)
270
        to_be_paid += total_cost - already_paid
271
272
        current_size = after_size
273
274
    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:
285
    """
286
    Calculates the MessageCallGas (cost and gas made available to the sub-call)
287
    for executing call Opcodes.
288
289
    Parameters
290
    ----------
291
    value:
292
        The amount of `ETH` that needs to be transferred.
293
    gas :
294
        The amount of gas provided to the message-call.
295
    gas_left :
296
        The amount of gas left in the current frame.
297
    memory_cost :
298
        The amount needed to extend the memory in the current frame.
299
    extra_gas :
300
        The amount of gas needed for transferring value + creating a new
301
        account inside a message call.
302
    call_stipend :
303
        The amount of stipend provided to a message call to execute code while
304
        transferring value (ETH).
305
306
    Returns
307
    -------
308
    message_call_gas: `MessageCallGas`
309
310
    """
311
    call_stipend = Uint(0) if value == 0 else call_stipend
312
    if gas_left < extra_gas + memory_cost:
313
        return MessageCallGas(gas + extra_gas, gas + call_stipend)
314
315
    gas = min(gas, max_message_call_gas(gas_left - memory_cost - extra_gas))
316
317
    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:
321
    """
322
    Calculates the maximum gas that is allowed for making a message call.
323
324
    Parameters
325
    ----------
326
    gas :
327
        The amount of gas provided to the message-call.
328
329
    Returns
330
    -------
331
    max_allowed_message_call_gas: `ethereum.base_types.Uint`
332
        The maximum gas allowed for making the message-call.
333
334
    """
335
    return gas - (gas // Uint(64))