7.1 KiB
PARAMS — Threshold BLS (Lux profile) — parameter-set worksheet
Parameter choices for the threshold-BLS package at
github.com/luxfi/threshold/protocols/bls.
§1 Single parameter set in v0.x
This package ships one parameter set (BLS12-381 with the IETF G2-signature ciphersuite). The reason there is exactly one set:
- The underlying single-party BLS in
luxfi/crypto/blsships exactly one ciphersuite. - The threshold layer does not introduce any new field, group, or hash — it reuses the single-party primitive byte-for-byte.
A future second parameter set (e.g., G1-signature variant, or a different pairing-friendly curve) would require an LP and a new sub-package.
§2 Cryptographic parameters
| Identifier | Value | Source |
|---|---|---|
| Curve | BLS12-381 | cloudflare/circl/ecc/bls12381 |
Public-key group G_1 |
48-byte compressed | IETF draft-irtf-cfrg-bls-signature-05 |
Signature group G_2 |
96-byte compressed | IETF draft-irtf-cfrg-bls-signature-05 |
Target group G_T |
Pairing output, internal | circl pairing |
Scalar field order r |
0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 |
BLS12-381 group order |
Base-field characteristic p |
0x1a0111ea397fe69a4b1ba7b6434bae35 ... (381 bits) |
BLS12-381 base prime |
Pairing embedding degree k |
12 | BLS12-381 |
| Hash-to-curve | BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_ |
IETF draft §4.2.2 |
| Ciphersuite tag | BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_ |
luxfi/crypto/bls Sign |
| Random-oracle hash | SHA-256 (per ciphersuite) | FIPS 180-4 |
§2.1 Classical security level
| Property | Bits | Source |
|---|---|---|
Discrete-log in G_1 / G_2 |
~128 | BLS12-381 standard analysis |
co-CDH in (G_1, G_2) |
~128 | Inherits from DL hardness |
§2.2 Post-quantum security level
| Property | Bits | Source |
|---|---|---|
| Any pairing-based assumption | 0 (BROKEN BY SHOR) | Standard PQ analysis |
BLS is classically secure only. PQ replacements are:
- Pulsar (
luxfi/pulsar) — Module-LWE threshold, FIPS 204 byte-equal. - Corona (
luxfi/corona) — Ring-LWE threshold, construction-level.
§3 Threshold parameters
| Identifier | Value | Constraint |
|---|---|---|
Threshold t |
Config.Threshold |
1 ≤ t ≤ n |
Total parties n |
Config.TotalParties |
n ≥ t |
| Sharing polynomial degree | t − 1 |
bls.go:171 |
| Party-ID embedding | party.ID(i).Scalar(F_r) |
Must be non-zero (§4.1) |
§3.1 Supported (t, n) ranges
The implementation imposes no hard upper bound on t or n.
Practical bounds:
t = 1, n = 1: degenerate single-party; works but is not a useful threshold.t = 1, n > 1: any single signer can produce the signature; not useful for custody.t = n: full-quorum requirement; works but loses fault tolerance.t < n(typical): the useful case.
Tested-as-of-this-revision profiles (per bls_test.go):
- 2-of-3
- 3-of-5
Performance benchmarks for larger profiles are gathered in
~/work/lux/threshold/CLAUDE.md (the parent threshold library's
benchmark table). Threshold-BLS specifically:
| Operation | 3-of-5 | 5-of-9 | 7-of-11 | 10-of-15 |
|---|---|---|---|---|
| Keygen (trusted dealer) | <5 ms | <10 ms | <15 ms | <30 ms |
| Per-party sign | <2 ms | <2 ms | <2 ms | <2 ms |
Aggregate (t partials) |
~2 ms × t Lagrange mults + t G2 scalar-mults |
scales linearly | scales linearly | scales linearly |
| Verify (aggregate) | ~2 ms (one pairing) | ~2 ms | ~2 ms | ~2 ms |
(Numbers indicative; exact values from the parent benchmark table.)
§3.2 Party-ID constraints
Per SPEC.md §4.2:
party.IDis a UTF-8 byte sequence.- Its embedding into
F_rviaparty.ID(i).Scalar(F_r)MUST be non-zero (else the share equals the master secret). - IDs MUST be distinct across the party set (else Lagrange
coefficients are undefined: division by zero in
Π (x_i − x_j)).
The current implementation does NOT validate either constraint at
Config construction. Both are caller responsibilities until the
Tier-A gate in PROOF-CLAIMS.md §3.7 closes.
§4 Encoding parameters
| Field | Size | Format |
|---|---|---|
| Public key (group + per-party VK) | 48 bytes | G1 compressed, IETF draft §2.5.1 |
| Secret key (master + per-party share) | 32 bytes | Big-endian scalar mod r, IETF draft §2.3 |
| Signature (partial + aggregate) | 96 bytes | G2 compressed, IETF draft §2.5.2 |
| Message | unbounded | Hashed via BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_ |
Threshold-specific wire formats (e.g., for the pkg/thresholdd/
dispatcher) are not yet pinned at this layer — see
pkg/thresholdd/server.go for the current RPC schema, which uses
hex-encoded byte strings for compatibility with the teleport-MPC
bus.
§5 LP cross-reference
| LP | Title | Relation |
|---|---|---|
| LP-3653 | BLS12-381 Cryptography Precompile (legacy slot) | Single-party + aggregate; not threshold |
| LP-4110 | BLS12-381 Cryptography Precompile (canonical) | Single-party + aggregate; not threshold |
| LP-4700 | Threshold + MPC Family Umbrella | Indexes threshold protocols; threshold-BLS slot NOT YET ALLOCATED |
| LP-4710 | FROST Threshold Signature Precompile | Sibling threshold scheme |
| LP-4720 | CGGMP21 Threshold ECDSA Precompile | Sibling threshold scheme |
Gap callout: there is no LP for a threshold-BLS precompile at
this revision. A future LP would slot into the 4700-4799 range
adjacent to LP-4720. SUBMISSION-STATUS.md §3.3 enumerates this as
a Tier-A gate.
§6 Profile selection rationale
Why BLS12-381 G2-signature ciphersuite (not G1-signature)?
- Lux uses BLS for aggregate-friendly consensus signatures. The G2-signature variant is canonical across Ethereum, Filecoin, Drand, dfinity, etc. — interop matters.
- The G1-signature variant trades a slightly smaller signature (48 bytes vs 96 bytes) for a larger public key (96 bytes vs 48 bytes). For consensus-aggregation use cases, signature size amortizes, so the G2-signature variant is optimal.
luxfi/crypto/blspins the G2-signature ciphersuite. The threshold layer follows.
§7 Parameter-change governance
Parameter changes (e.g., a future move to BLS12-377, a switch to G1-signature variant, or any modification of the ciphersuite tag) require:
- A new LP under 4700-4799 specifying the change.
- A new key-era boundary (no in-place modification of an existing committee).
- A new test-vector set under
TEST-VECTORS.mdcovering the new parameter combination. - A new sub-package or build tag — the existing package's behaviour never changes for an existing parameter set.
This is the one-way-only forward rule from the global CLAUDE.md.
§8 References
- IETF
draft-irtf-cfrg-bls-signature-05— encoding + ciphersuite. - Boldyreva 2003 — threshold-BLS construction.
~/work/lux/lps/LPs/lp-4110-bls12-381-cryptography-precompile.md.~/work/lux/lps/LPs/lp-4700-threshold-mpc-family-umbrella.md.luxfi/crypto/bls— single-party primitive (parameter pin).cloudflare/circl/ecc/bls12381— curve backend.
Document metadata
- Name:
PARAMS.md - Version: v0.1 (initial submission-package scaffolding)
- Date: 2026-05-18