Skip to content

FollowTip permanently fails with 'recursion limit reached' re-serving a block it already applied fine (regression 1.1.0 -> 1.6.0) #1340

Description

@bouwerp

Summary

FollowTip permanently fails with a gRPC Internal / "recursion limit reached" protobuf decode error when re-serving a specific historical block on Cardano Preview, even though Dolos's own chain-following/ingestion already applied that same block to its local ledger without any error. The failure is 100% deterministic and repeats on every reconnect attempt — a client following from an intersection at or before this point can never make progress past it.

Evidence

Stuck point: slot 122726711 (hash 8369713d5dd25692475ff9a71fbf0c4575a7303a79707384dc831fae5771132f) is the last good intersection. The very next block, slot 122726746 (hash c6ce58758d3634f06056c05a9425cacc07ae7581192f28ef7e15afe47e4b5dbb), cannot be served.

Client-side error (via utxorpc/CardanoSyncClient::follow_tip), repeating verbatim on every retry:

status: Internal, message: "failed to decode Protobuf message:
PlutusDataArray.items: PlutusData.plutus_data: PlutusDataArray.items: PlutusData.plutus_data: [... repeats ~45 times ...]
Redeemer.payload: TxInput.redeemer: Tx.inputs: BlockBody.tx: Block.body: AnyChainBlock.chain: FollowTipResponse.action: recursion limit reached"

Dolos's own ingestion log for the same block shows a clean apply, no error, at the time it was originally processed at the tip:

INFO stage{stage="apply"}:execute:roll_forward:work_unit{name=roll}:shard{index=0 total=1 resumed=false}:
  dolos_cardano::roll::work_unit: rolling forward point=122726746(c6ce58758d3634f06056c05a9425cacc07ae7581192f28ef7e15afe47e4b5dbb)

So the data is ingested and applied fine; the failure is specific to re-serving it via FollowTip (e.g. on a client reconnect/replay after this point has already been committed).

Version bisection

Confirmed by comparing two independently-run Dolos instances following the same canonical Preview chain:

Dolos version Behavior at slot 122726746
1.1.0 Serves it fine — that instance is now hundreds of thousands of slots ahead with no issue
1.6.0 Fails with the recursion-limit error above, on every single retry, indefinitely

This points to a regression introduced somewhere between 1.1.0 (2026-04-30) and 1.6.0 (2026-07-27) in the Cardano→protobuf mapping for PlutusData/Redeemer used by FollowTip.

Impact

Any UtxoRPC client using FollowTip (e.g. sundae-sync-v2) that reconnects with an intersection at or before slot 122726711 gets permanently stuck — every retry hits the identical decode error, with no way to progress past this block via the sync API.

Ask

  • Confirm whether this is a known regression in the PlutusData/Redeemer protobuf mapping between 1.1.0 and 1.6.0.
  • If useful, I can help narrow the exact redeemer/datum shape that triggers this — I wasn't able to extract the raw bytes without pausing a live instance, but the exact slot/block above should reproduce it deterministically against Preview.

Environment

  • Dolos 1.6.0 (failing), Dolos 1.1.0 (working)
  • Network: Cardano Preview testnet
  • Client: utxorpc Rust crate 0.13.0, CardanoSyncClient::follow_tip

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions