Skip to main content
Version: next 🚧

Charon Feature Flags

Charon ships in-development functionality behind feature flags before it becomes the default behavior. This lets the Obol team roll out new consensus timers, client integrations, and other changes gradually, and lets operators opt in to (or out of) specific behavior on their own nodes.

Maturity Statuses​

Every feature flag has a maturity status:

  • Alpha - for internal devnet testing. Behavior may change or be removed without notice.
  • Beta - for internal and external testnet testing. More stable than alpha, but not yet proven in production.
  • Stable - ready for production. Stable features are enabled by default.

Charon only enables features at or above a configured minimum status. By default, that minimum is stable, so only stable features run unless an operator explicitly changes the configuration.

warning

Enabling alpha or beta features on a mainnet cluster is done at the operator's own risk — these features are still being validated and may change or be withdrawn in a future release. Because Charon nodes reach agreement through consensus, features that affect consensus-relevant behavior (for example, round timers or attestation data fetching) generally need to be enabled consistently across all nodes in a cluster; mismatched feature sets between operators can cause the affected nodes to diverge from the rest of the cluster.

Enabling and Disabling Feature Flags​

Feature flags are controlled with three charon run flags (each with a matching CHARON_ environment variable, following Charon's standard flag-to-env-var convention):

FlagEnvironment VariableDescription
--feature-setCHARON_FEATURE_SETMinimum feature set to enable by default: alpha, beta, or stable. Defaults to stable.
--feature-set-enableCHARON_FEATURE_SET_ENABLEComma-separated list of individual features to enable, overriding the default minimum feature set.
--feature-set-disableCHARON_FEATURE_SET_DISABLEComma-separated list of individual features to disable, overriding the default minimum feature set.

--feature-set-enable and --feature-set-disable take precedence over --feature-set on a per-feature basis, so an operator can, for example, run with the default stable minimum while explicitly enabling a single alpha feature for testing.

Example docker-compose.yml snippet enabling one alpha feature while leaving everything else at the stable default:

services:
charon:
environment:
- CHARON_FEATURE_SET=stable
- CHARON_FEATURE_SET_ENABLE=json_requests

Current Feature Flags​

This table reflects Charon v1.10.0-dev (commit 094953a). Feature flags are added and removed between releases as functionality graduates to stable and is eventually always-on, so check the CLI reference or run charon run --help for the current, authoritative list.

Flag NameStatusDefaultDescription
eager_double_linearStableEnabledUses an eager double-linear round timer for consensus rounds.
consensus_participateStableEnabledLets a node participate in an ongoing consensus round while it is still waiting for unsigned duty data from its beacon node.
proposal_timeoutStableEnabledUses a longer, 1.5-second first consensus round timeout for proposal duties.
fetch_only_commidx_0StableEnabledQueries the beacon node for attestation data only for committee index 0.
linearAlphaDisabledUses a linear round timer for consensus rounds; takes precedence over eager_double_linear when both are active.
aggsigdb_v2AlphaDisabledUses a newer, simpler implementation of the aggsigdb component.
json_requestsAlphaDisabledUses JSON (instead of SSZ) requests when talking to the eth2 beacon node client.
gnosis_block_hotfixAlphaDisabled (auto-enabled on Gnosis/Chiado)Applies an SSZ fix required by the Gnosis and Chiado networks. Charon automatically enables this feature when the configured network is Gnosis or Chiado, unless an operator explicitly disables it.
sse_reorg_dutiesAlphaDisabledLets the scheduler refresh duties when a chain reorg occurs.
attestation_inclusionAlphaDisabledTracks on-chain inclusion of attestations. This was previously always-on behavior, but tracking inclusion after the Electra upgrade adds enough load on the beacon node that it can throttle other duties, so it is now opt-in.
quicAlphaDisabledEnables the QUIC transport protocol in libp2p networking.
chain_split_haltAlphaDisabledCompares the locally fetched attestation's target and source against the leader's proposed attestation; if they differ, Charon does not sign the attestation.
fetch_att_on_blockAlphaDisabledFetches attestation data as soon as a block-processing event is received from the beacon node over SSE, falling back to the standard one-third-of-slot timing if no block event arrives in time.
fetch_att_on_block_with_delayAlphaDisabledFetches attestation data with an added 300ms delay. Combined with fetch_att_on_block, uses one-third-of-slot-plus-300ms as the fallback timeout; used alone, it uses that same timeout directly.
disable_duties_cacheAlphaDisabledSafety switch to disable the internal duties cache.
mock_alphaAlphaDisabledInternal/experimental placeholder feature used only for testing the feature flag system itself; it has no functional effect.

Observing Enabled Feature Flags​

Charon exposes the app_feature_flags Prometheus metric, a constant gauge labeled with any non-default (custom-enabled) feature flags currently active on a node. See the Charon Metrics Reference for the full metrics list and label details. Comparing this metric across nodes in a cluster is a quick way to confirm that operators have matching feature sets for consensus-relevant flags.

  • CLI Reference - full list of charon run flags, including --feature-set, --feature-set-enable, and --feature-set-disable.
  • Consensus Protocols - background on Charon's consensus layer, relevant to feature flags like eager_double_linear, linear, and consensus_participate.