You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
blockchaintest: blocks are executed from the decoded JSON fields, so the block RLP body is never validated against its header #1726
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