@pytest.mark.parametrize(
"input_data,expected_output,vector_gas_value",
# Test vectors from the reference spec (from the cryptography team)
vectors_from_file("pairing_check_bls.json")
+ [
pytest.param(
Spec.G1 + Spec.INF_G2,
Spec.PAIRING_TRUE,
None,
id="generator_with_inf_g2",
),
pytest.param(
Spec.INF_G1 + Spec.G2,
Spec.PAIRING_TRUE,
None,
id="inf_g1_with_generator",
),
pytest.param( # e(inf, inf) == 1
Spec.INF_G1 + Spec.INF_G2,
Spec.PAIRING_TRUE,
None,
id="inf_pair",
),
pytest.param( # e(P, Q) . e(P, −Q) == 1 (inverse pair, factors cancel)
Spec.G1 + Spec.G2 + Spec.G1 + (-Spec.G2),
Spec.PAIRING_TRUE,
None,
id="g1_g2_and_inverse",
),
pytest.param( # e(P,Q) · e(P,−Q) · e(−P,Q) · e(−P,−Q) == 1
Spec.G1
+ Spec.G2
+ Spec.G1
+ (-Spec.G2)
+ (-Spec.G1)
+ Spec.G2
+ (-Spec.G1)
+ (-Spec.G2),
Spec.PAIRING_TRUE,
None,
id="full_sign_cancellation",
),
pytest.param( # 127 × e(inf, inf) . e(P, Q) + e(P, −Q) == 1
(Spec.INF_G1 + Spec.INF_G2) * 127
+ Spec.G1
+ Spec.G2
+ Spec.G1
+ (-Spec.G2),
Spec.PAIRING_TRUE,
None,
id="large_input_with_cancellation",
),
pytest.param( # e(P, Q) . e(−P, −Q) = e(P, Q)^2
Spec.G1 + Spec.G2 + (-Spec.G1) + (-Spec.G2),
Spec.PAIRING_FALSE,
None,
id="negated_both_pairs",
),
pytest.param( # e(inf, inf) . e(P, −Q)
(Spec.INF_G1 + Spec.INF_G2) + (Spec.G1 + (-Spec.G2)),
Spec.PAIRING_FALSE,
None,
id="multi_inf_g1_neg_g2",
),
pytest.param(
(Spec.G1 + (-Spec.G2)) + (Spec.INF_G1 + Spec.INF_G2),
Spec.PAIRING_FALSE,
None,
id="g1_neg_g2_multi_inf",
),
pytest.param(
Spec.G1 + Spec.G2,
Spec.PAIRING_FALSE,
None,
id="single_generator_pair",
),
pytest.param(
(Spec.INF_G1 + Spec.INF_G2) + (Spec.G1 + Spec.G2),
Spec.PAIRING_FALSE,
None,
id="inf_plus_generator_pair",
),
pytest.param( # e(P, Q) . e(P, −Q) . e(−P, Q)
Spec.G1 + Spec.G2 + Spec.G1 + (-Spec.G2) + (-Spec.G1) + Spec.G2,
Spec.PAIRING_FALSE,
None,
id="partial_sign_cancellation",
),
],
)
@pytest.mark.eels_base_coverage
def test_valid(
state_test: StateTestFiller,
pre: Alloc,
post: dict,
tx: Transaction,
) -> None:
"""Test the BLS12_PAIRING precompile."""
state_test(
env=Environment(),
pre=pre,
tx=tx,
post=post,
)