Skip to content

test_blobhash_invalid_blob_index()

Documentation for tests/cancun/eip4844_blobs/test_blobhash_opcode.py::test_blobhash_invalid_blob_index@ffe48572.

Generate fixtures for these test cases for Bogota with:

fill -v tests/cancun/eip4844_blobs/test_blobhash_opcode.py::test_blobhash_invalid_blob_index --fork Bogota

Tests that the BLOBHASH opcode returns a zeroed bytes32 value for invalid indexes.

Includes cases where the index is negative (index < 0) or exceeds the maximum number of blob_versioned_hash values stored: (index >= len(tx.message.blob_versioned_hashes)).

It confirms that the returned value is a zeroed bytes32 for each case.

Source code in tests/cancun/eip4844_blobs/test_blobhash_opcode.py
@pytest.mark.parametrize(
    "scenario",
    [
        "invalid_calls",
    ],
)
@pytest.mark.eels_base_coverage
def test_blobhash_invalid_blob_index(
    pre: Alloc,
    fork: Fork,
    blockchain_test: BlockchainTestFiller,
    scenario: str,
    max_blobs_per_tx: int,
) -> None:
    """
    Tests that the `BLOBHASH` opcode returns a zeroed `bytes32` value for
    invalid indexes.

    Includes cases where the index is negative (`index < 0`) or exceeds the
    maximum number of `blob_versioned_hash` values stored:
    (`index >= len(tx.message.blob_versioned_hashes)`).

    It confirms that the returned value is a zeroed `bytes32` for each case.
    """
    total_blocks = 5
    blobhash_calls = BlobhashScenario.generate_blobhash_bytecode(
        scenario_name=scenario, max_blobs_per_tx=max_blobs_per_tx
    )
    sender = pre.fund_eoa()
    blocks: List[Block] = []
    post = {}
    for i in range(total_blocks):
        address = pre.deploy_contract(blobhash_calls)
        blob_per_block = (i % max_blobs_per_tx) + 1
        blobs = [random_blob_hashes[blob] for blob in range(blob_per_block)]
        blocks.append(
            Block(
                txs=[
                    Transaction(
                        ty=Spec.BLOB_TX_TYPE,
                        sender=sender,
                        to=address,
                        data=Hash(0),
                        access_list=[],
                        max_fee_per_blob_gas=(
                            fork.min_base_fee_per_blob_gas() * 10
                        ),
                        blob_versioned_hashes=blobs,
                    )
                ]
            )
        )
        post[address] = Account(
            storage={
                index: (
                    0 if index < 0 or index >= blob_per_block else blobs[index]
                )
                for index in range(
                    -total_blocks,
                    blob_per_block + (total_blocks - (i % max_blobs_per_tx)),
                )
            }
        )
    blockchain_test(
        pre=pre,
        blocks=blocks,
        post=post,
    )

Parametrized Test Cases

This test generates 1 parametrized test case across 5 forks.