**Date:** 2026 / 04 / 29 **Hosts:** Raul / Potuz / Jacek **Time:** 10:00 **Topic:** EL/CL Sync Architecture — Short-term (Glamsterdam) decisions and long-term direction --- ## 1. Meeting Goals The session aimed to produce actionable decisions on: 1. **Short-term:** EIP-8237 (Potuz's proposal) — go/no-go for Glamsterdam 2. **Long-term:** Future of node architecture and EL/CL interaction model Format chosen: "sandwich" — short-term scope first, surface architectural blockers, dive into long-term, then return. --- ## 2. Background: How Sync Works Today (per Potuz) - Node starts → checkpoint sync → FCU sent to EL → EL syncs autonomously - CL downloads blocks **with payloads**; validates block hash to keep CL/EL state-transition functions in sync (parent block roots, timestamps, withdrawals, deposits, execution requests) - Block hash check can be done by the CL directly (via RLP) or delegated to the EL via `newPayload` - EL replies "valid" or "syncing — block hash OK" → CL proceeds optimistically - Both sides eventually converge; live operation continues via gossip **Why the dual validation matters:** If CL and EL validate independently without a shared check, both can be locally valid but **out of sync** (different withdrawals, execution requests, block hashes), invalidating the chain. --- ## 3. EIP-8237 (Potuz's Proposal) ### Core Idea With Gloas, the CL no longer needs the execution payload to perform its state transition. The proposal: - **Remove range-sync of payloads on the CL entirely** - Keep gossip, EL sync, and CL sync **unchanged** - Add an **accumulator on the block header** so that when CL and EL converge, both can verify their independent chains agree on all shared fields ### Trade-offs - ✅ Minimal change to CL sync logic — Potuz: "I don't need to change one line of code" - ✅ Avoids downloading payload data twice - ❌ Adds a header accumulator (new consensus field) - ❌ Forecloses the longer-term architecture of moving payload distribution fully to the CL network ### Storage Reality Check (Polled) | Client | Stores Execution Payloads? | |---|---| | Nimbus | Yes (full historical) | | Erigon (Caplin) | Yes | | Prysm | No (delegates to EL via engine API) | | Lighthouse | No (blinded) | | Lodestar | No (blinded) | | Teku | No (blinded) | --- ## 4. Alternative: Jacek's "Top-Up Sync" Proposal Documented in a HackMD posted that morning. Architecture already used by **Nimbus** and **Erigon (Caplin)**: - CL drives the EL as a **deterministic block-execution library** - CL fetches historical execution payloads on the **CL p2p network** - CL queries EL head, then feeds missing payloads one-by-one (batchable later) - Removes the need for execution clients to serve historical blocks on devp2p - **Preconditions:** Both layers must be able to checkpoint/snap sync within the weak subjectivity period (~5 months); SSZ-based engine API; mempool networking eventually moved to CL ### Block Hash Verification Options under Top-Up Sync 1. Lockstep CL/EL sync (slow) 2. Optimistic CL with RLP verification on CL side (Lighthouse, Nimbus do this) 3. **Use Potuz's accumulator** — removes RLP requirement from CL 4. Hard-code RLP encoding into spec as opaque bytes (analogous to SSZ-on-EL) --- ## 5. The Three Possible Futures | Path | Description | |---|---| | **A** | Adopt EIP-8237 fully → remove CL payload sync, mandate accumulator | | **B** | Adopt top-up sync fully → deprecate EL devp2p block sync | | **C** | Status quo middle ground → both protocols available, free-for-all | Jacek's position: B is the long-term direction; preserving the CL payload-by-range RPC during Gloas keeps B reachable. Fully adopting A closes the door on B. --- ## 6. Key Disagreement: Sync Complexity **Potuz:** Implementing range-sync of separated blocks + payloads is genuinely hard — Prysm is currently downscoring peers due to incompatible block/payload pairings. Requires interleaving, peer-attribution logic for bad data, etc. **Jacek/Lion/Lodestar:** Already implemented; not dramatically complex. Lodestar specifically has implemented the new sync and would resist removing it. **Critical correction during meeting:** Geth (and apparently other ELs, "since 2–3 months ago") now accept FCU **without** a payload to initiate snap sync. This was historically a blocker and changes the choreography options significantly. --- ## 7. Room Position on EIP-8237 Effectively rejected for Glamsterdam: - **Against (for Glamsterdam):** Lighthouse, Lodestar, Nimbus - **For:** Prysm (Potuz) - **Partially supportive:** Jacek wants only the accumulator portion; Geth dev sees it as the only realistic option for non-merged clients but agrees direction is top-up sync **Decision:** Do **not** include EIP-8237 in Glamsterdam. Revisit in H-fork or later. --- ## 8. Decisions Reached 1. ❌ **EIP-8237 dropped from Glamsterdam** 2. ✅ **Preserve `execution_payload_by_range` RPC on CL libp2p** (keeps top-up sync future open) 3. ✅ **Pursue a small, tight "choreography EIP"** that: - Normalizes FCU / `newPayload` / `getPayload` sequencing - Specifies snap-sync initiation handshake (FCU-only path now viable) - Defines error codes for "EL has no state" condition (`eth_syncing` insufficient — needs precision) - Tightens valid/invalid consistency between `newPayload` and FCU responses - Requires EL dev participation 4. ✅ **Future work tracks:** - SSZ-based execution API (already proposed for ZK/witness work) - Batched engine API calls (e.g., 100 blocks at once) - Move blob and possibly receipt distribution to CL network (post-Glamsterdam) 5. ✅ **Light-client–driven head discovery** (Nimbus pattern) noted as desirable optimization --- ## 9. Execution Requests Deduplication (Secondary Topic) **Context:** Prysm draft PR removes the `execution_requests_root` field from the beacon block, since the relationship can be established through bid → payload → block parentage. **Mikhail's pushback + Potuz's clarification:** - The root must be **kept on the bid** (needed for checkpoint sync — historical reason for the EIP-7594-era split) - Better to **keep the root on the beacon block** too, so SSZ hashing remains consistent - Change is **gossip-only**; RPC (`by_range`, `by_root`) still returns the expanded form - Approach: separate gossip object (decoupled), not a zero-filled blinded variant **Decision:** - Keep root on both bid and beacon block - Implement as decoupled gossip schema - **Not** for DevNet 1 (chain currently broken on fork choice — focus on correctness) - Target DevNet 2; compulsory but deferred - Consensus-spec change, no separate EIP number --- ## 10. Side Topic: Joint vs. Separated Client Cost Asymmetry Potuz raised that any API choice imposes different costs on modular clients (Prysm + external EL) vs. integrated clients (Nimbus, Erigon/Caplin): - Modular CLs can't avoid double-storage if they don't store payloads themselves (must blind/unblind, serialize, reassemble for serving) - Integrated clients can store once and avoid the engine API round-trip **Counter (Jacek, Erigon dev):** A well-designed binary, streaming, SSZ-based execution API minimizes this gap. Erigon dev: "We ought to just give you a block that you can stream — you shouldn't need to do any translation." --- ## 11. Meeting Outstanding / Tabled Items - Receipts handling under top-up sync (still needed for Glamsterdam — out of scope for this meeting) - Blob distribution consolidation - Mempool migration to CL network - Block-number ↔ slot mapping pain points (mostly resolved by slot field on payload in Gloas) - ZK-future state distribution (precondition: snap sync exists; out of scope here) - Disc v5 / ENR encoding issues affecting Nimbus peer connectivity (briefly mentioned) --- ## 12. Action Items | Owner | Action | |---|---| | Jacek | HackMD on top-up sync posted in EVPS Discord; soliciting EL-dev review to convert into EIP | | Raul | Update Prysm draft PR to retain execution_requests_root on beacon block; circulate for CL review | | All CLs | Review execution-requests gossip-schema proposal | | Small group | Convene to draft choreography EIP (FCU/newPayload sequencing, snap-sync initiation) — needs EL dev representation | | Maintainers | Update DevNet page with current EIP list and inclusion status | | Prysm team | Continue debugging payload-by-range sync downscoring issues | --- ## 13. Bottom Line The meeting consolidated around a **layered strategy**: keep current sync mechanics for Glamsterdam (no EIP-8237), preserve the optionality to migrate fully to CL-driven sync in a future fork, and use the intervening time to (a) define a precise choreography spec, (b) modernize the engine API toward SSZ + batching, and (c) let the integrated-client implementations (Nimbus, Erigon/Caplin) prove out the top-up architecture in production.