Skip to content

test_valid()

Documentation for tests/prague/eip2537_bls_12_381_precompiles/test_bls12_pairing.py::test_valid@ffe48572.

Generate fixtures for these test cases for Bogota with:

fill -v tests/prague/eip2537_bls_12_381_precompiles/test_bls12_pairing.py::test_valid --fork Bogota

Test the BLS12_PAIRING precompile.

Source code in tests/prague/eip2537_bls_12_381_precompiles/test_bls12_pairing.py
@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,
    )

Parametrized Test Cases

This test generates 26 parametrized test cases across 4 forks.