Home / Input Output / cardano-ledger-specs
May 11, 6-7 PM (0)
May 11, 7-8 PM (0)
May 11, 8-9 PM (0)
May 11, 9-10 PM (0)
May 11, 10-11 PM (0)
May 11, 11-12 AM (0)
May 12, 12-1 AM (0)
May 12, 1-2 AM (0)
May 12, 2-3 AM (0)
May 12, 3-4 AM (0)
May 12, 4-5 AM (0)
May 12, 5-6 AM (0)
May 12, 6-7 AM (0)
May 12, 7-8 AM (0)
May 12, 8-9 AM (0)
May 12, 9-10 AM (0)
May 12, 10-11 AM (3)
May 12, 11-12 PM (0)
May 12, 12-1 PM (0)
May 12, 1-2 PM (0)
May 12, 2-3 PM (0)
May 12, 3-4 PM (0)
May 12, 4-5 PM (0)
May 12, 5-6 PM (0)
May 12, 6-7 PM (0)
May 12, 7-8 PM (5)
May 12, 8-9 PM (0)
May 12, 9-10 PM (0)
May 12, 10-11 PM (0)
May 12, 11-12 AM (0)
May 13, 12-1 AM (0)
May 13, 1-2 AM (0)
May 13, 2-3 AM (0)
May 13, 3-4 AM (0)
May 13, 4-5 AM (0)
May 13, 5-6 AM (0)
May 13, 6-7 AM (0)
May 13, 7-8 AM (10)
May 13, 8-9 AM (1)
May 13, 9-10 AM (0)
May 13, 10-11 AM (1)
May 13, 11-12 PM (7)
May 13, 12-1 PM (5)
May 13, 1-2 PM (0)
May 13, 2-3 PM (0)
May 13, 3-4 PM (0)
May 13, 4-5 PM (0)
May 13, 5-6 PM (0)
May 13, 6-7 PM (0)
May 13, 7-8 PM (0)
May 13, 8-9 PM (0)
May 13, 9-10 PM (8)
May 13, 10-11 PM (0)
May 13, 11-12 AM (0)
May 14, 12-1 AM (0)
May 14, 1-2 AM (0)
May 14, 2-3 AM (0)
May 14, 3-4 AM (0)
May 14, 4-5 AM (0)
May 14, 5-6 AM (0)
May 14, 6-7 AM (0)
May 14, 7-8 AM (0)
May 14, 8-9 AM (0)
May 14, 9-10 AM (0)
May 14, 10-11 AM (0)
May 14, 11-12 PM (0)
May 14, 12-1 PM (0)
May 14, 1-2 PM (0)
May 14, 2-3 PM (0)
May 14, 3-4 PM (0)
May 14, 4-5 PM (0)
May 14, 5-6 PM (6)
May 14, 6-7 PM (2)
May 14, 7-8 PM (0)
May 14, 8-9 PM (0)
May 14, 9-10 PM (0)
May 14, 10-11 PM (0)
May 14, 11-12 AM (0)
May 15, 12-1 AM (0)
May 15, 1-2 AM (0)
May 15, 2-3 AM (0)
May 15, 3-4 AM (0)
May 15, 4-5 AM (0)
May 15, 5-6 AM (0)
May 15, 6-7 AM (0)
May 15, 7-8 AM (0)
May 15, 8-9 AM (0)
May 15, 9-10 AM (0)
May 15, 10-11 AM (0)
May 15, 11-12 PM (0)
May 15, 12-1 PM (1)
May 15, 1-2 PM (0)
May 15, 2-3 PM (0)
May 15, 3-4 PM (0)
May 15, 4-5 PM (0)
May 15, 5-6 PM (0)
May 15, 6-7 PM (0)
May 15, 7-8 PM (0)
May 15, 8-9 PM (0)
May 15, 9-10 PM (0)
May 15, 10-11 PM (0)
May 15, 11-12 AM (0)
May 16, 12-1 AM (0)
May 16, 1-2 AM (0)
May 16, 2-3 AM (0)
May 16, 3-4 AM (0)
May 16, 4-5 AM (0)
May 16, 5-6 AM (0)
May 16, 6-7 AM (0)
May 16, 7-8 AM (0)
May 16, 8-9 AM (0)
May 16, 9-10 AM (0)
May 16, 10-11 AM (0)
May 16, 11-12 PM (0)
May 16, 12-1 PM (0)
May 16, 1-2 PM (0)
May 16, 2-3 PM (0)
May 16, 3-4 PM (1)
May 16, 4-5 PM (0)
May 16, 5-6 PM (0)
May 16, 6-7 PM (0)
May 16, 7-8 PM (0)
May 16, 8-9 PM (0)
May 16, 9-10 PM (0)
May 16, 10-11 PM (0)
May 16, 11-12 AM (0)
May 17, 12-1 AM (0)
May 17, 1-2 AM (0)
May 17, 2-3 AM (0)
May 17, 3-4 AM (0)
May 17, 4-5 AM (0)
May 17, 5-6 AM (0)
May 17, 6-7 AM (1)
May 17, 7-8 AM (0)
May 17, 8-9 AM (0)
May 17, 9-10 AM (0)
May 17, 10-11 AM (0)
May 17, 11-12 PM (0)
May 17, 12-1 PM (1)
May 17, 1-2 PM (0)
May 17, 2-3 PM (0)
May 17, 3-4 PM (0)
May 17, 4-5 PM (0)
May 17, 5-6 PM (0)
May 17, 6-7 PM (1)
May 17, 7-8 PM (0)
May 17, 8-9 PM (0)
May 17, 9-10 PM (0)
May 17, 10-11 PM (0)
May 17, 11-12 AM (0)
May 18, 12-1 AM (0)
May 18, 1-2 AM (0)
May 18, 2-3 AM (0)
May 18, 3-4 AM (0)
May 18, 4-5 AM (0)
May 18, 5-6 AM (0)
May 18, 6-7 AM (0)
May 18, 7-8 AM (11)
May 18, 8-9 AM (0)
May 18, 9-10 AM (0)
May 18, 10-11 AM (0)
May 18, 11-12 PM (0)
May 18, 12-1 PM (1)
May 18, 1-2 PM (0)
May 18, 2-3 PM (8)
May 18, 3-4 PM (0)
May 18, 4-5 PM (0)
May 18, 5-6 PM (0)
May 18, 6-7 PM (0)
73 commits this week May 11, 2026 - May 18, 2026
Leios: hash Dijkstra cert blocks over the cert(s) only
When a 'DijkstraBlockBody' carries a 'LeiosCert' (i.e. it is a cert
block), 'hashDijkstraSegWits' now hashes only the optional Leios /
Peras certificates and ignores the four transaction segwit chunks.
This mirrors the leios-prototype's @hashBody (BodyCertificate cert _) =
hashCert cert@: the header commits to the cert, the EB closure is
resolved into 'dbbTxs' locally (by chain-sel's 'resolveLeiosBlock'
before handing the block to BBODY), and the locally-inlined txs must
not invalidate the header-committed body hash.

