Lux Proposals
← All proposals
LP-0170Proposedpqq-chainquasarfinalitypulsar

LP-170: Q-Chain — Quasar Finality Block Standard

Abstract

LP-170 mirrors Hanzo HIP-0079 into Lux. Q-Chain is the **compact

finality-block log** for the Quasar consensus engine on the Lux

primary network. Each Q-Block carries a few hundred bytes of header +

roots (anchored to Z-Chain per LP-169) plus a single ~3.3 KB

Pulsar-65 threshold signature (LP-171). Per-block bandwidth is

O(1) in committee size; adding validators makes Z-Chain heavier,

not Q-Chain.

The full Q-Block wire schema, the canonical transcript-binding

function (TupleHash256 over 23 axes with customisation

PULSAR-Q-BLOCK-V1), and the 11-clause acceptance rule live in

HIP-0079. LP-170 pins the Lux-side facts: the production-default

parameters, the locked profile, and the luxfi/* implementation

surface.

Mirrored profile


ProfileID:           0x01  (ProfileLuxStrictPQ)
ProfileName:         LUX_STRICT_PQ
HashSuiteID:         SHA3_NIST                (0x01)
IdentitySchemeID:    ML_DSA_65                (0x42)
FinalitySchemeID:    PULSAR_M_65              (0x52)
HighValueSchemeID:   PULSAR_M_87              (0x53)
ProofPolicyID:       STARK_FRI_SHA3_PQ        (0x10)
AllowedBackends:     SP1_COMPRESSED_STARK, RISC0_SUCCINCT_STARK,
                     P3Q_PLONKY3_STARK_FRI, STONE_CAIRO_STARK_CPP,
                     STWO_CIRCLE_STARK
MinSoundnessBits:    128
MinHashOutputBits:   384
RequireTransparent:  true
ForbidPairings:      true
ForbidKZG:           true
ForbidTrustedSetup:  true
ForbidClassicalSNARKs: true
ForbidDevProofs:     true
ForbidFallbacks:     true

Source: luxfi/consensus/config.LuxStrictPQProfile. The profile hash

is pinned at Lux mainnet genesis and bound into

Certificate.TranscriptHash() so a flipped byte breaks signature

verification, not just a string-equality check.

Production defaults (Lux primary network)

| parameter | value |
|----------------------|--------------------------------|
| version | 0x0001 |
| proof_system_id | 0x10 (STARK_FRI_SHA3_PQ) |
| hash_suite_id | 0x01 (SHA3_NIST) |
| sig_scheme_id | 0x52 (Pulsar-65) |
| committee size n | 64 |
| BFT fault bound f | 21 |
| threshold t | 43-of-64 |
| epoch length | network-configurable; start 1h |

High-value roots (governance, bridge, slashing checkpoints) MAY

upgrade sig_scheme_id to 0x53 Pulsar-87 for the duration of the

operation. Devnet / CI may use 0x51 Pulsar-44; mainnet refuses

0x51.

Lux-specific bindings

Compliance

A Lux node MUST reject any Q-Block whose proof_system_id is a

forbidden marker (0x80 / 0x81), whose hash_suite_id is not

0x01 SHA3_NIST, or whose sig_scheme_id is not in the configured

network allowlist. Rejection MUST happen before threshold-signature

verification.

A Q-Block carrying full validator ML-DSA-65 pubkeys, per-validator

ML-DSA signatures, full DKG ceremony messages, per-validator

attestation blobs, or non-epoch-boundary Z-Chain proof bytes

violates the spec and MUST be rejected — the wire format has no

field to hold them.

References