Files
zeekayandHanzo Dev 3ff4b4e9d9 docs(mpc): correct BLS/Corona/PQ mislabels (truthful naming)
mpcd implements only CGGMP21 (secp256k1 ECDSA), FROST (ed25519/ristretto), and
LSS signing sessions — there is no bls12-381 threshold signing session. The KMS
validator "bls" slot is secp256k1/CGGMP21; the "corona" slot is ed25519/FROST.
Neither is bls12-381 aggregation nor post-quantum. A "post-quantum" claim over
classical ed25519 is materially misleading.

- deployments/customer-3of5/topology.yaml: the `bls` entry asserted
  curve=bls12-381, protocol=BLS-Threshold for "Lux consensus (validator
  signing)". Corrected to secp256k1/CGGMP21 (what is actually custodied) with a
  note that mpcd cannot threshold-sign bls12-381 and that Lux consensus BLS is a
  native per-validator key, never custodied here. (Customer manifest — highest
  priority.)
- pkg/api/handlers_kms.go: the ValidatorKeySet doc called the custodied key a
  "Corona PQ-threshold key" — it is ed25519/FROST, not PQ and not the Corona
  R-LWE lattice protocol. Corrected.
- README.md: added a "Validator key slots vs. engine protocols" note so the
  secp256k1/ed25519 custody slots are not read as the bls12-381/lattice engine
  protocols of the same name.

Labeling only — no crypto change. The live 2-of-3 mpcd ECDSA is sound.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-21 08:39:25 -07:00

140 lines
5.1 KiB
YAML

# 3-of-5 Threshold Topology: Customer + Lux
#
# Topology:
# Lux: 3 nodes (lux-0, lux-1, lux-2) -- operated by Lux
# Customer: 2 nodes (cust-0, cust-1) -- operated by Customer
# Threshold: 3 (any 3 nodes produce a valid signature)
#
# Security properties:
# - Customer alone (2 nodes) CANNOT sign. Prevents rogue customer transactions.
# - Lux alone (3 nodes) CAN sign. Required for operational/bridge/emergency use.
# - Customer + 1 Lux node (3 nodes) CAN sign. Normal DAO governance flow.
# - Single node compromise: attacker has 1 share, needs 2 more. No risk.
# - Two node compromise (worst case): attacker needs 1 more. Still safe if
# compromised nodes are on the same side (customer or lux).
#
# Trust model:
# Lux holds signing majority. This is intentional for bridge/operational keys.
# For DAO governance keys where customer must co-approve, use Safe multisig
# on-chain (see safe-integration.md) to enforce customer participation even
# when Lux holds threshold majority.
#
# Network topology:
# Lux nodes run in lux-k8s cluster (lux-mpc-customer namespace).
# Customer nodes run in customer's own infrastructure.
# ZAP transport connects all 5 nodes over TLS (mTLS via Ed25519 identity keys).
# Customer nodes connect to Lux nodes via public endpoint (mpc-customer.lux.network).
#
# Key types generated:
# - ECDSA (secp256k1): Bitcoin, Ethereum/EVM, Lux C/X/P chains
# - EdDSA (Ed25519): Solana, TON, Polkadot (via FROST)
# - FROST (secp256k1): Bitcoin Taproot, Safe on-chain verification
topology:
name: "customer-3of5"
threshold: 3
total_nodes: 5
nodes:
- id: "lux-0"
operator: "lux"
p2p_port: 9999
api_port: 9800
data_dir: "/data/mpc/lux-0"
- id: "lux-1"
operator: "lux"
p2p_port: 9999
api_port: 9801
data_dir: "/data/mpc/lux-1"
- id: "lux-2"
operator: "lux"
p2p_port: 9999
api_port: 9802
data_dir: "/data/mpc/lux-2"
- id: "cust-0"
operator: "customer"
p2p_port: 9999
api_port: 9800
data_dir: "/data/mpc/cust-0"
- id: "cust-1"
operator: "customer"
p2p_port: 9999
api_port: 9801
data_dir: "/data/mpc/cust-1"
protocols:
ecdsa:
curve: "secp256k1"
protocol: "CGGMP21"
chains:
- { network: "BTC", name: "Bitcoin (Legacy/SegWit)" }
- { network: "ETH", name: "Ethereum + all EVM chains" }
- { network: "LUX", name: "Lux C/X/P chains" }
- { network: "XRPL", name: "XRP Ledger" }
notes: "Also supports LSS protocol for dynamic resharing"
eddsa:
curve: "ed25519"
protocol: "FROST"
chains:
- { network: "SOL", name: "Solana" }
- { network: "TON", name: "TON" }
notes: "FROST Taproot mode produces BIP-340 compatible signatures"
sr25519:
curve: "ristretto255"
protocol: "FROST"
chains:
- { network: "DOT", name: "Polkadot" }
- { network: "KSM", name: "Kusama" }
notes: "Schnorrkel/Ristretto255 via generic FROST over ristretto255 group"
# CORRECTION: mpcd does NOT provide bls12-381 threshold aggregation. There
# is no BLS signing session (only CGGMP21/FROST/LSS), so this deployment
# cannot threshold-sign bls12-381. Lux consensus BLS is a NATIVE
# per-validator bls12-381 key (PoP + aggregation) held by the validator
# itself, never threshold-custodied by this service. Validator signing that
# IS custodied here is secp256k1/CGGMP21 threshold ECDSA (see `ecdsa`).
bls:
curve: "secp256k1"
protocol: "CGGMP21"
chains:
- { network: "LUX", name: "Lux validator ECDSA (bridge/custody signing — NOT consensus)" }
notes: "secp256k1 threshold ECDSA. NOT bls12-381 aggregation; consensus BLS is native, not custodied here."
frost_taproot:
curve: "secp256k1"
protocol: "FROST"
chains:
- { network: "BTC", name: "Bitcoin Taproot (BIP-340/341)" }
safe_verifiable: true
notes: "On-chain FROST.sol verification via ecrecover trick"
lss:
curve: "secp256k1"
protocol: "LSS"
chains:
- { network: "BTC", name: "Bitcoin (dynamic resharing)" }
- { network: "ETH", name: "Ethereum (dynamic resharing)" }
notes: "Supports t/n changes without key regeneration"
# DKG generates keys for ALL protocols in a single ceremony.
# Each wallet gets: ECDSA + EdDSA + SR25519 + BLS key shares.
# Protocol selection is automatic based on target chain (see GetNetworkKeyType).
#
# Chain → Protocol mapping:
# BTC (legacy/segwit) → CGGMP21 (secp256k1)
# BTC (taproot) → FROST (secp256k1, BIP-340)
# ETH / all EVM → CGGMP21 (secp256k1)
# LUX C/X/P → CGGMP21 (secp256k1)
# LUX consensus → BLS-Threshold (bls12-381)
# SOL → FROST (ed25519)
# TON → FROST (ed25519)
# XRPL → CGGMP21 (secp256k1)
# DOT / KSM → FROST (ristretto255/sr25519)
# Any + resharing → LSS (secp256k1)