For regular blocks (no LeiosCert) the hash still covers the segwit
chunks plus the optional Peras certificate, unchanged.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios: encode Leios cert before Peras cert in DijkstraBlockBody
The BBODY rule validates the Peras certificate when present, and that
validation requires the Praos header to carry a 'PrevEpochNonce'. The
consensus header builder currently defaults that to 'Nothing', so a
Dijkstra block that happens to carry a Peras certificate (placeholder
or otherwise) fails BBODY with 'PrevEpochNonceNotPresent' and gets
rejected from the chain.

The pre-fix wire format dispatched on the body's inner list length
positionally with Peras-first: @5@ ⇒ Peras only, @6@ ⇒ Peras + Leios.
That made "Leios only" unrepresentable, forcing the consensus layer to
attach a placeholder Peras cert alongside every Leios cert and
tripping the validation failure above.

Swap the order on the wire so Leios comes first:

  4 ⇒ no cert
  5 ⇒ Leios only
  6 ⇒ Leios + Peras

"Peras only without Leios" is no longer representable; if support for
that combination is needed later the wire format should move to
explicit @StrictMaybe@ markers per cert. The hash function already
takes Leios before Peras, so the body hash is unchanged.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios: fix DijkstraBlockBody CBOR encoding
The body encoder previously emitted four mandatory segwit chunks plus
optional Peras/Leios certificate bytes inline, with a constant
'listLen = 5' and 'numSegComponents = 5'. The 'DecCBOR' instance reads
an inner list length and dispatches on it (4 / 5 / 6), but the encoder
never wrote that list length and the constant 'listLen = 5' didn't
match the actual cert-presence cases. As a result, basic blocks (both
certs SNothing) failed to deserialise on the network — the outer
'Block' decoder expected 'numSegComponents + 1 = 6' elements but the
encoder produced only 5.

