Skip to content

Commit a90f77b

Browse files
temp
1 parent 1f23a42 commit a90f77b

File tree

13 files changed

+263
-106
lines changed

13 files changed

+263
-106
lines changed

src/ethereum/forks/amsterdam/vm/gas.py

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
from . import Evm
2525
from .exceptions import OutOfGasError
2626

27+
WARM_STORAGE_READ_COST = Uint(5)
28+
BASE_OPCODE_COST = Uint(1)
29+
FAST_OPCODE_COST = Uint(2)
30+
MID_OPCODE_COST = Uint(3)
31+
EXP_BASE_COST = Uint(2)
32+
EXP_PER_BYTE_COST = Uint(4)
33+
COPY_PER_WORD_COST = Uint(1)
34+
2735
GAS_JUMPDEST = Uint(1)
2836
GAS_BASE = Uint(2)
2937
GAS_VERY_LOW = Uint(3)
@@ -34,11 +42,11 @@
3442
GAS_MID = Uint(8)
3543
GAS_HIGH = Uint(10)
3644
GAS_EXPONENTIATION = Uint(10)
37-
GAS_EXPONENTIATION_PER_BYTE = Uint(50)
45+
GAS_EXPONENTIATION_PER_BYTE = EXP_PER_BYTE_COST
3846
GAS_MEMORY = Uint(3)
3947
GAS_KECCAK256 = Uint(30)
4048
GAS_KECCAK256_WORD = Uint(6)
41-
GAS_COPY = Uint(3)
49+
GAS_COPY = COPY_PER_WORD_COST
4250
GAS_BLOCK_HASH = Uint(20)
4351
GAS_LOG = Uint(375)
4452
GAS_LOG_DATA = Uint(8)
@@ -84,6 +92,92 @@
8492
GAS_BLS_G2_MUL = Uint(22500)
8593
GAS_BLS_G2_MAP = Uint(23800)
8694

