Skip to content

Commit aebde26

Browse files
committed
Reframe Lean as "client-only today, EL pairing later"
The earlier wording described Lean consensus as architecturally standalone ("no EL pairing", "no Engine API", "fully standalone"). That isn't the long-term picture: Lean clients are designed to pair with EL clients in the regular EL+CL devnet shape; they just don't implement Engine API yet, so present-day devnets are client-only. Reframe both code comments and docs around that distinction: - main.star and lean_launcher.star comments now say "no Engine API yet" / "until Engine API ships" instead of declaring Lean architecturally EL-less. - docs/lean-consensus.md introduces Lean as "client-only today, EL pairing later" and notes the motivation for landing it in this package is exactly to be ready for the EL+Lean shape when it ships. - The why-a-parallel-pipeline table is retitled "Lean (today)" and adds a follow-up paragraph on how the two pipelines compose once Engine API lands.
1 parent c2d8a06 commit aebde26

3 files changed

Lines changed: 42 additions & 22 deletions

File tree

docs/lean-consensus.md

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@
66
> have stub launchers covered by the same contract.
77
88
The Lean Ethereum protocol — sometimes called "Beam Chain" — is a redesign of
9-
Ethereum's consensus layer with **no EL pairing**, **no Engine API**, **no
10-
JWT**, and **post-quantum (XMSS / hash-sig) validator signatures**. Lean
11-
consensus clients are standalone consensus nodes that talk only to each other
12-
over QUIC + libp2p gossipsub. The Lean protocol specification lives at
9+
Ethereum's consensus layer built around **post-quantum (XMSS / hash-sig)
10+
validator signatures**. Today's Lean clients run client-only devnets while
11+
the spec stabilises: no Engine API integration yet, no JWT, just consensus
12+
nodes peering over QUIC + libp2p gossipsub. Engine API support is on the
13+
roadmap, after which the same Lean clients are designed to pair with EL
14+
clients in the regular EL+CL devnet shape — which is exactly the motivation
15+
for landing them in this package alongside the existing EL pipeline. The
16+
Lean protocol specification lives at
1317
[ReamLabs/leanSpecs](https://github.com/ReamLabs/leanSpecs) and is
1418
co-developed by the teams behind
1519
[ream](https://github.com/ReamLabs/ream) (Rust),
@@ -28,16 +32,17 @@ new Lean client, see
2832

2933
## Why a parallel pipeline?
3034

31-
Lean consensus differs from the existing EL/CL pipeline along every axis that
35+
Lean consensus today differs from the EL/CL pipeline along several axes that
3236
shaped the original `participant_network` design:
3337

34-
| Concern | EL/CL | Lean |
38+
| Concern | EL/CL | Lean (today) |
3539
|------------------------|--------------------------------|-------------------------------|
3640
| Genesis tool | `ethereum-genesis-generator` | `eth-beacon-genesis leanchain` |
3741
| Validator signatures | BLS | XMSS (hash-sig) |
3842
| Validator key keystore | EIP-2335 JSON | SSZ `validator_N_*_key_*.ssz` |
39-
| Pairing | 1 EL + 1 CL (+ optional VC) | Standalone, no EL |
40-
| RPC ports | Engine RPC + JWT + REST + WS | REST + Prometheus only |
43+
| EL pairing | 1 EL + 1 CL (+ optional VC) | Client-only (no EL yet) |
44+
| Engine API + JWT | Required | Not implemented yet |
45+
| RPC ports | Engine RPC + JWT + REST + WS | REST + Prometheus |
4146
| P2P transport | TCP + UDP discovery + libp2p | QUIC-only (libp2p) |
4247
| Block production | EL builds payload, CL attests | Single-stack: 4 s slots |
4348

@@ -48,6 +53,12 @@ the snooper, etc. A parallel pipeline keeps those code paths untouched and
4853
isolates Lean-specific concerns under `src/lean/` and
4954
`src/prelaunch_data_generator/lean_genesis/`.
5055

56+
Once Lean clients ship Engine API support, the design intent is for the
57+
two pipelines to compose: a Lean participant declares its EL counterpart
58+
the same way today's CL clients do, JWT is shared, and the existing
59+
EL-side plumbing (image discovery, MEV-boost, snooper, dora) keeps
60+
working. Until then, the realistic devnet shape is Lean-only.
61+
5162
The package still composes the two: Prometheus/Grafana discover Lean nodes
5263
through their service labels and metrics ports, and additional services that
5364
don't depend on EL state (e.g. dora's beacon explorer) can be pointed at Lean
@@ -57,9 +68,9 @@ nodes by URL.
5768

5869
## Quick start
5970

60-
Lean consensus is fully standalone — no Engine API, no EL counterpart.
61-
A Lean network configuration therefore contains ONLY `lean_participants:`
62-
(set `participants: []` to skip the Eth1 EL/CL flow entirely):
71+
Today's Lean clients run client-only (no Engine API yet), so the realistic
72+
devnet shape is Lean-only — the args file contains `lean_participants:` and
73+
`participants: []` to skip the Eth1 EL/CL flow:
6374

6475
```yaml
6576
participants: []

main.star

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,15 @@ def run(plan, args={}):
9090
network_params = args_with_right_defaults.network_params
9191

9292
# Lean-only mode: when the operator configured `lean_participants:` but
93-
# no Eth1 `participants:` entries, run ONLY the Lean pipeline. Lean
94-
# consensus is fully standalone (no Engine API, no EL counterpart), so
95-
# spinning up an EL+CL pair as a "placeholder" would just waste resources
96-
# and confuse downstream services that try to call the Engine API.
97-
# The lean_launcher returns the per-node contexts; downstream consumers
98-
# (prometheus, grafana, dora) can be wired through in a follow-up.
93+
# no Eth1 `participants:` entries, run ONLY the Lean pipeline. Today's
94+
# Lean clients don't implement Engine API yet, so spinning up an EL+CL
95+
# pair alongside would just waste resources and confuse downstream
96+
# services that try to call into a non-existent Engine API. Once Lean
97+
# clients ship Engine API support, the same `lean_participants:` entries
98+
# will be able to pair with EL `participants:` and reuse the existing
99+
# JWT + payload-attestation plumbing. The lean_launcher returns the
100+
# per-node contexts; downstream consumers (prometheus, grafana, dora)
101+
# can be wired through in a follow-up.
99102
if num_participants == 0 and args_with_right_defaults.lean_participants:
100103
plan.print(
101104
"Lean-only mode: {0} lean participant entries, 0 EL/CL participants".format(
@@ -361,9 +364,11 @@ def run(plan, args={}):
361364
all_xatu_sentry_contexts.append(participant.xatu_sentry_context)
362365

363366
# Launch Lean Ethereum consensus participants alongside the EL/CL network.
364-
# Lean is a standalone consensus stack (no EL pairing, no Engine API, no
365-
# JWT, post-quantum signatures); it runs through its own pipeline and
366-
# produces independent file artifacts + services. The list is empty
367+
# Today's Lean clients run client-only (no Engine API yet) and use
368+
# post-quantum signatures; the pipeline brings them up against their
369+
# own genesis + libp2p QUIC mesh. Once Engine API lands on the Lean
370+
# side, these participants will be able to pair with `participants:`
371+
# EL clients and reuse the existing JWT plumbing. The list is empty
367372
# unless the user populated `lean_participants:` in their args.
368373
# See docs/lean-consensus.md for the architecture.
369374
all_lean_contexts = lean_launcher.launch(

src/lean/lean_launcher.star

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ Orchestrates the entire Lean pipeline:
1111
binary via `plan.exec`.
1212
1313
This is intentionally independent of the EL/CL `participant_network` pipeline:
14-
Lean consensus has no Engine API, no JWT, no EL pairing. Operators opt in by
15-
populating `lean_participants:` in their args; the existing EL/CL flow runs
14+
Today's Lean devnets run client-only (no EL pairing yet), so this pipeline
15+
brings up a Lean-only mesh. Engine API support is on the roadmap for the
16+
Lean clients, after which the same `lean_participants:` entries will be
17+
able to pair with EL clients from `participants:` and share the existing
18+
package's Engine API / JWT plumbing. Operators opt in to Lean by populating
19+
`lean_participants:` in their args; the existing EL/CL flow runs
1620
unchanged either way.
1721
"""
1822

0 commit comments

Comments
 (0)