Problem
During parallel initial sync (frozen blocks), when execution succeeds but commitment produces a wrong trie root:
- First batch processes correctly (e.g., blocks 24363950-24368662), commits state
- Second batch processes correctly (blocks 24368663-24368999), Flushes to sd.mem
- Commitment at batch end fails (wrong trie root — known timing issue)
- Stage loop tries to unwind but CanUnwindToBlockNum finds no unwindable block from changesets
- Falls back to LatestBlockNumWithCommitment (block 24368662)
- Retry starts from block 24368663 on TOP of the first execution's state in sd.mem
- System call at block 24368669 reads double-applied withdrawal contract state
- Wrong requests root hash — different error than the original commitment failure
The retry keeps producing the same requests root error indefinitely via the Caplin forkchoice loop.
Root Causes
- No unwindable block found: The CanUnwindToBlockNum fallback silently returns the commitment block number instead of signaling that unwind is impossible.
- sd.mem not properly reset between retries
- Caplin retries indefinitely — the requests root error is not caught as ErrInvalidBlock
Proposed Fix
- Make no unwindable block found fatal during initial sync
- Fix commitment timing (commitment calculator pipeline)
- Or: skip commitment during initial sync and compute in a separate pass
Related
Problem
During parallel initial sync (frozen blocks), when execution succeeds but commitment produces a wrong trie root:
The retry keeps producing the same requests root error indefinitely via the Caplin forkchoice loop.
Root Causes
Proposed Fix
Related