Skip to content

Validate the slot of Gloas RPC data columns against the bid - #10327

Merged
mergify[bot] merged 1 commit into
sigp:unstablefrom
dknopik:check-gloas-column-slot
Oct 13, 2026
Merged

mergify[bot] merged 1 commit into
sigp:unstablefrom
dknopik:check-gloas-column-slot

Conversation

@dknopik

@dknopik dknopik commented Oct 12, 2026

Copy link
Copy Markdown
Member

Issue Addressed

Gloas data column sidecars carry no signed block header, so their slot is not authenticated. Two places relied on it anyway:

  • is_block_data_imported chose between the pre-Gloas and Gloas import conditions using a slot supplied by the caller, usually taken from a sidecar. A column claiming a pre-Gloas slot made a Gloas block whose payload had not been received look fully imported, so the column was dropped as a duplicate.
  • process_rpc_custody_columns used the column slot to choose between the Fulu and Gloas import paths. Nothing on the Gloas path checks it, so a column with a wrong slot could be cached and stored as is.

Proposed Changes

is_block_data_imported now looks the block up in fork choice and uses the block's own slot, and the slot parameter is gone. It also reads payload_received from that lookup instead of querying fork choice twice.

process_rpc_custody_columns groups the batch by block root only and, after duplicate detection, checks each Gloas column's slot against the bid. A mismatch returns the new BlockError::DataColumnSlotMismatch carrying the column index, so sync penalizes only the custody peer that served it. Previously, grouping by (slot, block root) made a batch with one wrong-slot column fail with an unpenalized InternalError. The bid loaded for the check is passed on to the import instead of being loaded again.

Additional Info

Claude

Gloas data column sidecars carry no signed block header, so their slot is
not authenticated. Two places relied on it anyway:

- is_block_data_imported chose between the pre-Gloas and Gloas import
  conditions using a slot supplied by the caller, usually taken from a
  sidecar. A column claiming a pre-Gloas slot made a Gloas block whose
  payload had not been received look fully imported, so the column was
  dropped as a duplicate. A Gloas slot on an imported pre-Gloas block had
  the opposite effect.
- process_rpc_custody_columns used the column slot to choose between the
  Fulu and Gloas import paths. Nothing on the Gloas path checks it (KZG
  verification does not cover the slot), so a column with a wrong slot could
  be cached and stored as is.

is_block_data_imported now looks the block up in fork choice and uses the
block's own slot, and the slot parameter is gone. It also reads
payload_received from that lookup instead of querying fork choice twice.

process_rpc_custody_columns groups the batch by block root only and, after
duplicate detection, checks each Gloas column's slot against the bid. A
mismatch returns the new BlockError::DataColumnSlotMismatch carrying the
column index, so sync penalizes only the custody peer that served it.
Previously, grouping by (slot, block root) made a batch with one wrong-slot
column fail with an unpenalized InternalError. The bid loaded for the check
is passed on to the import instead of being loaded again.
@dknopik
dknopik requested a review from jxs as a code owner October 12, 2026 16:04
@michaelsproul michaelsproul added gloas v9.0.0 Gloas mainnet release labels Oct 13, 2026

@michaelsproul michaelsproul left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM.

@michaelsproul michaelsproul added the ready-for-merge This PR is ready to merge. label Oct 13, 2026
@mergify mergify Bot added the queued label Oct 13, 2026
@mergify

mergify Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Merge Queue Status

This pull request spent 29 minutes 50 seconds in the queue, including 28 minutes 7 seconds running CI.

Required conditions to merge

@mergify
mergify Bot merged commit 3bd2cb3 into sigp:unstable Oct 13, 2026
41 checks passed
@mergify mergify Bot removed the queued label Oct 13, 2026
@dknopik
dknopik deleted the check-gloas-column-slot branch October 16, 2026 12:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gloas ready-for-merge This PR is ready to merge. v9.0.0 Gloas mainnet release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants