Wallet Address: used to fund the bounty pool : 0x5dc697f2799bd232cad2d479c379ff305b699f9b
Name / Pseudonym: Pascaline
Role / Experience: Blockchain/backend Engineer & Independent Ethereum Protocol Researcher
Contact: Pascalineazodo1@gmail.com
Executive Summary
This review identifies eleven concrete findings in EIP-8105 and LUCID, three of them proven with exact quantitative or logical derivations rather than argued qualitatively: a literal transaction-type collision with a live, actively-discussed sibling EIP; a 128x incentive flaw in LUCID’s own recommended liability-sharing mechanism, derived directly from its fee formula; and a recovery mechanism with a precise, provable mathematical breaking point at exactly seven consecutive rejections. Beyond these, it presents a fully-specified liveness risk in LUCID’s consensus layer — traced through the actual vote-counting logic, verified against a concrete numeric counterexample, and checked directly against the foundational EIP-7732 specification rather than asserted — establishing exactly where the claim holds and exactly where it stops, with the reasoning shown rather than taken on faith. It also identifies an internal contradiction inside EIP-8105 itself: the EIP’s own dismissal of builder-collusion risk assumes a fragmented key-provider market, while the EIP’s own trust-graph rationale, in a separate section, treats a dominant, concentrated provider as a real possibility the protocol has to be designed around — meaning the specification’s security analysis and its design rationale do not survive being read together.
This is not a survey of design opinions. Every finding here traces to a specific line of spec text, a specific formula, or a specific cross-EIP reference, checked directly against the primary sources — including EIP-7732, EIP-7805, and EIP-8141, rather than relying on secondary summaries or the FAQs alone, which we found in more than one place to disagree with the specifications they describe.
The review also goes beyond specification-level defects to substantive economic and systems analysis: a formal auction mechanism for monetizing backrunning with a quantified improvement over the status quo, a precise structural account of why execution quality diverges sharply by application type, and an identification of the single unstated invariant — inclusion neutrality — that both EIPs’ own stated goals imply but never formalize, and that five separate findings in this review each independently violate.
Taken together, this review answers every one of the six areas the bounty itself asks reviewers to consider, at genuine technical depth in each rather than superficial coverage.
On existing feedback. Two prior pieces of public feedback are foundational to what follows, and we credit both explicitly rather than restate them. Bonux produced a rigorous formal model of key-withholding as priced optionality. Vellichorlabs, produced an exceptionally thorough spec-level audit of LUCID, including a genuine cryptographic nonce-reuse vulnerability and a proof that the PTC’s “missing” and “observed” conditions can overlap. We treat both as correct and build forward from them including, in finding 1 below, showing that overlap compounds with a subjective-input problem into a contested-vote risk neither of them identified, while proving precisely where that risk stops short of a consensus-safety violation rather than overclaiming it.
Findings at a glance
| Findings | Category | Severity |
|---|---|---|
| 1. LUCID’s PTC timeliness mechanism lets honest validators structurally disagree with no adversary required, producing a contested vote that feeds directly into finding 4’s recovery-chaining risk. | Liveness risk | High |
| 2. EIP-8105 and EIP-8141 hardcode the identical transaction type byte 0x06 | Specification defect | Critical |
| 3. LUCID’s sponsor-ST mechanism amplifies any non-reveal into a 128x penalty | Specification defect | Critical |
| 4. LUCID’s recovery mechanism has a provable breaking point at exactly 7 consecutive rejections | Specification defect | Critical |
| 5. EIP-8105’s censorship-resistance guarantee is formally incentive-incompatible under the congestion conditions it exists to address | Systemic economic risk | High |
| 6. LUCID’s own trust-graph proposal imports EIP-8105’s already-proven reachability DoS | Design gap | High |
| 7. EIP-8105’s builder-collusion risk dismissal assumes a fragmented key-provider market that the EIP’s own trust-graph rationale says may not hold | Design gap / internal inconsistency | High |
| 8. EIP-8105 key-provider identity has near-zero cost of exit-and-reentry | Design gap | Medium |
| 9. Adoption curve leaves the slowest adopters facing a more concentrated, more toxic residual mempool during transition | Systemic economic risk | Medium |
| 10. Provider/publisher choice is a free, permanent, cross-transaction deanonymization heuristic | Systemic/privacy risk | Medium |
| 11. Envelope-signer/payload-signer trust assumption contradicts EIP-8105’s own privacy feature | Design tension | Low-Medium |
The Unstated Invariant: What “Censorship Resistance” Should Actually Mean
Before the six topics, one framing point worth stating explicitly, because it changes how several of the findings below should be read together rather than separately.
Both EIPs’ own Abstract and Motivation sections commit to the same specific term. EIP-8105, verbatim: “protecting them from front running and sandwiching attacks as well as increasing censorship resistance guarantees… increase real time (‘weak’) censorship resistance of the protocol.” Neither EIP ever formally defines what censorship resistance means as a checkable property — it is used rhetorically throughout, never pinned to a precise invariant a reviewer could test a design against.
We propose the natural formalization implied by the EIPs’ own stated goal: for any two transactions of equivalent economic value, the probability and expected cost of timely inclusion should not depend on which key provider or publisher the sender chose, which application category the transaction belongs to, when the sender adopted encrypted transactions, or the sender’s on-chain behavioral history. Call this inclusion neutrality.
Read this way, five of the findings below are not a list of unrelated issues — they are five distinct, independent violations of the same unstated principle both EIPs already claim to uphold:
- Provider-choice violation — Topic 4 (a sender’s backrun revenue share depends entirely on which key publisher they picked) and Topic 1.5 (a transaction’s validation cost and inclusion feasibility depend on that provider’s position in an unbounded trust graph).
- Application-category violation — Topic 3 and Topic 6 (liquidations and other racing-style applications are structurally worse served than swaps, for reasons neither EIP’s inclusion guarantee accounts for).
- Time-of-adoption violation — Topic 5.4 (senders who adopt later face a more concentrated, more toxic residual mempool than senders who adopt early, even though both are told the same protection story).
- Behavioral-history violation — Topic 6’s metadata-correlation finding (a sender’s habitual provider choice becomes a permanent fingerprint over time, meaning repeat users face a different effective protection level than first-time users, in the opposite direction the FAQ’s adoption narrative assumes).
- Congestion violation — Topic 5.2 (EIP-8105’s inclusion guarantee holds only when the block isn’t gas-constrained by plaintext demand, meaning protection is weakest exactly when blockspace is scarce and censorship pressure is most likely to actually be attempted)
Stated as an operational test rather than just a principle, this becomes something any future addition to either EIP can be checked against directly:
| Dimension | Neutrality question | Where it’s violated in this review |
|---|---|---|
| Provider | Does choosing provider A rather than B change inclusion probability or cost? | Topic 4, Topic 1.5 |
| Application | Does the transaction’s application category change protection quality? | Topic 3, Topic 6 |
| Adoption | Does joining later change the protection actually received? | Topic 5.4 |
| History | Does prior provider or application behavior affect future privacy or inclusion? | Topic 6 |
| Congestion | Does protection weaken or disappear precisely when blockspace becomes scarce? | Topic 5.2 |
None of this requires either EIP to abandon its current mechanism design. It requires stating, explicitly, what “censorship resistance” is supposed to guarantee — and then checking future additions (bundling, sponsor STs, trust graphs) against this table before they ship, rather than discovering violations of an unstated goal after the fact, the way this review had to.
Topic 1: Dealing With Key-Withholding Attacks
1.1 What’s already established
Bonus’s formal treatment — modeling the reveal/withhold decision as E[V_withhold] − F versus E[V_reveal] − F/128, and showing a fixed penalty cannot always outprice a sufficiently valuable suppression opportunity — is, in our judgment, the correct and sufficient economic framing of the core problem. We do not re-derive it. Vellichorlabs separately proved a PTC member can force a key into “missing” status at zero cost by voting late. Both are load-bearing for what follows.
1.2 [High] A contested-vote liveness risk in LUCID’s payload-timeliness mechanism — proven precisely, including where the claim stops
The mechanism vellichorlabs’s finding operates on has a second property, underneath the boolean overlap they proved, worth making explicit and worth proving all the way through to its actual consequence, rather than stopping at just “validators can disagree.”
The mechanism. timely_key_votes and its late/equivocated counterparts are not a globally-fixed dataset every observer computes identically. The spec defines them per-validator: “the PTC of the next slot considers: all… votes it observed at lucid_key_vote_deadline… all… votes it observed after lucid_key_vote_deadline…” That “it” is each individual PTC member, tallying based on their own gossip-reception timing. For any vote arriving within the network’s ordinary propagation-jitter window of the deadline, two honest, correctly-implemented validators can classify the identical vote into different timely/late buckets.
A concrete, verified counterexample. Consider a key with 4 relevant votes near the deadline. Validator A and Validator B observe identical content, differing only in which side of the deadline they place a single borderline vote:
| Tally (E=0) | timely_1 | timely_0 | late_1 | late_0 | Missing? (2·T1 ≤ T1+T0+L0) | Observed? (2·(T1+L1) > T1+T0+L1) |
|---|---|---|---|---|---|---|
| View A | 0 | 0 | 1 | 3 | 0 ≤ 3 → TRUE | 2 > 1 → TRUE |
| View B (one content-0 vote reclassified late→timely) | 0 | 1 | 1 | 2 | 0 ≤ 3 → TRUE | 2 > 2 → FALSE |
Validator A’s tally sits in vellichorlabs’s proven overlap zone — both conditions hold simultaneously, and the spec is silent on which one governs. Validator B, differing only by reclassifying a single vote from “late” to “timely,” exits that overlap entirely and lands on an unambiguous “missing” conclusion. We verified this computationally rather than by hand, since it is exactly the kind of arithmetic a first attempt is likely to get subtly wrong. This is, if anything, a sharper problem than “two validators disagree”: Validator A faces a genuine specification gap with no stated tie-breaking rule, while Validator B has a clean instruction — meaning different client implementations could reasonably invent different tie-breaking conventions for the overlap case, a second, independent source of divergence layered on top of the timing subjectivity itself.
What this actually does to block construction, concretely, not just abstractly.
Validator B’s conclusion is unambiguous: the key is missing, so Validator B expects and attests to a payload that omits the decrypted transaction — its execution is skipped, per the spec’s own rule that a missing key means the transaction is not executed. Validator A has no such clean answer. Because both conditions hold for A’s tally, the spec gives no instruction for which behavior A’s own client should adopt — accept a payload that requires the decrypted transaction (treating the key as observed), accept one that omits it (treating the key as missing, matching B), or implement some third, unspecified convention. This is not a hypothetical clean split between “missing” and “observed” — we showed directly above that such a split is mathematically unreachable from a single vote set. It is something we think is equally serious: one honest validator with a definite, correct answer, and another with none at all, from votes that differ by a single message arriving a few hundred milliseconds earlier or later.
The spec itself states what Validator A does next, and it is not confined to that one key.
Immediately following the two conditions, the spec states: “If this test fails for any key, the PTC of the next slot votes against the payload timeliness.” “This test” fails exactly when both conditions hold — the overlap zone above, which we already showed is the only way the test can be ambiguous, having separately confirmed neither condition can fail to hold for any tally. That means Validator A is not merely uncertain about one transaction — the spec directs A to cast a vote against the entire payload’s timeliness, on the strength of a single ambiguously-timed key. Validator B, resolving cleanly, has no such instruction and votes normally. Two honest validators, the same underlying votes, opposite conclusions about the same payload’s overall timeliness, not by inference, but by the spec’s own stated rule.
Following it through to the actual question: does this cross into a consensus-safety violation?
We pushed our own claim further than our first draft did, and it does not survive fully intact. PTC_SIZE = 512 in EIP-7732, and PAYLOAD_TIMELY_THRESHOLD is set at 2/3 of the committee — roughly 342 votes. All 512 members of the next slot’s PTC are voting on the same binary question (was this payload timely), each casting one attestation based on their own private missing/observed conclusion for every key in the payload. For two opposing conclusions to each independently reach a 2/3 supermajority requires at least 342 + 342 = 684 votes from a 512-member committee — mathematically impossible without equivocation, which the spec excludes from being counted at all. This means the honest answer to whether this produces two independently-valid, conflicting protocol outcomes is no. What we have proven, precisely, is narrower: honest disagreement on even a single key, filtered through vellichorlabs’s proven-wide overlap zone, can — by the spec’s own explicit instruction, not by our inference — pull individual validators toward voting against the whole payload’s timeliness, producing a genuinely contested aggregate vote that may fail to reach 2/3 in either direction. Not a safety violation producing two finalized truths — a liveness risk with a fully-specified mechanical path from one ambiguous key to a contested payload-level vote.
Why the contested case still matters, not despite this correction but because of it.
A failed supermajority on payload timeliness is exactly what the spec elsewhere calls a payload that “turns out to be invalid or untimely” — the precise trigger condition for “Recovery under rejected payload,” whose breaking point at exactly 7 consecutive rejections we already proved. A sophisticated key publisher has a cheap, deliberate way to manufacture the ambiguous-key condition above — releasing right at the timing boundary is no different in cost or effort from the withhold/reveal decision they already make every time. EIP-7732’s own Security Considerations note, about a related but distinct free-option mechanism in base ePBS, that “some preliminary data in the form of simulation suggests that the number of these occurrences may be noticeable” — meaning missed-slot events are not a purely theoretical concern for PTC-based designs even before LUCID’s second layer is added. The chain is now complete and textually grounded at every step: an ambiguous key produces a spec-mandated vote against the payload; enough such votes produce a contested supermajority; a failed supermajority is a rejected payload; and a rejected payload’s recovery has a proven breaking point.
Suggested fix: Bind the timely/late classification to an on-chain-recorded, objective timestamp (e.g., inclusion in a preceding gossip-aggregation round with a fixed cutoff) rather than each validator’s local reception time, removing the subjectivity at its source rather than only mitigating its consequence.
[1.3. Continues in Page 2 Below]