95+
G_STOP = GAS_ZERO
96+
G_ADD = BASE_OPCODE_COST
97+
G_MUL = BASE_OPCODE_COST
98+
G_SUB = BASE_OPCODE_COST
99+
G_DIV = BASE_OPCODE_COST
100+
G_SDIV = BASE_OPCODE_COST
101+
G_MOD = BASE_OPCODE_COST
102+
G_SMOD = BASE_OPCODE_COST
103+
G_ADDMOD = FAST_OPCODE_COST
104+
G_MULMOD = MID_OPCODE_COST
105+
G_EXP = EXP_BASE_COST
106+
G_SIGNEXTEND = BASE_OPCODE_COST
107+
G_LT = BASE_OPCODE_COST
108+
G_GT = BASE_OPCODE_COST
109+
G_SLT = BASE_OPCODE_COST
110+
G_SGT = BASE_OPCODE_COST
111+
G_EQ = BASE_OPCODE_COST
112+
G_ISZERO = BASE_OPCODE_COST
113+
G_AND = BASE_OPCODE_COST
114+
G_OR = BASE_OPCODE_COST
115+
G_XOR = BASE_OPCODE_COST
116+
G_NOT = BASE_OPCODE_COST
117+
G_BYTE = BASE_OPCODE_COST
118+
G_SHL = BASE_OPCODE_COST
119+
G_SHR = BASE_OPCODE_COST
120+
G_SAR = BASE_OPCODE_COST
121+
G_CLZ = GAS_LOW
122+
G_KECCAK256 = GAS_KECCAK256
123+
G_ADDRESS = BASE_OPCODE_COST
124+
G_BALANCE = WARM_STORAGE_READ_COST
125+
G_ORIGIN = BASE_OPCODE_COST
126+
G_CALLER = BASE_OPCODE_COST
127+
G_CALLVALUE = BASE_OPCODE_COST
128+
G_CALLDATALOAD = BASE_OPCODE_COST
129+
G_CALLDATASIZE = BASE_OPCODE_COST
130+
G_CALLDATACOPY = BASE_OPCODE_COST
131+
G_CODESIZE = BASE_OPCODE_COST
132+
G_CODECOPY = BASE_OPCODE_COST
133+
G_GASPRICE = BASE_OPCODE_COST
134+
G_EXTCODESIZE = WARM_STORAGE_READ_COST
135+
G_EXTCODECOPY = WARM_STORAGE_READ_COST
136+
G_RETURNDATASIZE = BASE_OPCODE_COST
137+
G_RETURNDATACOPY = BASE_OPCODE_COST
138+
G_EXTCODEHASH = WARM_STORAGE_READ_COST
139+
G_BLOCKHASH = GAS_BLOCK_HASH
140+
G_COINBASE = BASE_OPCODE_COST
141+
G_TIMESTAMP = BASE_OPCODE_COST
142+
G_NUMBER = BASE_OPCODE_COST
143+
G_PREVRANDAO = GAS_BASE
144+
G_GASLIMIT = BASE_OPCODE_COST
145+
G_CHAINID = BASE_OPCODE_COST
146+
G_SELFBALANCE = BASE_OPCODE_COST
147+
G_BASEFEE = GAS_BASE
148+
G_BLOBHASH = GAS_BLOBHASH_OPCODE
149+
G_BLOBBASEFEE = GAS_BASE
150+
G_POP = BASE_OPCODE_COST
151+
G_MLOAD = BASE_OPCODE_COST
152+
G_MSTORE = BASE_OPCODE_COST
153+
G_MSTORE8 = BASE_OPCODE_COST
154+
G_SLOAD = GAS_WARM_ACCESS
155+
G_SSTORE = GAS_WARM_ACCESS
156+
G_JUMP = BASE_OPCODE_COST
157+
G_JUMPI = BASE_OPCODE_COST
158+
G_PC = BASE_OPCODE_COST
159+
G_MSIZE = BASE_OPCODE_COST
160+
G_GAS = BASE_OPCODE_COST
161+
G_JUMPDEST = BASE_OPCODE_COST
162+
G_TLOAD = WARM_STORAGE_READ_COST
163+
G_TSTORE = WARM_STORAGE_READ_COST
164+
G_MCOPY = BASE_OPCODE_COST
165+
G_PUSH0 = BASE_OPCODE_COST
166+
G_PUSHx = BASE_OPCODE_COST
167+
G_DUPx = BASE_OPCODE_COST
168+
G_SWAPx = BASE_OPCODE_COST
169+
G_LOGx = GAS_LOG
170+
G_CREATE = GAS_CREATE
171+
G_CALL = GAS_WARM_ACCESS
172+
G_CALLCODE = GAS_WARM_ACCESS
173+
G_RETURN = GAS_ZERO
174+
G_DELEGATECALL = GAS_WARM_ACCESS
175+
G_CREATE2 = GAS_CREATE
176+
G_STATICCALL = GAS_WARM_ACCESS
177+
G_REVERT = GAS_ZERO
178+
G_INVALID = GAS_ZERO
179+
G_SELFDESTRUCT = GAS_SELF_DESTRUCT
180+
87181

88182
@dataclass
89183
class ExtendMemory:

src/ethereum/forks/amsterdam/vm/instructions/arithmetic.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,18 @@
1818

1919
from .. import Evm
2020
from ..gas import (
21-
GAS_EXPONENTIATION,
21+
G_ADD,
22+
G_ADDMOD,
23+
G_DIV,
24+
G_EXP,
25+
G_MOD,
26+
G_MUL,
27+
G_MULMOD,
28+
G_SDIV,
29+
G_SIGNEXTEND,
30+
G_SMOD,
31+
G_SUB,
2232
GAS_EXPONENTIATION_PER_BYTE,
23-
GAS_LOW,
24-
GAS_MID,
25-
GAS_VERY_LOW,
2633
charge_gas,
2734
)
2835
from ..stack import pop, push
@@ -44,7 +51,7 @@ def add(evm: Evm) -> None:
4451
y = pop(evm.stack)
4552