Wrap the body in its own CBOR list at encoding time, with the inner
length (4, 5, or 6) discriminating between (no cert) / (Peras only) /
(Peras + Leios). The matching 'DecCBOR' already reads this exact
length, so the existing decode path works unchanged. The outer 'Block'
record is now 2 elements (header + body-list), so
'numSegComponents = 1'.

A Leios certificate without a Peras certificate is not representable on
the wire (the decoder reads certificates positionally); the encoder
'error's in that case.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios: add Maybe LeiosCert on DijkstraBody (Dijkstra-only)
Re-authored on top of c175b1b317 (the cardano-ledger commit compatible
with consensus main's CHaP index-state 2026-04-13) to match the older
fat-constructor DijkstraBlockBody shape (pre-memoization refactor).
Equivalent to b6b2feb006 on leios-prototype-remake, which targeted the
post-memoization shape (DijkstraBlockBodyRaw + lensMemoRawType).

Adds:
* `dbbLeiosCert :: StrictMaybe LeiosCert` field and matching
  `dbbLeiosCertBytes :: Maybe BSL.ByteString` byte-cache, mirroring the
  PerasCert pattern in this older shape.
* `LeiosCert` placeholder newtype over ByteString with derived
  EncCBOR/DecCBOR/NoThunks/NFData (the real type lands with the Leios
  voting machinery).
* `leiosCertBlockBodyL` lens method on `DijkstraEraBlockBody`.
* Pattern synonym extended with a third `StrictMaybe LeiosCert` arg;
  body threads the bytes through `hashDijkstraSegWits` (now takes the
  Leios bytes arg too).
* `EncCBORGroup` appends the optional Leios cert bytes after the
  optional Peras cert bytes.
* `DecCBOR` handles three list-length cases: 4 (neither), 5 (Peras
  only, legacy), 6 (Peras + Leios). A Leios-only encoding is not
  expressible without ambiguity at len 5 \-- intentional: Dijkstra-era
  blocks aren't on the wire yet.
* `NoThunks` `AllowThunksIn` list extended with `dbbLeiosCertBytes`.
* Testlib: `Arbitrary LeiosCert` (and `DijkstraBlockBody <*> arbitrary
  <*> arbitrary <*> arbitrary`); `ToExpr LeiosCert` and updated
  `ToExpr (DijkstraBlockBody era)` constraint set.

Only the Dijkstra era is Leios-enabled \-- earlier eras are untouched.

Verified: `cabal build cardano-ledger-dijkstra:lib:cardano-ledger-dijkstra`
and `cabal build cardano-ledger-dijkstra:lib:testlib` both clean.

Co-Authored-By: Claude Opus 4.7 <[email protected]>