Skip to content

Add lighthouse validator client with proposer config - #487

Merged
KaloyanTanev merged 3 commits into
kalo/proposer-configfrom
kalo/lighthouse-vc
Oct 5, 2026
Merged

KaloyanTanev merged 3 commits into
kalo/proposer-configfrom
kalo/lighthouse-vc

Conversation

@KaloyanTanev

@KaloyanTanev KaloyanTanev commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

Adds a vc-lighthouse validator client profile (Lighthouse v8.2.3), the fifth VC for the proposer config rollout (ObolNetwork/charon#4692).

Custom image (lighthouse/Dockerfile, jq baked in) with a run.sh that waits for charon's proposer-config.json like the other VCs, then authors the complete validator_definitions.yml from the mounted charon keystores, replacing lighthouse account validator import, and starts the VC with --distributed --disable-auto-discover. The definitions are regenerated on every start, so proposer-config.json updates apply on restart. Without a proposer config it writes plain definitions and falls back to the zero default fee recipient, which charon overrides pre-gloas.

Verified with a real charon-generated proposer config: Lighthouse parses the authored definitions with per-validator suggested_fee_recipient and gas_limit, picks up a config update on restart, and the fallback generates plain definitions. Stacked on #486.

@KaloyanTanev KaloyanTanev self-assigned this Sep 16, 2026
@KaloyanTanev
KaloyanTanev force-pushed the kalo/lighthouse-vc branch 3 times, most recently from f6b8bc9 to e77c213 Compare September 16, 2026 20:45
@KaloyanTanev KaloyanTanev changed the title Add lighthouse validator client with proposer and builder config Add lighthouse validator client with proposer config Sep 16, 2026
@KaloyanTanev
KaloyanTanev force-pushed the kalo/lighthouse-vc branch 3 times, most recently from da1b2a2 to f48676d Compare September 18, 2026 16:14
Comment thread lighthouse/run.sh
# Global fallbacks when validator definitions carry no proposer settings: the zero
# default fee recipient, which charon overrides pre-gloas, and process-wide builder
# participation. With a proposer config both are set per validator instead.
EXTRA_FLAGS+=(--suggested-fee-recipient "0x0000000000000000000000000000000000000000")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where do we think we land with not burning mistake path eth? i.e. pointing it at 0xDe5aE4De36c966747Ea7DF13BD9589642e2B1D0d. That may open up problems but probably better than just bricking the eth?

Comment thread compose-vc.yml Outdated

vc-lighthouse:
profiles: [vc-lighthouse]
image: "lighthouse-vc:${VC_LIGHTHOUSE_VERSION:-v8.2.0}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

8.2.3 is latest stable

Same as the other VCs: wait for proposer-config.json instead of charon's health, and mount .charon read-only.
@sonarqubecloud

sonarqubecloud Bot commented Oct 5, 2026

Copy link
Copy Markdown

@KaloyanTanev
KaloyanTanev merged commit 0342df4 into kalo/proposer-config Oct 5, 2026
2 checks passed
@KaloyanTanev
KaloyanTanev deleted the kalo/lighthouse-vc branch October 5, 2026 16:30
KaloyanTanev added a commit that referenced this pull request Oct 5, 2026
Wires the charon-generated proposer config (ObolNetwork/charon#4700,
`vc-config/proposer-config.json` next to the cluster lock) into the four
validator clients, so every VC holds the cluster fee recipient and gas
limit. From the gloas fork VCs sign these values into proposer
preferences, so they must match across the cluster
(ObolNetwork/charon#4692).

Each VC mounts `.charon` read-only and its `run.sh` waits up to 120s for
`proposer-config.json` before rendering the client's native format from
charon's sparse schema:
- Teku and Prysm get thin custom images adding `jq`. Teku renders
`--validators-proposer-config`, falling back to the zero-address default
fee recipient without the file.
- Prysm renders v2 settings (`version: 2`, top-level `gas_limit`). At
the gloas fork Prysm drops the legacy `builder.gas_limit`, so a v1 file
would sign a different gas limit than the other VCs.
- Lodestar renders its settings `.yml` via `node`. Nimbus writes
per-validator `suggested_fee_recipient.hex` and
`suggested_gas_limit.json` after key import.

VCs don't wait for charon's healthcheck: `/readyz` stays unready until a
VC connects, so a `service_healthy` dependency never starts them.
`.charon` is mounted rather than `vc-config`, since Docker would
otherwise create a root-owned `vc-config` before charon writes it. The
Nimbus image tag gets a `-jq` suffix so a plain `docker compose up -d`
rebuilds it instead of reusing the old image without `jq`.

Also bumps the stack to the latest releases and pins charon to the
latest gloas commit `9affa0d`, since only the gloas build writes the
proposer config: Nethermind 2.1.0, Reth v2.7.0, Lighthouse v8.2.3, Teku
26.9.1, Lodestar v1.49.0, Prysm v7.2.0, Nimbus v26.10.0, Commit-Boost
v0.10.1, Prometheus v3.15.0, Grafana 13.2.3, Alloy v1.20.1, cAdvisor
v0.60.6, Loki 3.7.8, Tempo 3.1.0. Tempo 3 drops the
`ingester`/`compactor` config, so `tempo.yaml` moves retention to the
backend scheduler and worker. node-exporter moves to
`prom/node-exporter`, since `bitnamilegacy` is frozen at 1.9.1.
Nethermind 2.x upgrades existing databases in place but needs AVX2: it
dies with SIGILL on CPUs or VMs without it.

Also aligns the VC services: all scripts take the beacon endpoint from
`BEACON_NODE_ADDRESS`, Prysm `exec`s the validator and binds metrics on
`0.0.0.0`, Teku enables metrics on `8008`, the Prometheus example
scrapes all VCs, and service definitions follow one key order.

Tested by starting every service at its new version with its compose
flags (no flag or config errors), and running Teku, Nimbus, Lodestar and
Prysm against a stub beacon node with a proposer config holding a
diverging validator: each applied the per-validator values. Lighthouse
follows in #487, builder config in #488.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants