mirror of
https://github.com/luxfi/mpc.git
synced 2026-09-24 00:26:24 +00:00
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]>
140 lines
5.1 KiB
YAML
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)
|