Skip to content

Commit 50c6845

Browse files
refactor(benchmark): update expected gas usage rule for flexibility (#2155)
* refactor: update expected gas usage rule for flexibility * docs(benchmarks): clarify gas usage check flexibility * feat(tests): introduce skip_gas_used_validation flag for flexible gas checks * docs(benchmarks): update gas usage check to use skip_gas_used_validation flag
1 parent 8f872a0 commit 50c6845

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

docs/writing_tests/benchmarks.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,5 @@ def test_empty_block(
6060
This is a safety check to make sure the benchmark works as expected. For example, if a test uses the `JUMP` instruction but the jump destination is invalid, each transaction will stop early. That means it won't use as much gas as we expected.
6161

6262
This check helps catch such issues. As a result, the post-storage comparison method via `SSTORE` is no longer needed, thereby reducing the additional storage cost.
63+
64+
However, in cases where it is difficult to determine the total gas usage, or if an alternative verification method is used, developers may set `skip_gas_used_validation` to `True` to disable the gas usage check.

src/ethereum_test_specs/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class BaseTest(BaseModel):
7373
_gas_optimization_max_gas_limit: int | None = PrivateAttr(None)
7474

7575
expected_benchmark_gas_used: int | None = None
76+
skip_gas_used_validation: bool = False
7677

7778
spec_types: ClassVar[Dict[str, Type["BaseTest"]]] = {}
7879

@@ -117,6 +118,7 @@ def from_test(
117118
tag=base_test.tag,
118119
t8n_dump_dir=base_test.t8n_dump_dir,
119120
expected_benchmark_gas_used=base_test.expected_benchmark_gas_used,
121+
skip_gas_used_validation=base_test.skip_gas_used_validation,
120122
**kwargs,
121123
)
122124
new_instance._request = base_test._request

src/ethereum_test_specs/blockchain.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -580,11 +580,13 @@ def generate_block_data(
580580
"expected_benchmark_gas_used is not set"
581581
)
582582
gas_used = int(transition_tool_output.result.gas_used)
583-
assert gas_used == expected_benchmark_gas_used, (
584-
f"gas_used ({gas_used}) does not match expected_benchmark_gas_used "
585-
f"({expected_benchmark_gas_used})"
586-
f", difference: {gas_used - expected_benchmark_gas_used}"
587-
)
583+
584+
if not self.skip_gas_used_validation:
585+
assert gas_used == expected_benchmark_gas_used, (
586+
f"gas_used ({gas_used}) does not match expected_benchmark_gas_used "
587+
f"({expected_benchmark_gas_used})"
588+
f", difference: {gas_used - expected_benchmark_gas_used}"
589+
)
588590

589591
requests_list: List[Bytes] | None = None
590592
if fork.header_requests_required(header.number, header.timestamp):

src/ethereum_test_specs/state.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,15 +366,16 @@ def make_state_test_fixture(
366366

367367
if self._operation_mode == OpMode.BENCHMARKING:
368368
expected_benchmark_gas_used = self.expected_benchmark_gas_used
369-
gas_used = int(transition_tool_output.result.gas_used)
370369
assert expected_benchmark_gas_used is not None, (
371370
"expected_benchmark_gas_used is not set"
372371
)
373-
assert gas_used == expected_benchmark_gas_used, (
374-
f"gas_used ({gas_used}) does not match expected_benchmark_gas_used "
375-
f"({expected_benchmark_gas_used})"
376-
f", difference: {gas_used - expected_benchmark_gas_used}"
377-
)
372+
gas_used = int(transition_tool_output.result.gas_used)
373+
if not self.skip_gas_used_validation:
374+
assert gas_used == expected_benchmark_gas_used, (
375+
f"gas_used ({gas_used}) does not match expected_benchmark_gas_used "
376+
f"({expected_benchmark_gas_used})"
377+
f", difference: {gas_used - expected_benchmark_gas_used}"
378+
)
378379

379380
return StateFixture(
380381
env=FixtureEnvironment(**env.model_dump(exclude_none=True)),

0 commit comments

Comments
 (0)