4653
# GAS
47-
charge_gas(evm, GAS_VERY_LOW)
54+
charge_gas(evm, G_ADD)
4855

4956
# OPERATION
5057
result = x.wrapping_add(y)
@@ -71,7 +78,7 @@ def sub(evm: Evm) -> None:
7178
y = pop(evm.stack)
7279

7380
# GAS
74-
charge_gas(evm, GAS_VERY_LOW)
81+
charge_gas(evm, G_SUB)
7582

7683
# OPERATION
7784
result = x.wrapping_sub(y)
@@ -98,7 +105,7 @@ def mul(evm: Evm) -> None:
98105
y = pop(evm.stack)
99106

100107
# GAS
101-
charge_gas(evm, GAS_LOW)
108+
charge_gas(evm, G_MUL)
102109

103110
# OPERATION
104111
result = x.wrapping_mul(y)
@@ -125,7 +132,7 @@ def div(evm: Evm) -> None:
125132
divisor = pop(evm.stack)
126133

127134
# GAS
128-
charge_gas(evm, GAS_LOW)
135+
charge_gas(evm, G_DIV)
129136

130137
# OPERATION
131138
if divisor == 0:
@@ -158,7 +165,7 @@ def sdiv(evm: Evm) -> None:
158165
divisor = pop(evm.stack).to_signed()
159166

160167
# GAS
161-
charge_gas(evm, GAS_LOW)
168+
charge_gas(evm, G_SDIV)
162169

163170
# OPERATION
164171
if divisor == 0:
@@ -191,7 +198,7 @@ def mod(evm: Evm) -> None:
191198
y = pop(evm.stack)
192199

193200
# GAS
194-
charge_gas(evm, GAS_LOW)
201+
charge_gas(evm, G_MOD)
195202

196203
# OPERATION
197204
if y == 0:
@@ -221,7 +228,7 @@ def smod(evm: Evm) -> None:
221228
y = pop(evm.stack).to_signed()
222229

223230
# GAS
224-
charge_gas(evm, GAS_LOW)
231+
charge_gas(evm, G_SMOD)
225232

226233
# OPERATION
227234
if y == 0:
@@ -252,7 +259,7 @@ def addmod(evm: Evm) -> None:
252259
z = Uint(pop(evm.stack))
253260

254261
# GAS
255-
charge_gas(evm, GAS_MID)
262+
charge_gas(evm, G_ADDMOD)
256263

257264
# OPERATION
258265
if z == 0:
@@ -283,7 +290,7 @@ def mulmod(evm: Evm) -> None:
283290
z = Uint(pop(evm.stack))
284291

285292
# GAS
286-
charge_gas(evm, GAS_MID)
293+
charge_gas(evm, G_MULMOD)
287294

288295
# OPERATION
289296
if z == 0:
@@ -317,9 +324,7 @@ def exp(evm: Evm) -> None:
317324
# function is inaccurate leading to wrong results.
318325
exponent_bits = exponent.bit_length()
319326
exponent_bytes = (exponent_bits + Uint(7)) // Uint(8)
320-
charge_gas(
321-
evm, GAS_EXPONENTIATION + GAS_EXPONENTIATION_PER_BYTE * exponent_bytes
322-
)
327+
charge_gas(evm, G_EXP + GAS_EXPONENTIATION_PER_BYTE * exponent_bytes)
323328

324329
# OPERATION
325330
result = U256(pow(base, exponent, Uint(U256.MAX_VALUE) + Uint(1)))
@@ -346,7 +351,7 @@ def signextend(evm: Evm) -> None:
346351
value = pop(evm.stack)
347352

