Skip to content

Scaffold an initial cardano-crypto-leios package#670

Open
ch1bo wants to merge 24 commits into
masterfrom
ch1bo/cardano-crypto-leios
Open

Scaffold an initial cardano-crypto-leios package#670
ch1bo wants to merge 24 commits into
masterfrom
ch1bo/cardano-crypto-leios

Conversation

@ch1bo

@ch1bo ch1bo commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Adds a new package for leios cryptographic types and operations. This was done in course of IntersectMBO/ouroboros-consensus#2068, I'm currently integrating this with the cardano-ledger master and expect a follow-up PR there.

The digital signature scheme is BLS12-381 and fixed in the module. Contrary to the CIP-164, the certificate does not contain a slot or EbHash anymore. This makes definition in cardano-base a lot easier and in the current block structure design, the "message" against which the certificate is signed would be available from the (block) context in which the certificate is used.

Most importantly, this module contains encoders/decoders for the LeiosCert type including roundtrip and golden tests. This should be enough for the cardano-ledger to use this type confidently in Dijkstra era blocks.

There are also property tests about aggregating and verifying certificates. The Committee is part of this package, but how it is selected is deliberately kept out of scope.

image

@ch1bo ch1bo changed the title WIP: Scaffold an initial cardano-crypto-leios package Scaffold an initial cardano-crypto-leios package Jun 11, 2026
@ch1bo ch1bo force-pushed the ch1bo/cardano-crypto-leios branch from d85df0c to aa227fa Compare June 16, 2026 14:56
@ch1bo ch1bo requested review from lehins and perturbing June 16, 2026 18:10
@ch1bo ch1bo marked this pull request as ready for review June 16, 2026 18:10
@ch1bo ch1bo force-pushed the ch1bo/cardano-crypto-leios branch from bf92c7d to 780e347 Compare June 17, 2026 07:22
@ch1bo ch1bo force-pushed the ch1bo/cardano-crypto-leios branch 2 times, most recently from 1102098 to 25e16ac Compare June 17, 2026 21:21
ch1bo added 12 commits June 18, 2026 11:38
Roundtrip and golden tests for LeiosCert
These are the only means to create and verify leios certificates about a
certain message (a leios vote). Committee selection was deliberately
kept out of scope
The golden test compares 'cardano-crypto-leios/test/golden/LeiosCert'
byte-for-byte against the hex-dump output of 'encodeWithIndex'. Without
this attribute, the default Windows 'core.autocrlf=true' translates LF
to CRLF on checkout and the comparison fails, even though the file is
committed with LF endings.
These were needed/useful in the cardano-ledger-dijkstra integration
@ch1bo ch1bo force-pushed the ch1bo/cardano-crypto-leios branch 2 times, most recently from 73d303e to 745de18 Compare June 18, 2026 19:18
This avoids redundant import warnings on newer GHC versions
@ch1bo ch1bo force-pushed the ch1bo/cardano-crypto-leios branch from 745de18 to 38a3b98 Compare June 18, 2026 19:24

@lehins lehins left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Consistency is one of the most important parts in software development. It is important to use consistent dependencies as the rest of the project, in this case cardano-base repo being that project.

Comment thread cardano-crypto-leios/cardano-crypto-leios.cabal Outdated
Comment thread cardano-crypto-leios/cardano-crypto-leios.cabal Outdated
Comment thread cardano-crypto-leios/cardano-crypto-leios.cabal Outdated
Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs Outdated
Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs Outdated
Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs
Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs Outdated
Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs Outdated
Comment on lines +141 to +142
{ signers :: !BitField
, aggregatedSignature :: !LeiosSignature

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is a pretty terrible naming, since signers can easily be a local binding anywhere in the cardano-node codebase. I suggest something more descriptive like:

Suggested change
{ signers :: !BitField
, aggregatedSignature :: !LeiosSignature
{ leisCertSigners :: !BitField
, leisCertSignature :: !LeiosSignature
-- ^ Aggregated BLS signature

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I deliberately wanted to match the CDDL as close as possible. The call sites should be all in this module, outside construction and inspection are not really intended (to be convenient) and we could even choose to not export the field selectors. However, I didn't want to be too prescriptive on this type.

Comment thread cardano-crypto-leios/src/Cardano/Crypto/Leios.hs Outdated
ch1bo added 3 commits June 19, 2026 19:41
- Replace indexed-hex golden file with raw binary; drop the .gitattributes
  LF pin and the base16-bytestring dep.
- Extract InsufficientWeight's named fields into a WeightMismatch record so
  no constructor has partial accessors; drop -Wno-partial-fields and
  DuplicateRecordFields.
- Introduce strict LeiosVoter to replace the lazy (Weight, VerKey) tuple
  in Committee; switch BLSAggregationFailed to Text; tighten verifier
  accumulator strictness.
- Don't export field selectors that can easily overlap.
Replaces the list-of-bytes construction in 'mkBitField' (and the
'BS.unpack' list comprehension in 'bitFieldMembers') with direct
mutable 'ByteArray' operations from 'Data.Primitive.ByteArray', so
the ByteArray-backed representation isn't undone by intermediate
list allocations. Wire encode/decode stay zero-copy via the existing
SBS aliasing; on-wire bytes are unchanged (golden test confirms).
ch1bo added 6 commits June 20, 2026 23:17
'enforceSize' from cardano-binary only accepts definite-length lists,
which would reject any producer that emits the 2-element outer array
of a Leios certificate as an indefinite-length CBOR array. Switch to
'decodeListLenOrIndef' + 'matchSize' for the definite branch and a
trailing 'decodeBreakOr' for the indefinite branch.

Adds a QuickCheck property that round-trips through a hand-rolled
indefinite-length encoding to lock the new behaviour in.
Section headers move into the export list; the body's '-- *' /
'-- **' markers are removed to avoid double sections in Haddock.
Doc strings stay at the definitions. 'mkBitField' and
'bitFieldMembers' are no longer exported — they're only callable
through 'aggregateLeiosCert' / 'verifyLeiosCert', which the tests
exercise transitively. Adversarial tests still have the
'bitFieldFromBytes' / 'bitFieldToBytes' wire helpers.
'aggregateLeiosCert' was binding 'entries = Map.toAscList contributions'
just to feed two separate consumers: a range-check over keys and a
signature-aggregation over values. Each consumer can take its
Map.keys / Map.elems input directly, which lets list fusion eliminate
the intermediates per pass.

Adds source/destination type applications to every fromIntegral in the
package (src + test + testlib) so the conversion's intent is explicit
at the call site and silent type-changes during refactors are caught.
@ch1bo ch1bo requested a review from lehins June 21, 2026 18:07
ch1bo added 2 commits June 22, 2026 10:49
This should be a typical size (> 99% of current stake distribution)
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