Skip to content

blockchaintest: blocks are executed from the decoded JSON fields, so the block RLP body is never validated against its header #1726

Open

Description

@CPerezz

Context

While running the Merkle Patricia Trie structural test suite of ethereum/execution-specs#3600 against several clients, I corrupted fixtures on purpose to check that each runner rejects them. That surfaced which part of a blockchain_test fixture evmone consumes.

A fixture block carries the block twice: rlp, the canonical bytes, and the sibling fields blockHeader, transactions, uncleHeaders, withdrawals, documented as "Decoded block header fields included in the block RLP" and "List of decoded transactions included in the block RLP". The consumption procedure says to decode rlp (step 7.2) and then apply "the current decoded block" (step 7.3).

So a fixture whose RLP body disagrees with the header contained in that same RLP is consistent on the JSON side and passes.

Evidence

One fixture, one block, two transactions. Two edits, each self-consistent on its own side:

A. Remove the last transaction from the block RLP body only, leaving blockHeader (including transactionsTrie) and the JSON transactions untouched.

B. Remove the last transaction from the JSON transactions array only, leaving rlp untouched.

A runner that follows 7.2 and 7.3 fails A and passes B. evmone passes A and fails B. Of eight runners I tried the same pair on, six (go-ethereum, erigon, reth, Nethermind, nimbus-eth1, Besu) fail A and pass B; evmone and ethrex invert it.

Reproduction

Take any blockchain_test fixture with a block holding at least two transactions, decode blocks[0].rlp as [header, txs, ommers, withdrawals], drop the last element of txs, re-encode, and write it back to rlp without touching the other fields. Then

evmone test <dir>

It passes; per steps 7.2 and 7.3 it should fail, because the decoded block's transactions do not hash to the transactionsTrie committed in its own header.

Fixtures to reproduce with: uv run fill tests/mpt/ --clean on the branch of ethereum/execution-specs#3600, or any existing multi-transaction blockchain_test.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions