@pytest.mark.parametrize(
"input_data,expected_output,vector_gas_value",
# Test vectors from the reference spec (from the cryptography team)
vectors_from_file("mul_G2_bls.json")
+ [
# Basic multiplication test cases.
pytest.param(
Spec.INF_G2 + Scalar(0),
Spec.INF_G2,
None,
id="zero_times_inf",
),
pytest.param(
Spec.INF_G2 + Scalar(1),
Spec.INF_G2,
None,
id="one_times_inf",
),
pytest.param(
Spec.INF_G2 + Scalar(2),
Spec.INF_G2,
None,
id="two_times_inf",
),
pytest.param(
Spec.INF_G2 + Scalar(Spec.Q),
Spec.INF_G2,
None,
id="q_times_inf",
),
pytest.param(
Spec.INF_G2 + Scalar(2**256 - 1),
Spec.INF_G2,
None,
id="max_scalar_times_inf",
),
pytest.param(
Spec.G2 + Scalar(0),
Spec.INF_G2,
None,
id="zero_times_generator",
),
pytest.param(
Spec.P2 + Scalar(0),
Spec.INF_G2,
None,
id="zero_times_point",
),
pytest.param(
Spec.G2 + Scalar(1),
Spec.G2,
None,
id="one_times_generator",
),
pytest.param(
Spec.P2 + Scalar(1),
Spec.P2,
None,
id="one_times_point",
),
pytest.param(
Spec.P2 + Scalar(2**256 - 1),
PointG2(
(
0x2663E1C3431E174CA80E5A84489569462E13B52DA27E7720AF5567941603475F1F9BC0102E13B92A0A21D96B94E9B22,
0x6A80D056486365020A6B53E2680B2D72D8A93561FC2F72B960936BB16F509C1A39C4E4174A7C9219E3D7EF130317C05,
),
(
0xC49EAD39E9EB7E36E8BC25824299661D5B6D0E200BBC527ECCB946134726BF5DBD861E8E6EC946260B82ED26AFE15FB,
0x5397DAD1357CF8333189821B737172B18099ECF7EE8BDB4B3F05EBCCDF40E1782A6C71436D5ACE0843D7F361CBC6DB2,
),
),
None,
id="max_scalar_times_point",
),
# Subgroup related test cases.
pytest.param(
Spec.P2 + Scalar(Spec.Q - 1),
-Spec.P2, # negated P2
None,
id="q_minus_1_times_point",
),
pytest.param(
Spec.P2 + Scalar(Spec.Q),
Spec.INF_G2,
None,
id="q_times_point",
),
pytest.param(
Spec.G2 + Scalar(Spec.Q),
Spec.INF_G2,
None,
id="q_times_generator",
),
pytest.param(
Spec.P2 + Scalar(Spec.Q + 1),
Spec.P2,
None,
id="q_plus_1_times_point",
),
pytest.param(
Spec.P2 + Scalar(2 * Spec.Q),
Spec.INF_G2,
None,
id="2q_times_point",
),
pytest.param(
Spec.P2 + Scalar((2**256 // Spec.Q) * Spec.Q),
Spec.INF_G2,
None,
id="large_multiple_of_q_times_point",
),
],
)
def test_valid(
state_test: StateTestFiller,
pre: Alloc,
post: dict,
tx: Transaction,
) -> None:
"""Test the BLS12_G2MUL precompile."""
state_test(
env=Environment(),
pre=pre,
tx=tx,
post=post,
)