Skip to content

Commit

Permalink
eth/precompiles/modexp: fix complexity calc (length^2, not 2^2).
Browse files Browse the repository at this point in the history
There was a typo in the "complexity" calculation function, a
special interim value from EIP-198 used to determine total gas
use.

The code path was never previously exercised.

NOTE: previous-commit "fixtures bump" was to commit:

9b1f07c58a70d1b17c4489c49eb9bebf4a27d290

Squashed commit:

tests: update "very big number" in test_modexp_gas_fee_calculation().

... and also fix that test's name, from "calculTation".

The very-big-number is not actually in EIP-198; the latter has
this to say:

> it’s not possible to provide enough gas to make that computation.

That's a bit cryptic, but the gist is that the most that can be
represented in a 256-bit number is

0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

which is

115792089237316195423570985008687907853269984665640564039457584007913129639935

and that's less than the

10684346944173007063723051170445283632835119638284563472873463025465780712173320789629146724657549280936306536701227228889744512638312451529980055895215896

required by this vector, or even the (erroneous)

708647586132375115992254428253169996062012306153720251921480414128428353393856280

that was in the test previously.
  • Loading branch information
veox committed Sep 4, 2018
1 parent b11a7b8 commit 7752f05
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 8 deletions.
2 changes: 1 addition & 1 deletion eth/precompiles/modexp.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def _compute_complexity(length):
length ** 2 // 4 + 96 * length - 3072
)
else:
return 2 ** 2 // 16 + 480 * length - 199680
return length ** 2 // 16 + 480 * length - 199680


def _extract_lengths(data):
Expand Down
4 changes: 2 additions & 2 deletions tests/core/vm/test_modexp_precompile.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@
(EIP198_VECTOR_A, 13056),
(
EIP198_VECTOR_C,
708647586132375115992254428253169996062012306153720251921480414128428353393856280,
10684346944173007063723051170445283632835119638284563472873463025465780712173320789629146724657549280936306536701227228889744512638312451529980055895215896, # noqa: E501
),
),
)
def test_modexp_gas_fee_calcultation(data, expected):
def test_modexp_gas_fee_calculation(data, expected):
actual = _compute_modexp_gas_fee(data)
assert actual == expected

Expand Down
5 changes: 0 additions & 5 deletions tests/json-fixtures/test_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,6 @@ def expand_fixtures_forks(all_fixtures):
# Ideally, this list should be empty.
# WHEN ADDING ENTRIES, ALWAYS PROVIDE AN EXPLANATION!
INCORRECT_UPSTREAM_TESTS = {
# Upstream seems to specify that the precompile call fails, but `py-evm`
# handles it just fine.
# * https://github.com/ethereum/py-evm/pull/1224#issuecomment-417351843
# * https://github.com/ethereum/tests/pull/405#issuecomment-417855812
('stReturnDataTest/modexp_modsize0_returndatasize.json', 'modexp_modsize0_returndatasize', 'Byzantium', 4), # noqa: E501
}


Expand Down

0 comments on commit 7752f05

Please sign in to comment.