diff --git a/presets/mainnet/eip7594.yaml b/presets/mainnet/eip7594.yaml index c5bc54e525..6bddce11c8 100644 --- a/presets/mainnet/eip7594.yaml +++ b/presets/mainnet/eip7594.yaml @@ -4,3 +4,5 @@ # --------------------------------------------------------------- # `uint64(2**6)` (= 64) FIELD_ELEMENTS_PER_CELL: 64 +# `uint64(2 * 4096)` (= 8192) +FIELD_ELEMENTS_PER_EXT_BLOB: 8192 diff --git a/presets/minimal/eip7594.yaml b/presets/minimal/eip7594.yaml index 0435332859..0abcad3b27 100644 --- a/presets/minimal/eip7594.yaml +++ b/presets/minimal/eip7594.yaml @@ -4,3 +4,5 @@ # --------------------------------------------------------------- # `uint64(2**6)` (= 64) FIELD_ELEMENTS_PER_CELL: 64 +# `uint64(2 * 4096)` (= 8192) +FIELD_ELEMENTS_PER_EXT_BLOB: 8192 diff --git a/pysetup/spec_builders/eip7594.py b/pysetup/spec_builders/eip7594.py index 606ce895e7..6f145affb4 100644 --- a/pysetup/spec_builders/eip7594.py +++ b/pysetup/spec_builders/eip7594.py @@ -17,4 +17,5 @@ def imports(cls, preset_name: str): def hardcoded_custom_type_dep_constants(cls, spec_object) -> Dict[str, str]: return { 'FIELD_ELEMENTS_PER_CELL': spec_object.preset_vars['FIELD_ELEMENTS_PER_CELL'].value, + 'FIELD_ELEMENTS_PER_EXT_BLOB': spec_object.preset_vars['FIELD_ELEMENTS_PER_EXT_BLOB'].value, } diff --git a/specs/_features/eip7594/polynomial-commitments-sampling.md b/specs/_features/eip7594/polynomial-commitments-sampling.md index 9cd862589b..7fe59c3b64 100644 --- a/specs/_features/eip7594/polynomial-commitments-sampling.md +++ b/specs/_features/eip7594/polynomial-commitments-sampling.md @@ -62,7 +62,7 @@ Public functions MUST accept raw bytes as input and perform the required cryptog | Name | SSZ equivalent | Description | | - | - | - | -| `PolynomialCoeff` | `List[BLSFieldElement, 2 * FIELD_ELEMENTS_PER_BLOB]` | A polynomial in coefficient form | +| `PolynomialCoeff` | `List[BLSFieldElement, FIELD_ELEMENTS_PER_EXT_BLOB]` | A polynomial in coefficient form | | `Cell` | `Vector[BLSFieldElement, FIELD_ELEMENTS_PER_CELL]` | The unit of blob data that can come with their own KZG proofs | | `CellID` | `uint64` | Cell identifier | @@ -196,12 +196,15 @@ def multiply_polynomialcoeff(a: PolynomialCoeff, b: PolynomialCoeff) -> Polynomi """ Multiplies the coefficient form polynomials ``a`` and ``b`` """ + assert len(a) + len(b) <= FIELD_ELEMENTS_PER_EXT_BLOB + r = [0] for power, coef in enumerate(a): summand = [0] * power + [int(coef) * int(x) % BLS_MODULUS for x in b] r = add_polynomialcoeff(r, summand) return r ``` + #### `divide_polynomialcoeff` ```python diff --git a/tests/core/pyspec/eth2spec/test/eip7594/unittests/polynomial_commitments/test_polynomial_commitments.py b/tests/core/pyspec/eth2spec/test/eip7594/unittests/polynomial_commitments/test_polynomial_commitments.py index 0b60cfd287..f8a879e468 100644 --- a/tests/core/pyspec/eth2spec/test/eip7594/unittests/polynomial_commitments/test_polynomial_commitments.py +++ b/tests/core/pyspec/eth2spec/test/eip7594/unittests/polynomial_commitments/test_polynomial_commitments.py @@ -2,6 +2,7 @@ from eth2spec.test.context import ( spec_test, single_phase, + expect_assertion_error, with_eip7594_and_later, ) from eth2spec.test.helpers.sharding import ( @@ -105,3 +106,19 @@ def test_recover_polynomial(spec): # Now flatten the cells and check that they match the entirety of the recovered data flattened_cells = [x for xs in cells for x in xs] assert flattened_cells == recovered_data + + +@with_eip7594_and_later +@spec_test +@single_phase +def test_multiply_polynomial_degree_overflow(spec): + rng = random.Random(5566) + + # Perform a legitimate-but-maxed-out polynomial multiplication + poly1_coeff = [rng.randint(0, BLS_MODULUS - 1) for _ in range(spec.FIELD_ELEMENTS_PER_BLOB)] + poly2_coeff = [rng.randint(0, BLS_MODULUS - 1) for _ in range(spec.FIELD_ELEMENTS_PER_BLOB)] + _ = spec.multiply_polynomialcoeff(poly1_coeff, poly2_coeff) + + # Now overflow the degree by pumping the degree of one of the inputs by one + poly2_coeff = [rng.randint(0, BLS_MODULUS - 1) for _ in range(spec.FIELD_ELEMENTS_PER_BLOB + 1)] + expect_assertion_error(lambda: spec.multiply_polynomialcoeff(poly1_coeff, poly2_coeff)) diff --git a/tests/core/pyspec/eth2spec/test/eip7594/unittests/test_config_invariants.py b/tests/core/pyspec/eth2spec/test/eip7594/unittests/test_config_invariants.py new file mode 100644 index 0000000000..20baca8bf4 --- /dev/null +++ b/tests/core/pyspec/eth2spec/test/eip7594/unittests/test_config_invariants.py @@ -0,0 +1,12 @@ +from eth2spec.test.context import ( + single_phase, + spec_test, + with_eip7594_and_later, +) + + +@with_eip7594_and_later +@spec_test +@single_phase +def test_polynomical_commitments_sampling(spec): + assert spec.FIELD_ELEMENTS_PER_EXT_BLOB == 2 * spec.FIELD_ELEMENTS_PER_BLOB