348353
# GAS
349-
charge_gas(evm, GAS_LOW)
354+
charge_gas(evm, G_SIGNEXTEND)
350355

351356
# OPERATION
352357
if byte_num > U256(31):

src/ethereum/forks/amsterdam/vm/instructions/bitwise.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,18 @@
1414
from ethereum_types.numeric import U256, Uint
1515

1616
from .. import Evm
17-
from ..gas import GAS_LOW, GAS_VERY_LOW, charge_gas
17+
from ..gas import (
18+
G_AND,
19+
G_BYTE,
20+
G_CLZ,
21+
G_NOT,
22+
G_OR,
23+
G_SAR,
24+
G_SHL,
25+
G_SHR,
26+
G_XOR,
27+
charge_gas,
28+
)
1829
from ..stack import pop, push
1930

2031

@@ -34,7 +45,7 @@ def bitwise_and(evm: Evm) -> None:
3445
y = pop(evm.stack)
3546

3647
# GAS
37-
charge_gas(evm, GAS_VERY_LOW)
48+
charge_gas(evm, G_AND)
3849

3950
# OPERATION
4051
push(evm.stack, x & y)
@@ -59,7 +70,7 @@ def bitwise_or(evm: Evm) -> None:
5970
y = pop(evm.stack)
6071

6172
# GAS
62-
charge_gas(evm, GAS_VERY_LOW)
73+
charge_gas(evm, G_OR)
6374

6475
# OPERATION
6576
push(evm.stack, x | y)
@@ -84,7 +95,7 @@ def bitwise_xor(evm: Evm) -> None:
8495
y = pop(evm.stack)
8596

8697
# GAS
87-
charge_gas(evm, GAS_VERY_LOW)
98+
charge_gas(evm, G_XOR)
8899

89100
# OPERATION
90101
push(evm.stack, x ^ y)
@@ -108,7 +119,7 @@ def bitwise_not(evm: Evm) -> None:
108119
x = pop(evm.stack)
109120

110121
# GAS
111-
charge_gas(evm, GAS_VERY_LOW)
122+
charge_gas(evm, G_NOT)
112123

113124
# OPERATION
114125
push(evm.stack, ~x)
@@ -134,7 +145,7 @@ def get_byte(evm: Evm) -> None:
134145
word = pop(evm.stack)
135146

136147
# GAS
137-
charge_gas(evm, GAS_VERY_LOW)
148+
charge_gas(evm, G_BYTE)
138149

139150
# OPERATION
140151
if byte_index >= U256(32):
@@ -169,7 +180,7 @@ def bitwise_shl(evm: Evm) -> None:
169180
value = Uint(pop(evm.stack))
170181

171182
# GAS
172-
charge_gas(evm, GAS_VERY_LOW)
183+
charge_gas(evm, G_SHL)
173184

174185
# OPERATION
175186
if shift < Uint(256):
@@ -199,7 +210,7 @@ def bitwise_shr(evm: Evm) -> None:
199210
value = pop(evm.stack)
200211

201212
# GAS
202-
charge_gas(evm, GAS_VERY_LOW)
213+
charge_gas(evm, G_SHR)
203214

204215
# OPERATION
205216
if shift < U256(256):
@@ -229,7 +240,7 @@ def bitwise_sar(evm: Evm) -> None:
229240
signed_value = pop(evm.stack).to_signed()
230241

231242
# GAS
232-
charge_gas(evm, GAS_VERY_LOW)
243+
charge_gas(evm, G_SAR)
233244

234245
# OPERATION
235246
if shift < 256:
@@ -262,7 +273,7 @@ def count_leading_zeros(evm: Evm) -> None:
262273
x = pop(evm.stack)
263274

264275
# GAS
265-
charge_gas(evm, GAS_LOW)
276+
charge_gas(evm, G_CLZ)
266277

267278
# OPERATION
268279
bit_length = U256(x.bit_length())

0 commit comments

Comments
 (0)