Repository navigation
v2.0.0-rc1
Pre-releasev2.0.0-rc1 - 2026-10-20
Warning
A new rc2 release has been published, which hardens Charon during the gloas transitions.
Warning
This is a release candidate and a required upgrade for hoodi operators only. Mainnet operators should wait for a full v2.0.0 release or newer.
This is Charon's v2.0.0-rc1 release, our first pre-release with Gloas support, ready for the upcoming Hoodi testnet hard fork. Feedback is welcome and appreciated, please use github issues or discord if you have trouble with this release.
All nodes in a cluster must run Charon v2.0.0-rc1 or newer before the Gloas fork activates on Hoodi on October 26, 2026, at 17:42:48 UTC.
Important
Please remember to update all client versions as per the minimum versions outlined in the EF's Gloas Hoodi Announcement blog.
Read the rest of the release notes for more:
Full Changelog: v1.11.1..v2.0.0-rc1
Gloas ePBS changes
Local blocks
With ePBS, a block's execution payload (the transactions and blobs) is published separately from the consensus layer block. Charon now uses this split inside the cluster: nodes run consensus on the consensus layer block and a hash of its payload only, instead of the full block with all transactions and blobs. Consensus messages stay small, so the cluster agrees on the block faster and submits it to the beacon node sooner.
The node whose beacon node built the block sends the payload to its peers after consensus, and every peer checks it against the agreed hash. The payload is then signed and published as the execution payload envelope. No configuration is needed.
P2P and direct builder blocks
Gloas has two ways to get a block from an external builder:
- P2P builders bid over the Ethereum p2p network. Your validators advertise their fee recipient and gas limit to them by signing proposer preferences ahead of each proposal.
- Direct builders are builder APIs that Charon requests bids from, configured with
--builder-urls. Your validators authorise each of them by signing builder preferences.
Charon aggregates these signatures like any other duty, so every validator client in the cluster must sign identical data. On first start, Charon writes .charon/vc-config/proposer-config.json with your fee recipients, gas limits and builder settings. Validator clients are expected to read their proposer settings from this file. The CDVN gloas branch does this for every supported validator client: each client's run.sh converts the file into that client's own proposer config format on start.
All operators in a cluster must configure the same builders. --builder-urls, --builder-min-bid, --builder-boost-factor and --builder-max-execution-payment must be identical on every node. Charon warns and sets app_peerinfo_builder_config_mismatch if a peer's builder settings differ.
Charon only writes the file if it doesn't exist and never changes it afterwards. To change builders, edit the file and restart the validator client. An upcoming release will add a command to edit the builders in this file.
New attestation round timer
Gloas moves the attestation deadline from 4s to 3s into the slot. To make the most of the shorter window, attestations use a new round timer from the Gloas fork onwards:
| Before Gloas | From Gloas | |
|---|---|---|
| Consensus starts | 4s into the slot | At slot start, the leader proposes as soon as its beacon node has the block |
| First round | 1s (4s–5s) | 4s (0s–4s), covering the whole block proposal interval |
| Following rounds | 1s each | 1s each (4s–5s, 5s–6s), then growing by 1s |
Attestation consensus now completes as soon as the block arrives, instead of waiting for a fixed offset. If the leader is offline, there are still two more rounds before aggregation starts at 6s.
Feature
- Add Gloas (ePBS) fork support #4324 (#4789)
- Add payload attestation (PTC) duty (#4618,#4653,#4656,#4657,#4659,#4667,#4668,#4669)
- Add proposer preferences duty (#4693,#4709)
- Add self-built block proposals, agreed in consensus without the execution payload (#4717,#4718,#4719,#4725,#4771)
- Add direct builder support with builder request auth aggregation and agreed builder URL (#4783,#4786)
- Generate
proposer-config.jsonfor validator clients and warn on builder mismatch (#4700,#4704,#4784) - Start attestation consensus at slot start with a new round timer (#4769)
- Apply the fork schedule at runtime with fork-aware duty timings (#4617,#4676,#4736)
- Add fork readiness metrics, including Gloas-ready client versions (#4660,#4740)
- Accept Gloas versioned attestations and optional committee index (#4671,#4672)
- Stop validator registrations and fee recipient fetching from the Gloas fork (#4707,#4727)
- Adopt the Gloas
go-eth2-clientfork (#4715)
- Promote
sse_reorg_dutiesto stable, re-resolving duties on chain reorgs by default (#4776) - Add p2p message size, read error and concurrency metrics #4679 (#4680)
Bug
- Fix payload attestation data handling for missing blocks and payloads (#4732,#4735,#4739)
- Fix Gloas validator API responses: SSZ, value headers and execution payload envelopes (#4731,#4733,#4765)
- Serve the dependent root in
v2proposer duties (#4708) - Fix runtime fork schedule follow-ups (#4738)
- Forward the agreed builder URL as decided (#4787)
- Fix inclusion checker trim underflow at chain start (#4662)
- Harden DKG ceremonies against dropped early bundles and transient p2p send failures (#4683,#4684)
- Redact secrets in exported command lines (#4688)
- Warn on validators with pending deposits in
exit sign(#4702) - Label p2p handler metrics from the validated stream protocol (#4722)
- Bind
eth2httpservice lifetime to the caller context (#4772)
Refactor
- Migrate SSZ encoding from
fastssztodynssz(#4652) - Model consensus round timers and their extensions (#4767)
- Version payload attestation data and adopt its interfaces (#4658,#4663)
- Remove unused
MemDBV2fromcore/aggsigdb(#4695) - Remove dead proposal topic from
core/infosync(#4729)
Docs
- Fix comment typos and grammar (#4768)
Test
- Add validator mock and simnet e2e coverage for Gloas duties (#4670,#4716,#4720)
- Fix multiple flaky tests across packages (#4654,#4721,#4726)
Misc
- Bump Go to 1.27 and
go-libp2pto v0.50.0 (#4661,#4678,#4782,#4790) - Bump
golangci-lintand fixnolintlintfalse autofix (#4703,#4741) - Credit PR authors in release notes (#4781)
Compatibility Matrix
This release of Charon is backwards compatible with Charon >= v1.0, though only v1.7 and newer are Fulu-ready.
The below matrix details a combination of beacon node (consensus layer) + validator clients and their corresponding versions the DV Labs team have tested with this Charon release. More validator and consensus clients will be added to this list as they are supported in our automated testing framework.
Legend
- ✅: All duties succeed in testing
- 🟡: All duties succeed in testing, except non-penalised aggregation duties
- 🟠: Duties may fail for this combination
- 🔴: One or more duties fail consistently
- ⏳: Testing in progress
| Validator 👉 Consensus 👇 | Teku v26.10.1 | Lighthouse v8.3.0 | Lodestar v1.50.0 | Nimbus v26.10.1 | Prysm v7.3.0 | Vouch v1.14.0-alpha.2 ❗ |
|---|---|---|---|---|---|---|
| Teku v26.10.1 ❗ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ |
| Lighthouse v8.3.0 | ✅ | ✅ | ⏳ | ⏳ | ✅ ❗ | ⏳ |
| Lodestar v1.50.0 | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ |
| Nimbus v26.10.1 | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ |
| Prysm v7.3.0 | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ |
| Grandine v3.0.0-rc.1 ❗ | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 | 🔴 |
What's Changed
-
docs: refresh stale architecture and structure docs (#4580) by @pinebit
-
Fix exchanger deadlock during partial signature exchange (#4590) by @KaloyanTanev
-
*: opt in for incomplete validator_keys (#4591) by @KaloyanTanev
-
*: fetch latest versions release notes (#4597) by @KaloyanTanev
-
*: sync contributions per subcommittee (#4602) by @KaloyanTanev
-
core/priority: add leading slash to protocol ID (#4605) by @pinebit
-
p2p: fix flaky TestWithReceiveTimeout on QUIC (#4606) by @pinebit
-
Increase sync message deadline to a slot duration (#4610) by @KaloyanTanev
-
core/priority: use stable sort for scored priorities (#4611) by @pinebit
-
Optimise sync contribution fetching (#4615) by @KaloyanTanev
-
dkg: fail fast on peer restart or death during ceremonies (#4616) by @pinebit
-
core/qbft: reject zero-value PRE-PREPARE from leader (#4619) by @KaloyanTanev
-
Reject lock with validator count mismatch with definition (#4620) by @KaloyanTanev
-
Remove legacy unversioned attestations (#4621) by @KaloyanTanev
-
core/consensus: fix qbft optimistic first qcommit (#4622) by @KaloyanTanev
-
core/qbft: prevent double PREPARE on equivocating leader (#4624) by @KaloyanTanev
-
Add 1MB limit to the peer info messages (#4625) by @KaloyanTanev
-
Close streams on all SendReceive and Send paths (#4626) by @KaloyanTanev
-
core/qbft: preserve local value on comparison failure (#4628) by @KaloyanTanev
-
ci: fix sonarcloud supply-chain vulnerabilities (#4631) by @KaloyanTanev
-
app/peerinfo: add dv_type field to peerinfo protocol (#4632) by @KaloyanTanev
-
dkg: validate cluster definition threshold (#4634) by @pinebit
-
cluster: dedup definition peers by peer ID (#4635) by @pinebit
-
cluster: fix dead deposit amounts validation in unmarshalers (#4636) by @pinebit
-
dkg/bcast: bind broadcast signatures to cluster session (#4638) by @pinebit
-
app/log: fix slog handler panic on named types (#4640) by @KaloyanTanev
-
core/validatorapi: preserve sync selections response order (#4641) by @KaloyanTanev
-
p2p: bound relay address query responses (#4642) by @pinebit
-
core/priority: gate duties received from peers (#4643) by @pinebit
-
p2p: remove noisy QUIC happy-path debug logs (#4645) by @KaloyanTanev
-
core/tracker: fix inclusion trim underflow at chain start (#4662) by @KaloyanTanev
-
p2p: add message size, read error and concurrency metrics (#4680) by @KaloyanTanev
-
dkg/pedersen: buffer channels to not drop early bundles (#4683) by @KaloyanTanev
-
dkg: retry transient p2p send failures during ceremonies (#4684) by @KaloyanTanev
-
app/stacksnipe: redact secret flag values from exported command lines (#4688) by @aly-obol
-
core/aggsigdb: remove unused MemDBV2 (#4695) by @KaloyanTanev
-
app/eth1wrap: don't close reconnectCh on shutdown (#4699) by @KaloyanTanev
-
cmd/exit_sign: warn on validators with pending deposits and no index (#4702) by @KaloyanTanev
-
*: keep //nolint:revive from nolintlint false autofix (#4703) by @KaloyanTanev
-
core/parsigex: bind partial signature sender to share index (#4705) by @KaloyanTanev
-
p2p: recover stream handler panics to avoid node crash (#4706) by @KaloyanTanev
-
core: perform sync committee duties for exited validators (#4712) by @KaloyanTanev
-
p2p: label handler metrics from validated stream protocol (#4722) by @KaloyanTanev
-
core/scheduler: fix flaky TestSchedulerWait clock rewind (#4726) by @KaloyanTanev
-
core/infosync: remove dead proposal topic (#4729) by @KaloyanTanev
-
app/eth2wrap: bind eth2http service lifetime to caller ctx (#4772) by @KaloyanTanev
-
core/consensus: reject leader duties unknown locally (#4773) by @KaloyanTanev
-
app/sse: invalidate duties on dependent root mismatch (#4774) by @KaloyanTanev
-
*: bump golang.org/x/net to v0.60.0 (#4775) by @KaloyanTanev
-
app/featureset: promote sse_reorg_duties to stable (#4776) by @KaloyanTanev
-
testutil/genchangelog: credit PR authors in release notes (#4781) by @KaloyanTanev
-
cmd: promote edit commands out of alpha (#4788) by @KaloyanTanev
-
Revert "cmd: promote edit commands out of alpha (#4788)" (#4791) by @KaloyanTanev
-
app/version: bump version to v2.0-rc (#4792) by @KaloyanTanev
Contributors
@KaloyanTanev, @aly-obol, @b0a7, @obol-platform, @pinebit, @somasoil
