mirror of
https://github.com/luxfi/consensus.git
synced 2026-09-24 00:26:58 +00:00
Add protocol/quasar/pulsar -- the consensus-side adapter that wires luxfi/pulsar's threshold ML-DSA RoundSigner into Quasar as a certificate profile. Consensus consumes Pulsar; Pulsar never consumes consensus. Decomplected ownership (the load-bearing boundary): Consensus owns ORCHESTRATION: validator-set membership, committee sampling, session binding, canonical nonce selection, QC aggregation, signer bitmap, ConsensusCert assembly, retries, fallback, slashing. Pulsar owns CRYPTO: the two-round shape (Round1 binds the nonce, Round2 emits a proof-carrying z partial), z aggregation mod q, public hint recovery (FindHint over w' = A*z - c*t1*2^d), and the FIPS 204 ML-DSA signature. PulsarRoundSigner implements pulsar.RoundSigner (Round1/Round2/Finalize). The secret-bearing FIPS 204 assembly stays package-private to luxfi/pulsar and is injected as a pluggable core; until a reviewed Boundary-Cleared / Carry-Elimination signer ships (pulsar.ProductionBCCSigningReady), Finalize fails closed -- it returns a structurally-complete ConsensusCert with an EMPTY signature and ErrProfileNotReady, and the orchestrator falls back to Corona. No secret residual is ever opened on this path. This forward-ports the profile onto the v1.35 release line. It consumes the pulsar v1.9.0 pkg/pulsar package already pinned on this line -- no go.mod / go.sum change, no dependency bump, and the new import adds zero transitive sums. Purely additive: six new files, no existing file touched, so no existing exported consensus symbol changes and no other consumer is affected. The strict-PQ triple gate (engine.go generateCert: BLS + Corona + ML-DSA) is untouched and still refuses to finalize without all three legs. Co-authored-by: Hanzo Dev <[email protected]>