**Date:** 2026 / 04 / 30 **Hosts:** Thomas, Jihoon **Time:** 11:00 **Context:** Implementation-focused working session for EIP-7805 (Fork-choice enforced Inclusion Lists), now scheduled for the Glamsterdam/Hegotá upgrade. Mechanism design is largely settled; the meeting focused on implementation, open spec questions, and a target of reaching a FOCIL devnet-0 by end of week. ## 1. Mechanism-Level Discussion ### 1.1 State Access for IL Validation (Privacy Protocols / "Branches") - Vitalik raised whether FOCIL validation should support transactions touching state outside a constrained "box" (e.g., privacy protocol nullifiers). - **Trade-off:** support full state access (requires Merkle proofs in transactions) vs. limited state with Bloom filters / scoped proofs. - Decision hinges on **includer hardware assumptions**: if includers can hold significant state, fewer proofs are needed; if includers should run on minimal hardware (broad participation), branch-serving infrastructure is required. - **No decision** — flagged for further work. ### 1.2 FOCIL × Frame Transactions (EIP-7702 / AA Compatibility) The core problem: with frame/AA transactions, a tx that's invalid at one point in block execution can become valid later (state dependency between txs). Two approaches considered for proving non-inclusion eligibility: 1. **O(n²) re-execution** by the builder — worst case quadratic, balloons verify gas costs. Rejected. 2. **Index-based bookmark approach (preferred)** — builder provides a small object stating "I attempted IL tx X at block index Y and it failed." Attesters verify only at that index. **Consensus:** Go with the index-based approach. Extra complexity is worth it because it permits a higher verify-gas-limit and broader 7702 use cases. **Sandwich/invalidation attack concerns** were dismissed for normal use cases — only the tx originator controls nonce/balance. Pathological cases (e.g., zero-slippage checks in verify phase) are explicitly **out of scope** for FOCIL; users can route those through builders/custom mempools. **Action item:** Need more eyes reviewing the "FOCIL-native account abstraction compatibility" writeup to validate the index-based design. ## 2. Network Object for Index Proofs **Question (Jihoon):** The index-based approach introduces a new network object alongside the block. Where does it live? - It's small (bitfield-style: indexes only for *excluded* IL txs). - ILs themselves are explicitly **not on chain**; should this proof be? - **Etan** initially favored on-chain (signed, cast-verified); **Justin** clarified the natural place is the **payload envelope** — signed, broadcast, but *not retained on chain*. Hash in header, data ditched after ~1 slot (analogous to how BALs are now handled). - **Resolution:** Put it in the envelope, retain only for ~1 slot. Attesters consume it during payload verification then discard. ## 3. Latest Spec Walkthrough (Jihoon) ### 3.1 Three Components 1. **IL Committee Selection** — bug fixed; spec now matches EIP. Committee is `IL_COMMITTEE_SIZE = 16`, derived from beacon committee (16 × 32 members) with a 2-epoch lookahead, allowing reuse of cached beacon committee data. 2. **IL Construction & Broadcast** — includers broadcast by **t = 8s** (arbitrary, tunable). 3. **View Freeze Semantics:** - Attesters: stop storing ILs at t = 8s. - Proposer: superset view — may store ILs received later (e.g., t = 9s) so late ILs are still considered when building the next slot's payload. ### 3.2 ePBS Timing Alignment - 8s IL deadline sits 1s before the t = 9s PTC deadline, giving the proposer leeway to fold in late ILs and trigger an EL payload update. ### 3.3 IL Freshness & EIP-8146 (BAL broadcast separation) - Proposal: broadcast BALs at ~3–4s into the slot, decoupled from full payload, so includers can update state and build fresh ILs without waiting on the full payload. - **Justin pushed back:** at 12-second slots, there's plenty of slack (payload ~4s, PTC ~9–11s) — separating BAL is unnecessary now. Treat as a **wildcard** for shorter-slot futures. - **Tomasz** raised that if BAL is broadcast independently, it needs a self-validating mechanism (e.g., embed the block hash / state root it corresponds to). Currently BAL validity is implicit via execution context. ## 4. Implementation Status | Client | Status | |---|---| | **Lodestar** | Running Kurtosis local devnet with BESU; functional. | | **BESU** | Integration working with Lodestar; debugging "IL too large" build bug. EL-spec tests passing except where they conflict with EIP-7732 baseline. | | **Lighthouse** | Branch is ~1.5 years old (originally on Fulu); rebasing onto Hesi/Glamsterdam. Targeting "something working tomorrow." | **CL-side complexity:** Reported as small/additive — ILs come from EL, no significant new storage. ~"few weeks of work." **devnet-0 requirement:** 2 CLs + 2 ELs. Lodestar↔Lighthouse interop **not yet tested**. Inter-op with glamsterdam-devnet-0; will move to glamsterdam-devnet-1 once stabilized. **Testing roadmap (Jihoon's priority):** Extend Hivetest for IL-specific cases (size limits, fork-choice compliance with IL+payload combinations). End-to-end tests across CL+EL combined with fork choice are the top priority for the next several months. ## 5. Open Spec Questions Resolved/Discussed ### 5.1 Non-Finality Behavior **Decision:** Disable FOCIL during non-finality, mirroring proposer-boost circuit-breaker behavior. - **Trigger:** No finality for **2 epochs** (i.e., didn't justify current epoch + didn't finalize previous). - **Rationale (Justin):** During forks, IL committee shuffling can diverge across branches. Validating ILs already requires checking the includer's committee membership — adding shuffling-disambiguation on top of attestation handling during a fork would risk client instability. ### 5.2 IL Bit List in the Builder Bid **Decision:** Keep the bit list (16 bits — small, safe for global topic propagation). **Use cases (Justin):** 1. Allows the proposer to verify the bid's IL coverage is a **superset of the freeze-time view** (not the proposer's own — must match attester deadline). 2. Provides a **signed commitment** from the builder; if a builder signs "I will satisfy this bit list" and then ships a payload that censors, that builder can be **circuit-broken / blacklisted** by the network. ### 5.3 IL Construction Heuristics - Spec leaves this client-defined (per EIP-7805) to encourage diversity. - **Dimensions discussed:** priority fee, mempool dwell time, transaction size. - **Justin's key suggestion:** **Reorged-out transactions should land on every honest IL** — provides a strong signal against hard censorship reorgs and is detectable. - **BESU:** plans plugin-based heuristic system (with sane defaults) so builders/operators can swap strategies. Justin warned this risks creating a market for "buying IL inclusion." - **Open coordination question (Julian):** how much **overlap** vs. **coverage** across ILs? Less overlap = more aggregate coverage but less redundancy. Per-client heuristics need protocol-level coordination on this trade-off (echoes the marchhill / aelowsson concerns on the Magicians thread about deterministic heuristics collapsing all 16 ILs into one). - Vitalik's idea: stateful heuristics (e.g., transactions unincluded for 2+ slots get force-included by all includers). ### 5.4 Mempool Sharding (raised by Etan) - Native-AA scaling may push toward mempool sharding. - Tunable parameters: number of includers, IL size cap (currently `MAX_BYTES_PER_INCLUSION_LIST = 8 KiB`, ~one blob's worth). - If the mempool is sharded, "16 includers per shard" may be too much — needs revisiting. Compatible in principle, but parameters require re-tuning. ## 6. Engine API / FCU Interaction (Justin) A subtle issue raised: under FOCIL, an EL receives a payload via `engine_newPayload` and replies whether the IL is satisfied. If **not** satisfied, the CL should *not* send `engine_forkchoiceUpdated` (because that block isn't its head — it must be reorged out). **Current behavior across clients:** - **Prysm:** auto-sends FCU whenever a payload extends the head, *without* running fork choice. This will need to change. - **Lighthouse, Lodestar:** already run fork choice and then send FCU — should adapt more easily. **Implication:** Post-Glamsterdam, the rule "payload extending head = head" no longer holds because of conditional IL satisfaction. CLs that bypass fork choice on the fast path will need engineering work. A side discussion explored what to do when **finality advances over a region containing payloads but the tip has no payload** — Lighthouse's pattern (run fork choice, compare full FCU message, only resend if changed) was identified as a clean approach. ## 7. Action Items & Timeline | Item | Owner | |---|---| | Debug BESU oversized IL bug | BESU dev | | Lighthouse rebase + Glamsterdam port | Lighthouse | | Lodestar ↔ Lighthouse interop test | Lodestar / Lighthouse | | devnet-0 target | All — by end of week | | More eyes on FOCIL × frame tx (index-based design) | Open call | | Spec review (CL, EL, engine API) | Open call | | Hivetest extensions for IL size, fork-choice scenarios | Jihoon + Steel | | BAL self-validation mechanism (block hash binding) | Tomasz / spec | | Coordination on IL overlap policy across EL clients | Future discussion | ## 8. Notable Sentiment - Spec has been stable for ~1.5 years; mechanism is settled. - Implementation effort is **dwarfed by ePBS**, which is consuming most client bandwidth — a recurring concern raised about resource availability. - General optimism: FOCIL has working local devnets that already survived the Fulu→Hesi fork transition, so fewer surprises are expected vs. ePBS.