Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Add experimental `AnyNewEpochState` parameterised on `Era` to eliminate partial `sbeToEra` conversions

Abierto
#1,190 1 comentario 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@carbolymer ya está trabajando en esto.

Desde el 27/4/2026.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

Problem

AnyNewEpochState in Cardano.Api.LedgerState carries a ShelleyBasedEra era witness:

data AnyNewEpochState where
  AnyNewEpochState
    :: ShelleyBasedEra era
    -> ShelleyAPI.NewEpochState (ShelleyLedgerEra era)
    -> Ledger.LedgerTables ...
    -> AnyNewEpochState

Consumers in cardano-testnet that need EraCommonConstraints (via obtainCommonConstraints) must first convert ShelleyBasedEra era to Exp.Era era using sbeToEra. Because Exp.Era only inhabits Conway and Dijkstra, sbeToEra is partial for pre-Conway eras, forcing every call site to use a helper like:

unsafeEraFromSbe :: HasCallStack => ShelleyBasedEra era -> Era era
unsafeEraFromSbe = withFrozenCallStack $
  either (error . prettyShow . prettyError) id . sbeToEra

This appears in EpochStateProcessing.hs and is used across multiple modules (Components/Query.hs, Runtime.hs, Process/Cli/SPO.hs). Every pattern match on AnyNewEpochState in testnet code repeats the same partial conversion.

See cardano-node PR #6551 for context and the review discussion that motivated this issue.

Constraint

foldEpochState replays the chain from genesis via a pipelined chain-sync client. The callback receives blocks from all eras (Shelley through Dijkstra), so the existing AnyNewEpochState with ShelleyBasedEra must remain available for consumers that need full-era coverage (e.g. cardano-cli debug log-epoch-state).

Proposal

Add a new existential type in Cardano.Api.Experimental that carries an Era era witness instead of ShelleyBasedEra era:

-- | Like 'AnyNewEpochState' but restricted to experimental (Conway+) eras,
-- so that 'obtainCommonConstraints' is always total.
data AnyNewEpochState where
  AnyNewEpochState
    :: Era era
    -> ShelleyAPI.NewEpochState (ShelleyLedgerEra era)
    -> Ledger.LedgerTables ...
    -> AnyNewEpochState

Optionally, provide one or both of:

  1. A conversion function from the legacy type to Maybe the experimental type (fails for pre-Conway eras).
  2. A wrapper around foldEpochState that silently skips pre-Conway blocks and delivers only Exp.AnyNewEpochState to the callback, for consumers that only care about Conway+ governance state.

Migration path

  • cardano-testnet: switch to the experimental AnyNewEpochState. All unsafeEraFromSbe calls and the helper itself can be removed; obtainCommonConstraints works directly on the Era witness.
  • cardano-cli (debug log-epoch-state): continues using the legacy AnyNewEpochState with ShelleyBasedEra, unaffected by this change.

Alternatives considered

  • Make sbeToEra total: not possible without adding pre-Conway constructors to Era, which defeats the purpose of the experimental API.
  • Keep the status quo: every new testnet module repeats the same partial conversion boilerplate, and error calls in test infrastructure are fragile.
Lenguaje dominante
Haskell
Estrellas
41
Forks
32
Merge medio
2 d 19 h
PR fusionados (30 d)
29

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de IntersectMBO/cardano-api

Todos los issues de IntersectMBO/cardano-api

Issues similares

Más issues de Haskell

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.