Skip to content

fix: consolidate blob source test into single summary log with supernode detection#21719

Draft
AztecBot wants to merge 8 commits intomerge-train/spartanfrom
claudebox/fix-blob-sink-warns
Draft

fix: consolidate blob source test into single summary log with supernode detection#21719
AztecBot wants to merge 8 commits intomerge-train/spartanfrom
claudebox/fix-blob-sink-warns

Conversation

@AztecBot
Copy link
Collaborator

@AztecBot AztecBot commented Mar 18, 2026

Fix A-700

Summary

  • Reworks testSources() to detect supernodes by probing the blob sidecar endpoint
  • Keeps individual per-source validation logs (info for reachable, error for failures)
  • Emits a consolidated summary after all sources are validated:
    Blob client running with consensusSuperNodes=N archiveSources=N blobSinks=N. M consensus client(s) ignored because they are not running in supernode or semi-supernode mode
  • Warns if no consensus supernodes are reachable; throws if no sources at all (unless blobAllowEmptySources)

How supernode detection works

Post-Fusaka (PeerDAS), non-supernode beacon nodes no longer serve the blob sidecar endpoint. Each consensus host is tested by:

  1. Fetching /eth/v1/beacon/headers/head to verify reachability and get the head slot
  2. Fetching /eth/v1/beacon/blobs/{headSlot} to check blob sidecar support
  3. A 200 response (even with an empty data array for a slot with no blobs) means the node serves blob sidecars (supernode/semi-supernode)
  4. A non-200 response means the node does not serve blob sidecars

Log level logic

  • info — at least one consensus supernode available
  • warn — no consensus supernodes (but other sources like archive/filestore may exist)
  • throw — no sources at all (unless blobAllowEmptySources)

…igured

The testSources() method was logging WARN for unconfigured archive client
and consensus host URLs, even when an operator has other valid sources
(e.g. a supernode beacon client). Demote to info since these are optional
sources. The warn for no reachable sources at all is preserved.
@AztecBot AztecBot added ci-draft Run CI on draft PRs. claudebox Owned by claudebox. it can push to this PR. labels Mar 18, 2026
Reworks testSources() to probe each consensus client for blob sidecar
support (supernode/semi-supernode detection) and emit a single summary:
  "Blob client running with consensusSuperNodes=N archiveSources=N blobSinks=N"
with optional suffix for ignored non-supernode clients.

Only warns if there are no available consensus supernodes. Errors if
no sources are reachable at all (unless blobAllowEmptySources is set).
@AztecBot AztecBot changed the title fix: demote blob source warnings to info when source is simply unconfigured fix: consolidate blob source test into single summary log with supernode detection Mar 18, 2026
Keep individual info/error logs for each source during validation,
then emit the consolidated summary line at the end.
Reverts unnecessary renames (headersUrl→url, headersOpts→options,
headersRes→res). Fixes supernode detection to query a slot beyond the
standard 4096-epoch pruning window instead of head slot, which any
post-Deneb beacon node would serve.
Querying a slot beyond the pruning window tests for a full archive
node, which is more than what's needed. A supernode/semi-supernode
just needs to serve blob sidecars for recent blocks. Checking the
head slot correctly identifies whether the node supports the blob
sidecar API — a 200 response (even with empty data) means it does.
@aminsammara
Copy link
Contributor

Functionally looks good! Added backport to v4-next label

There's no reliable way to distinguish supernodes from regular beacon
nodes via API probing. Post-Deneb, all nodes serve blob sidecars for
recent slots within the DA window. Simplified to just count reachable
consensus hosts and report the summary.
Post-Fusaka (PeerDAS), non-supernode beacon nodes no longer serve the
blob sidecar endpoint. A 200 response from /eth/v1/beacon/blobs/{slot}
(even with empty data for a slot with no blobs) means the node supports
blob sidecars. Reachability is checked first via headers, then blob
sidecar support is tested separately.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-to-v4-next ci-draft Run CI on draft PRs. claudebox Owned by claudebox. it can push to this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants