Skip to content

protocol: drop overlapping span batches#371

Merged
sebastianst merged 2 commits intomainfrom
seb/feat/drop-span-batch-overlap
Apr 2, 2026
Merged

protocol: drop overlapping span batches#371
sebastianst merged 2 commits intomainfrom
seb/feat/drop-span-batch-overlap

Conversation

@sebastianst
Copy link
Copy Markdown
Member

@sebastianst sebastianst commented Mar 25, 2026

Summary

Explores dropping overlapping span batches as a Karst hardfork derivation rule change and concludes that the change is not feasible due to unresolvable implications for fault proofs, node restarts, snap sync, interop, and operational tools.

  • Dropping overlapping span batches introduces an implicit requirement that the safe head must be at a span batch boundary — this cannot be guaranteed in practice
  • Nine approaches to resolving the fault proof interaction were explored, with concrete attack scenarios for each — none are satisfactory
  • Conclusion: Overlap checks will be retained in the non-IO derivation pipeline refactor using a deferred L2 block fetching pattern

Related: ethereum-optimism/optimism#19303

🤖 Generated with Claude Code

Proposes a Karst hardfork derivation rule change to drop overlapping span
batches instead of performing expensive l2Fetcher-backed verification.
Explores nine approaches for maintaining fault proof soundness, with
trade-offs presented as an open design question.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@ajsutton ajsutton left a comment

Choose a reason for hiding this comment

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

Three cases this hits:

  • Fault proofs
  • Node crashes while applying a span batch and safe head is left part way through it (mitigated by moving to only update safe head once all data from the batch is applied)
  • Rewinding the chain with setDebugHead
  • Node startup process - where is the L1 block to start from and what safe L2 block should we use? Theoretically we should use the current safe L2 block but op-node often rewinds it for some reason.
  • Snap sync might sync to a node in the middle of a span batch.

Fundamentally the difficult question here is how to know which safe block is actually ok to start derivation from. If you take an L2 block and iterate L1 to find the span batch it came from you then have to ask, did that span batch overlap with a previous one?
So you find the previous span batch and check it overlaps or not. But first you need to know if the previous span batch was valid, so you have to find its parent. You wind up having to read the entire batch history in order to validate your starting point and with blobs that starting point won't be available.

Comment thread protocol/drop-span-batch-overlap.md
Comment thread protocol/drop-span-batch-overlap.md Outdated
Comment thread protocol/drop-span-batch-overlap.md
Reframe as exploration doc. The implicit requirement that the safe head
must be at a span batch boundary cannot be met in practice — violated by
fault proofs, node restarts, snap sync, interop, and setDebugHead.

Overlap checks will be retained in the non-IO derivation refactor using
deferred L2 block fetching.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sebastianst sebastianst removed request for Inphi and theochap April 1, 2026 11:58
@sebastianst sebastianst merged commit 67d1697 into main Apr 2, 2026
5 checks passed
@sebastianst sebastianst deleted the seb/feat/drop-span-batch-overlap branch April 2, 2026 11:38
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