Skip to content

Gloas support with charon v2.0.0-rc2 - #501

Merged
OisinKyne merged 15 commits into
mainfrom
gloas
Oct 21, 2026
Merged

OisinKyne merged 15 commits into
mainfrom
gloas

Conversation

@KaloyanTanev

@KaloyanTanev KaloyanTanev commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Merge the gloas branch into main for the Hoodi Gloas fork: charon v2.0.0-rc2 and Hoodi-ready clients (Lighthouse v8.3.0, Teku 26.10.1, Lodestar v1.50.0, Nimbus v26.10.1, Prysm v7.3.0, Grandine 3.0.0-rc.1), VCs rendering their proposer settings and builders from charon's proposer-config.json, stateful gloas block production, builder URLs and a Sepolia env sample.

main's uid 1000 data dir handover (#490, #491) is merged in: Teku and Nimbus keep starting as root and drop to uid 1000 in their gloas run.sh.

From the gloas fork, block production moves to `produceBlockV4`, whose
`include_payload` parameter selects the stateless (payload-included) or
stateful (payload-excluded) response form for self-built blocks. A
distributed validator needs the **stateless** form: charon fans block
production across nodes, so no single beacon node can be relied on to
hold the cached envelope for the stateful flow.

This sets each VC to request the stateless form where a lever exists:

- **Lodestar**: `--payloadLocal=false`. Lodestar auto-selects stateless
only when configured with >1 beacon node; behind charon (a single
endpoint) it would default to stateful, so this sets it explicitly.
- **Prysm**: `--stateless`. Off by default and only auto-forced on with
multiple beacon nodes, so it is set explicitly here.
- **Nimbus**: no flag exists — it requests stateless only with >1 beacon
node and cannot be overridden. Documented in `nimbus/run.sh` as a known
gap (status-im/nimbus-eth2#9084).
- **Teku**: does not yet implement `produceBlockV4` on the validator
client, so it cannot propose gloas blocks behind charon today.
Documented in `compose-vc.yml` (Consensys-Incorporated/teku#11172).

Note the VC image versions must be gloas-capable for these flags to be
recognised; the flags are still pre-release and their names/defaults may
change before the fork.

category: feature
ticket: none
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.
Bumps charon to `6e59dc0`, the latest `gloas` branch commit, which
includes serving execution payload envelopes (ObolNetwork/charon#4765),
agreeing on self-built blocks without payload (ObolNetwork/charon#4771)
and aggregated builder request auths (ObolNetwork/charon#4783).

Also bumps the clients to their Hoodi Glamsterdam ready releases:
Lighthouse `v8.3.0`, Teku `26.10.1`, Lodestar `v1.50.0`, Prysm `v7.3.0`,
Nimbus `v26.10.1`, Grandine `3.0.0-rc.1`, Nethermind `2.2.0` and
Commit-Boost `v0.12.0-rc1`. Grandine and Commit-Boost are release
candidates, but they are the versions listed for the Hoodi fork.
Supersedes #492 and #493.

The `obolnetwork/charon:6e59dc0` image is still building, so this should
merge once it is published.
Passes `CHARON_BUILDER_URLS` to charon so it requests gloas execution
payload bids from builders directly. The Hoodi and new Sepolia env
samples set it to the nflaig and Titan builders of that network; mainnet
stays empty as gloas is not scheduled there yet.

Adds a `.env.sample.sepolia`, the Hoodi sample with Sepolia checkpoint
sync, MEV relays and builders.
Bumps charon to `e428ac3`, the latest `gloas` branch commit, which
agrees the beacon node's `Eth-Builder-Url` with gloas proposals and
forwards it on publish, and adds builder source logs and metrics
(ObolNetwork/charon#4786).

This changes charon's agreed gloas proposal encoding, so all nodes of a
cluster must be rolled to it before gloas proposals agree again. The
`obolnetwork/charon:e428ac3` image is still building, so this should
merge once it is published.
Bumps charon to `a58fc63`, the latest `gloas` branch commit, which
forwards the agreed `Eth-Builder-Url` on publish as decided and matches
it to the configured builders under RFC 3986 normalisation, so direct
builder bids get their signed block forwarded and keep their execution
value (ObolNetwork/charon#4787).

The `obolnetwork/charon:a58fc63` image is still building, so this should
merge once it is published.
# Conflicts:
#	compose-vc.yml
#	teku/run.sh
@KaloyanTanev KaloyanTanev changed the title Gloas support with charon v2.0.0-rc1 Gloas support with charon v2.0.0-rc2 Oct 21, 2026
@KaloyanTanev
KaloyanTanev marked this pull request as ready for review October 21, 2026 15:52
OisinKyne and others added 3 commits October 21, 2026 19:06
charon edit (promoted out of alpha in ObolNetwork/charon#4788) ships in
v2.0; there is no v1.12.0 image, so the scripts' default failed to pull.
charon v2.0.0-rc2 ships edit under alpha (ObolNetwork/charon#4791
reverted the promotion), so the edit scripts, their READMEs and skills
go back to charon alpha edit as on main, defaulting to the v2.0.0-rc2
image.
@sonarqubecloud

Copy link
Copy Markdown

@OisinKyne
OisinKyne merged commit f87a7c3 into main Oct 21, 2026
4 checks passed
@OisinKyne
OisinKyne deleted the gloas branch October 21, 2026 18:07
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