Skip to content

Commit 421ebbc

Browse files
authored
Merge pull request #2029 from fselmo/london-test-fixes
EIP-3541 london test fixes
2 parents ec920db + bfce09c commit 421ebbc

File tree

4 files changed

+28
-40
lines changed

4 files changed

+28
-40
lines changed

eth/vm/forks/london/computation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ class LondonComputation(BerlinComputation):
1515
opcodes = LONDON_OPCODES
1616

1717
@classmethod
18-
def validate_new_contract_code(cls, contract_code: bytes) -> None:
18+
def validate_contract_code(cls, contract_code: bytes) -> None:
19+
super().validate_contract_code(contract_code)
20+
1921
if contract_code[:1] == EIP3541_RESERVED_STARTING_BYTE:
2022
raise ReservedBytesInCode(
2123
"Contract code begins with EIP3541 reserved byte '0xEF'."

eth/vm/forks/spurious_dragon/computation.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,31 +51,22 @@ def apply_create_message(
5151
else:
5252
contract_code = computation.output
5353

54-
if contract_code and len(contract_code) >= EIP170_CODE_SIZE_LIMIT:
55-
computation.error = OutOfGas(
56-
f"Contract code size exceeds EIP170 limit of {EIP170_CODE_SIZE_LIMIT}."
57-
f" Got code of size: {len(contract_code)}"
58-
)
59-
state.revert(snapshot)
60-
elif contract_code:
61-
contract_code_gas_cost = len(contract_code) * constants.GAS_CODEDEPOSIT
54+
if contract_code:
6255
try:
56+
cls.validate_contract_code(contract_code)
57+
58+
contract_code_gas_cost = len(contract_code) * constants.GAS_CODEDEPOSIT
6359
computation.consume_gas(
6460
contract_code_gas_cost,
6561
reason="Write contract code for CREATE",
6662
)
67-
except OutOfGas as err:
63+
except VMError as err:
6864
# Different from Frontier: reverts state on gas failure while
6965
# writing contract code.
7066
computation.error = err
7167
state.revert(snapshot)
68+
cls.logger.debug2(f"VMError setting contract code: {err}")
7269
else:
73-
try:
74-
cls.validate_new_contract_code(contract_code)
75-
except VMError as err:
76-
state.revert(snapshot)
77-
raise err
78-
7970
if cls.logger:
8071
cls.logger.debug2(
8172
"SETTING CODE: %s -> length: %s | hash: %s",
@@ -91,6 +82,9 @@ def apply_create_message(
9182
return computation
9283

9384
@classmethod
94-
def validate_new_contract_code(cls, contract_code: bytes) -> None:
95-
# helps facilitate EIP-3541 validation in LondonComputation
96-
pass
85+
def validate_contract_code(cls, contract_code: bytes) -> None:
86+
if len(contract_code) >= EIP170_CODE_SIZE_LIMIT:
87+
raise OutOfGas(
88+
f"Contract code size exceeds EIP170 limit of {EIP170_CODE_SIZE_LIMIT}."
89+
f" Got code of size: {len(contract_code)}"
90+
)

fixtures

tests/core/vm/test_london.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from eth.chains.mainnet import (
1010
MAINNET_VMS,
1111
)
12-
from eth.exceptions import InvalidInstruction, ReservedBytesInCode
12+
from eth.exceptions import InvalidInstruction
1313
from eth.vm.forks import BerlinVM
1414
from eth.tools.factories.transaction import (
1515
new_dynamic_fee_transaction, new_transaction,
@@ -182,10 +182,7 @@ def test_revert_on_reserved_0xEF_byte_for_CREATE_and_CREATE2_post_london(
182182
)
183183

184184
assert revert_create_computation.is_error
185-
assert isinstance(revert_create_computation.error, ReservedBytesInCode)
186-
assert "0xef" in repr(revert_create_computation.error).lower()
187-
188-
assert revert_create_computation.get_gas_used() == 40000 # assert gas is consumed
185+
assert 35000 < revert_create_computation.get_gas_used() < 40000 # assert gas is still consumed
189186
assert revert_create_computation.get_gas_refund() == 0
190187

191188

@@ -259,24 +256,19 @@ def test_state_revert_on_reserved_0xEF_byte_for_create_transaction_post_london(
259256
data=data,
260257
)
261258

262-
with pytest.raises(ReservedBytesInCode):
263-
block_import, _, computations = chain.mine_all(
264-
[create_contract_txn_reserved_byte],
265-
gas_limit=84082
266-
)
259+
block_import, _, computations = chain.mine_all(
260+
[create_contract_txn_reserved_byte],
261+
gas_limit=84082
262+
)
267263

268-
reverted_computation = computations[0]
269-
mined_header = block_import.imported_block.header
270-
end_balance = reverted_computation.state.get_balance(funded_address)
264+
reverted_computation = computations[0]
265+
mined_header = block_import.imported_block.header
271266

272-
assert reverted_computation.is_error
273-
assert isinstance(reverted_computation.error, ReservedBytesInCode)
274-
assert "0xef" in repr(reverted_computation.error).lower()
267+
assert reverted_computation.is_error
268+
assert "0xef" in repr(reverted_computation.error).lower()
275269

276-
assert reverted_computation.get_nonce(funded_address) == 1 # assert nonce is still 1
277-
# reverted txn consumes the gas:
278-
assert mined_header.gas_used == 60000
279-
assert end_balance == new_balance - 60000
270+
# reverted txn consumes the gas:
271+
assert mined_header.gas_used == 60000
280272

281273

282274
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)