- Wallet address: 0xf523737b27dB9fE56f500c52695770ee6248274e
- Pseudonym: crownghoul
- Role: Independent spec-level Ethereum protocol researcher
**
Note: I find it particularly important to address this review as not just for a bounty submission, but also as a proper open-source beacon so that other security researchers scrolling across Ethereum forums online can actually grep it, understand the threat models, and contribute. I am not assuming the readers’ basic familiarity with mempool encryption, so I have also included an early explanation of the fundamentals.
**
Encrypted Mempools on Ethereum:
Abstract
Public mempools expose pending transactions to visibility-based exploitation, allowing searchers and builders to extract value via front-running and sandwich attacks. This has been a persistent problem across Ethereum’s history. This review examines EIP-8105 and EIP-8184, two protocol-level proposals that introduce mempool payload encryption. By analyzing their cryptographic orchestration, key-provider mechanics, and execution pipelines, I evaluate how each proposal mitigates MEV extraction, identify specification-level inconsistencies and theoretically derived vulnerabilities, and discuss edge cases relevant to real-world deployment.
Table of Contents
- The shared problem
- Working principles
- 2.1 EIP-8105 — Universal Enshrined Encrypted Mempool
- 2.2 EIP-8184 — LUCID
- Methodology and scope
- Notation and terminology
- Findings — EIP-8105 Normative Patch Set
- Patch A — bind decrypted output to a submission-time commitment
- Patch B — protocol-checked key-ID namespacing and cross-envelope ciphertext binding
- Patch C — bind key messages to the block hash at the protocol level
- Patch D — scale the PTC validation gas ceiling per registered scheme
- Patch E — decrypted-transaction gas must count toward the inclusion block’s gas limit
- Patch F — add a
signature_idbyte to the envelope for forward compatibility with EIP-8141 - New finding — normative text contradicts the “same-slot execution” marketing claim
- Findings — EIP-8184 (LUCID) Supplementary Review
- Correction — the “full gas-limit charging” critique is already substantially addressed
- Finding LUCID-1 — the non-reveal penalty is not what the Rationale says it is
- Candidate issues investigated and ruled out
- Cross-cutting findings — applicable to both EIPs
- Metadata privacy is out of scope for both proposals, and neither says so
- Provider/publisher trust is a strong, not weak, trust assumption
- Summary of findings and severity assessment
- References
1. The shared problem
Right now, broadcasting a transaction to the public mempool exposes its contents (calldata, recipient, value) before it’s ordered into a block. This lets:
- Searchers/builders front-run and sandwich — see your DEX trade, insert trades around it, extract value.
- Builders/relays censor in real time — filter transactions based on what they say or who sent them.
- Both of these effects push users toward private RPCs / private order flow, which centralizes power in a handful of trusted builders and starves the public mempool (today one builder reportedly does ~50% of blocks).
The fix both EIPs pursue is this: hide transaction contents until after ordering is fixed, then reveal and execute. This is “commit before reveal,” implemented as an encrypted transaction whose plaintext only appears once its position in the chain can no longer be gamed.
A key piece of context I discovered and deem important to add here, because it reframes this whole comparison: these aren’t really two competing proposals anymore. EIP-8105’s own author (Jannik Luhn, Shutter) publicly withdrew it as a Hegotá headliner in Feb 2026 and threw the team’s full support behind LUCID (EIP-8184), while keeping 8105 open just for discussion. So the more accurate way to picture these proposals is: 8105 was the first design, LUCID (8184) iterated on it, and now the field has mostly consolidated around LUCID. Both proposals nonetheless remain live, independently reviewable specification documents, and both are treated as such throughout this review.
2. Working principles
2.1 EIP-8105 — Universal Enshrined Encrypted Mempool
Core idea: scheme-agnostic key providers plus two new transaction types.
EIP-8105 introduces type 0x05 for encrypted transactions and type 0x06 for decrypted transactions. An on-chain key-provider registry allows any entity to register as a key custodian by exposing custom decryption and validation logic, while declaring trusted peer providers to form a directed trust graph. Trust is defined as reachability in this graph: provider A trusts provider B if and only if a directed path from A to B exists.
A typical transaction execution flow is:
- Submission. The sender encrypts the transaction payload using a key supplied by a registered key provider, wrapping it in a type
0x05transaction containing the chain ID, fee parameters, gas amount, key-provider ID, key ID, and ciphertext. Upfront gas for the envelope (gas_amount) is paid immediately, analogously to EIP-1559. - Block inclusion. Block builders include these encrypted transactions at the tail end of the block payload — after decrypted transactions and after any other plaintext transactions — without prior knowledge of the underlying contents. An ordering constraint additionally requires that if encrypted transaction A is preceded by encrypted transaction B in the block, A and B must either share a key provider or B’s provider must be trusted by A’s provider.
- Key revelation. The responsible key provider observes the block and must publish either the decryption key or an explicit withhold notice for every key ID it is referenced by. This may happen immediately upon observing the payload or be delayed to a later point in the slot.
- PTC validation. The Payload Timeliness Committee (PTC), extended from EIP-7732 (ePBS), validates the published keys using the registered provider’s validation function, under a hardcoded small gas limit per key, and attests to the presence or absence of a valid key for each encrypted transaction. If valid and timely, the protocol executes the transaction as a type
0x06decrypted transaction the following block. If keys are withheld or invalid, the corresponding transaction is skipped.
Because the decryption and key-validation functions are registered as arbitrary on-chain EVM bytecode, executed on-chain by the PTC, the protocol places no constraint whatsoever on what cryptographic scheme that bytecode implements — it may be backed by threshold encryption, MPC committees, TEEs, delay encryption, FHE, or, as discussed in Section 5 (Patch A), nothing cryptographic at all. This is the design’s stated “universality”: neutrality toward encryption technology, at the cost of pushing essentially all correctness guarantees for a given provider onto that provider’s own registered implementation rather than the protocol itself.
Gas provisioning for the encrypted transaction envelope is separated from gas provisioning for the eventual decrypted execution: the envelope consumes gas_amount against the block in which it is included, while the corresponding decrypted transaction, executed one block later, draws on a gas limit derived from gas_amount minus overhead, but — as the current normative text stands — does not count against the gas limit of the block in which it executes (see Patch E).
Key-provider incentives are explicitly left out of the base protocol. Providers may be compensated via off-chain agreements with builders, per-transaction user payments, or may operate as public goods; they may voluntarily submit to off-chain slashing arrangements for unjustified key withholding, but no such mechanism is enshrined.
2.2 EIP-8184 — LUCID
Core idea: commit-reveal via FOCIL inclusion lists, with a priced top-of-block (ToB) auction and a one-slot execution delay.
A sealed transaction (ST) pairs a signed ST ticket — a visible, EIP-2718-typed transaction that charges the sender, binds a key_publisher, and specifies a maximum ToB fee — with a ciphertext envelope, which remains hidden until the corresponding decryption key is released. The plaintext transaction (PT) that the ciphertext decrypts to may have a different sender than the ST ticket itself, since the ticket only needs to authenticate the charge, not the eventual on-chain actor. Senders encrypt to a key publisher following that publisher’s off-protocol instructions, or arrange trustless self-decryption.
The flow, spanning roughly two slots, is:
- Propagation. Before the FOCIL attester deadline of slot n, includers propagate inclusion lists (ILs) that may incorporate STs and ST bundles alongside ordinary plaintext transactions. STs can be bundled together if every ST ticket in the bundle shares the same
key_publisher, who signs the bundle to authenticate its composition and order. - Commitment. Once builders know which ILs and keys (released the previous slot) they must adhere to, they cast an extended
ExecutionPayloadBidcontaining ST-commitments — hashes of the STs/bundles they intend to include, together with a builder-declaredexecutablebitfield andgas_obligation, ordered by descending ToB fee (commitment_tob_fee), tie-broken by descendinggas_obligationand then ascendingcommitment_root. The proposer includes the winning bid in the beacon block for slot n. - Key release. Each key publisher observes the ST-commitments in the beacon block, confirms its own commitment’s declared
gas_obligationis correct and that the aggregategas_obligationacross all commitments fits withintob_gas_limit, and — once confident the beacon block will become canonical — releases the decryption key(s) (LucidKeyMessage) that reveal its STs. Keys are flooded peer-to-peer and must be observed by the next slot’s PTC before a fixed deadline. - Timeliness attestation. The PTC of slot n+1 casts a bitfield vote (
LucidKeyTimelinessVote) on which committed keys it observed in time, using a threshold rule over committee votes to determine, per commitment, whether the builder must treat that key as “observed” or “missing.” - Execution. The ST ticket is charged in the block for slot n (base fee, key publication fee, priority fee, and ToB fee are deducted at that point, capped by the sender’s declared maxima). The corresponding decrypted transaction executes top-of-block in the block for slot n+1, run against the header context of block n (not n+1) specifically to prevent the builder from injecting information into its execution that was only available after witnessing other decrypted transactions. Successful decryption triggers a partial refund: unused base fee (relative to actual gas used) and a
(TOB_FEE_FRACTION − 1) / TOB_FEE_FRACTIONfraction of the posted ToB fee are returned to the sender; the priority fee is never refunded, on the reasoning that the ST occupied bounded block space upon commitment regardless of outcome.
Non-reveal — whether from deliberate withholding or an innocent failure to propagate or release a key in time — is priced through forfeiture of the ToB fee, and, as discussed in Section 6 (Finding LUCID-1), of considerably more than just the ToB fee under the current mechanism. A max_preceding_commitments field lets each sender cap how many earlier, still-unrevealed commitments may execute ahead of them, trading protection from probabilistic front-running against a higher required ToB fee to secure an early position. LUCID additionally requires EIP-7805 (FOCIL) for its inclusion-list machinery, in addition to the ePBS foundation (EIP-7732) both EIPs share.
3. Methodology and scope
I decided to make this review as a specification-level audit: it examines the normative text of both EIPs as published on eips.ethereum.org (canonical source, ethereum/EIPs master branch, both fetched 2026-07-25), cross-referenced against the associated pre-EIP research discussions on ethresear.ch, the live implementation-readiness and bounty-feedback threads on Ethereum Magicians, and independent, non-EIP-specific security literature on encrypted mempools as a general design class (zkSecurity’s May 2026 treatment of encrypted-mempool security invariants, and a16z crypto’s July 2025 systematic survey of technical and economic limitations). The latter two sources were used specifically to check whether general, previously-documented failure classes for this category of design — ciphertext-context binding, metadata leakage, and the strong-vs-weak trust-assumption distinction for decryption committees — had concrete, EIP-specific instances that the EIP text itself does not address; one of them (Patch B) did. Every author statements from forum threads were used to disambiguate or corroborate ambiguous normative language, and are quoted directly rather than paraphrased wherever relied upon. No client implementation, testnet deployment, or executable proof-of-concept was produced or run against either specification; all findings below are derived from close reading of the text itself, tracing field definitions and validity conditions across sections to check internal consistency, cross-referencing against documented general failure modes in the wider literature, and constructing concrete adversarial or edge-case scenarios by hand against the stated rules.
My findings are presented in the same drop-in-diff convention throughout: quoted current text, a proposed replacement adoptable without further design work, and a rationale explaining the underlying defect and its consequence. Two categories of content are distinguished: original findings developed independently in the course of this review, and one section (§6, EIP-8184) that was deliberately scoped to avoid duplicating an existing, independently authored community revision covering key-timeliness threshold ambiguity, censorship-resistance exclusion/placement inversion, recovery-payload reordering across scheduling blocks, the executable/ordering fixpoint definition, top-of-block tie-break grinding, and DEM nonce reuse under ticket replacement. That revision is referenced descriptively at the relevant point below rather than reproduced.
4. Notation and terminology
| Term | Meaning |
|---|---|
| PTC | Payload Timeliness Committee (EIP-7732/ePBS) |
| FOCIL | Fork-Choice Enforced Inclusion Lists (EIP-7805) |
| IL | Inclusion list |
| ST | Sealed transaction (EIP-8184) |
| PT | Plaintext transaction — the decrypted content of an ST |
| ToB | Top-of-block |
tob_fee |
Fee an ST posts to compete for top-of-block execution priority |
gas_obligation |
Aggregate gas an ST-commitment (or bundle) claims against the ToB gas budget |
key_provider / key_publisher |
8105 / 8184 terms respectively for the party responsible for releasing a decryption key |
| Envelope (8105) | The plaintext-visible wrapper of an encrypted transaction, carrying fee parameters and ciphertext |
| Ticket (8184) | The plaintext-visible wrapper of a sealed transaction, carrying fee parameters and a ciphertext hash |
| Commital (scheme property) | An encryption scheme in which the ciphertext binds the decryptor to a single, predetermined plaintext, such that no choice of decryption key can produce an alternative output |
Please, continue reading as Part 2 — EIP-8105 Normative Patch Set]