Hi everyone,
I’d like to propose a simple, fully self-contained mechanism to remove most order-based MEV (sandwiches, front-running, etc.) by fixing the execution order of transactions inside each block in a deterministic way.
This proposal is possible to implement in two parts: first as an advisory opt-in default behavior, and then as a consensus change.
Why this is needed
EIP-7956 [DRAFT] (“Tx Ordering via Block-level Randomness”) is currently stagnant and depends on another unfinished EIP for exposing fresh RANDAO/VRF-style randomness per slot. Even if that dependency were resolved, a builder who wins consecutive blocks (which is common under MEV-heavy conditions) can predict the randomness and grind exact transaction ordering.
This proposal avoids those issues entirely: it uses only data already present in the block—specifically the new transactions themselves—and requires no new transaction formats, no bundles, and no external randomness.
Core idea
Once a builder chooses the set of transactions for a block, the execution order becomes immediately fixed.
Specification (high level):
-
Sort transactions
TX_SORTED = t.sort(_.txid) -
Get sorting seed from the full transactions
seed = keccak256(concatenated TX_SORTED) -
Put transactions in nonce order by sender (tiebreak with txid)
TX_NONCE_SENDER_ORDER = t.sort(_.txid).sort(_.nonce).sort(_.sender) -
Get final sender list
FINAL_SENDERS = t.sort(seed).map(_.sender) -
Get final transaction list `FINAL_TX =
FINAL_SENDERS.forEach(sender -> TX_NONCE_SENDER_ORDER.popFirst(_.sender = sender))
The block is only valid if the resulting state root matches execution in exactly this canonical order.
This guarantees:
- Per-sender nonce order is maintained.
- The builder still chooses which transactions to include.
- Once the set is chosen, the interleaving order is fixed.
Opt-in:
We can accept this proposal now as a recommended transaction ordering. And it can be implemented starting now in the clients published by Ethereum Foundation. Then we can can start to recognize non-canonical-order blocks. And then later we can separately consider a hard-fork to disallow any blocks other than this canonical ordering.
Advantages over EIP-7956
- No dependency on unfinished randomness EIPs.
- No reliance on slot-level randomness that a consecutive-block proposer can predict/grind.
- Extremely simple — only uses
keccak256(native) and data already in the block body. - No need for bundles or new transaction types.
Trade-offs we accept
- A single address can spam many transactions to increase likelihood they will have the first and last transaction. This is disincentivized with the same anti-spam cost everybody has (i.e. paying gas).
- Grinding remains possible, to influence
nbits of entropy in the block requires2^ntransaction inclusion rerolls. This multiplies the effort of each MEV ordering activity inside a block.
Questions for the community
- Any edge cases I missed around reorgs, blob transactions, or system transactions (e.g. deposits)?
- Is this two-part (recommended and then hard-fork) novel approach to changing consensus rules a good idea or a bad idea?
I believe this is one of the simplest viable ways to meaningfully reduce harmful reorder MEV without adding complexity or external dependencies.
Looking forward to your thoughts!