Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Update the contract limit size to follow EIP170 and add tests against it #1483

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion eth/vm/forks/spurious_dragon/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@


# https://github.com/ethereum/EIPs/issues/170
EIP170_CODE_SIZE_LIMIT = 24577
EIP170_CODE_SIZE_LIMIT = 24576
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
EIP170_CODE_SIZE_LIMIT = 24576
EIP170_CODE_SIZE_LIMIT = 24576 # 2**14 + 2**13

85 changes: 85 additions & 0 deletions tests/core/vm/test_spurious_dragon_computation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import pytest

from eth_utils import (
to_canonical_address,
)

from eth.vm.message import (
Message,
)

from eth.vm.forks.spurious_dragon.computation import (
SpuriousDragonComputation,
)

from eth.vm.transaction_context import (
BaseTransactionContext,
)


NORMALIZED_ADDRESS_A = "0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"
NORMALIZED_ADDRESS_B = "0xcd1722f3947def4cf144679da39c4c32bdc35681"
CANONICAL_ADDRESS_A = to_canonical_address("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
CANONICAL_ADDRESS_A = to_canonical_address("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6")
CANONICAL_ADDRESS_A = to_canonical_address(NORMALIZED_ADDRESS_A)

CANONICAL_ADDRESS_B = to_canonical_address("0xcd1722f3947def4cf144679da39c4c32bdc35681")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
CANONICAL_ADDRESS_B = to_canonical_address("0xcd1722f3947def4cf144679da39c4c32bdc35681")
CANONICAL_ADDRESS_B = to_canonical_address(NORMALIZED_ADDRESS_B)

CONTRACT_CODE_A = b""
CONTRACT_CODE_B = b""
CONTRACT_CODE_C = b""
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pipermerriam Would like to get suggestion on what is the best way of having different kinds of contract code in our tests. Do we usually just hardcode the bytecode here?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typically yes. I assume we don't need complex code and we could just do something like: CODE = b'\x01' * 20000 or something to keep it concise.



@pytest.fixture
def state(chain_without_block_validation):
state = chain_without_block_validation.get_vm().state
state.account_db.set_balance(CANONICAL_ADDRESS_A, 1000)
return state


@pytest.fixture
def transaction_context():
tx_context = BaseTransactionContext(
gas_price=1,
origin=CANONICAL_ADDRESS_B,
)
return tx_context


def test_code_size_limit(transaction_context, state):
"""
CONTRACT_CODE_A size is greater than EIP170_CODE_SIZE_LIMIT
"""
message_contract_code_a = Message(
to=CANONICAL_ADDRESS_A,
sender=CANONICAL_ADDRESS_B,
value=100,
data=b'',
code=CONTRACT_CODE_A,
gas=100,
)
computation = SpuriousDragonComputation(
state=state,
message=message_contract_code_a,
transaction_context=transaction_context,
)

"""
TODO: CONTRACT_CODE_B size is equal to EIP170_CODE_SIZE_LIMIT
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test should probably be parametrized (or use a parametrized fixture) instead of testing all three in the same test.

"""
message_contract_code_b = Message(
to=CANONICAL_ADDRESS_A,
sender=CANONICAL_ADDRESS_B,
value=100,
data=b'',
code=CONTRACT_CODE_B,
gas=100,
)

"""
TODO: CONTRACT_CODE_C size is lower than EIP170_CODE_SIZE_LIMIT
"""
message_contract_code_c = Message(
to=CANONICAL_ADDRESS_A,
sender=CANONICAL_ADDRESS_B,
value=100,
data=b'',
code=CONTRACT_CODE_C,
gas=100,
)