Skip to content

Commit 9149a02

Browse files
refactor(benchmark): add cleanup parameter to code generation logic
1 parent 293fa01 commit 9149a02

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

src/ethereum_test_benchmark/benchmark_code_generator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def deploy_contracts(self, pre: Alloc, fork: Fork) -> None:
1414
"""Deploy the looping contract."""
1515
# Benchmark Test Structure:
1616
# setup + JUMPDEST + attack + attack + ... + attack + JUMP(setup_length)
17-
code = self.generate_repeated_code(self.attack_block, self.setup, fork)
17+
code = self.generate_repeated_code(self.attack_block, self.setup, self.cleanup, fork)
1818
self._contract_address = pre.deploy_contract(code=code)
1919

2020
def generate_transaction(self, pre: Alloc, gas_limit: int, fork: Fork) -> Transaction:
@@ -53,7 +53,7 @@ def deploy_contracts(self, pre: Alloc, fork: Fork) -> None:
5353
# setup + JUMPDEST + attack + attack + ... + attack + JUMP(setup_length)
5454
code_sequence = Op.POP(Op.STATICCALL(Op.GAS, self._target_contract_address, 0, 0, 0, 0))
5555

56-
caller_code = self.generate_repeated_code(code_sequence, Bytecode(), fork)
56+
caller_code = self.generate_repeated_code(code_sequence, Bytecode(), self.cleanup, fork)
5757
self._contract_address = pre.deploy_contract(code=caller_code)
5858

5959
def generate_transaction(self, pre: Alloc, gas_limit: int, fork: Fork) -> Transaction:

src/ethereum_test_specs/benchmark.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class BenchmarkCodeGenerator(ABC):
4040

4141
attack_block: Bytecode
4242
setup: Bytecode = field(default_factory=Bytecode)
43+
cleanup: Bytecode = field(default_factory=Bytecode)
4344

4445
@abstractmethod
4546
def deploy_contracts(self, pre: Alloc, fork: Fork) -> None:
@@ -52,17 +53,17 @@ def generate_transaction(self, pre: Alloc, gas_limit: int, fork: Fork) -> Transa
5253
...
5354

5455
def generate_repeated_code(
55-
self, repeated_code: Bytecode, setup: Bytecode, fork: Fork
56+
self, repeated_code: Bytecode, setup: Bytecode, cleanup: Bytecode, fork: Fork
5657
) -> Bytecode:
5758
"""Calculate the maximum number of iterations that can fit in the code size limit."""
5859
assert len(repeated_code) > 0, "repeated_code cannot be empty"
5960
max_code_size = fork.max_code_size()
6061

61-
overhead = len(setup) + len(Op.JUMPDEST) + len(Op.JUMP(len(setup)))
62+
overhead = len(setup) + len(Op.JUMPDEST) + len(cleanup) + len(Op.JUMP(len(setup)))
6263
available_space = max_code_size - overhead
6364
max_iterations = available_space // len(repeated_code)
6465

65-
code = setup + Op.JUMPDEST + repeated_code * max_iterations + Op.JUMP(len(setup))
66+
code = setup + Op.JUMPDEST + repeated_code * max_iterations + cleanup + Op.JUMP(len(setup))
6667
self._validate_code_size(code, fork)
6768

6869
return code

tests/benchmark/test_worst_memory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def test_worst_calldatacopy(
9292
src_dst, src_dst, Op.CALLDATASIZE if non_zero_data or size == 0 else Op.DUP1
9393
)
9494
code = JumpLoopGenerator(setup=prefix, attack_block=attack_block).generate_repeated_code(
95-
attack_block, Bytecode(), fork
95+
attack_block, Bytecode(), Bytecode(), fork
9696
)
9797
code_address = pre.deploy_contract(code=code)
9898

@@ -162,7 +162,7 @@ def test_worst_codecopy(
162162
attack_block = Op.CODECOPY(src_dst, src_dst, Op.DUP1) # DUP1 copies size.
163163

164164
code = JumpLoopGenerator(setup=code_prefix, attack_block=attack_block).generate_repeated_code(
165-
attack_block, Bytecode(), fork
165+
attack_block, Bytecode(), Bytecode(), fork
166166
)
167167

168168
# The code generated above is not guaranteed to be of max_code_size, so we pad it since

0 commit comments

Comments
 (0)