Files
mpc/README.md
T
zeekay ab1fec5d1f neutral: drop 'Lux'/'Hanzo' brand prefixes in user-facing strings
MPC and KMS are protocols, not products. The Go module path
github.com/luxfi/mpc remains canonical (location), but user-facing
strings (--help, README, comments, banners) are brand-neutral.
'Lux MPC' → 'MPC', 'Lux KMS' → 'KMS', 'Hanzo MPC' → 'MPC'.
2025-12-28 15:34:18 -08:00

187 lines
6.5 KiB
Markdown

# MPC
Threshold signing engine -- CGGMP21 (ECDSA), FROST (EdDSA), BLS, and SR25519. No full private key reconstruction, ever.
```
go get github.com/luxfi/mpc
```
## Architecture
`luxfi/mpc` is a production MPC node (`mpcd`) that performs distributed key generation and threshold signing across a cluster. Each node holds a key share; `t` of `n` nodes must cooperate to produce a signature. The full private key never exists on any single machine, in memory or on disk.
### Protocols
| Protocol | Curve | Key Type | Use |
|----------|-------|----------|-----|
| CGGMP21 | secp256k1 | `secp256k1` | Bitcoin, Ethereum, Lux C-Chain, all EVM L2s, XRPL |
| FROST | Ed25519 | `ed25519` | Solana, TON, Polkadot, Cardano, Substrate chains |
| BLS | BLS12-381 | `bls` | Lux consensus, beacon chain, aggregated signatures |
| SR25519 | Ristretto255 | `sr25519` | Substrate/Polkadot native |
### Threshold Model
```
t >= floor(n/2) + 1
```
A 2-of-3 cluster tolerates 1 compromised or offline node. A 3-of-5 cluster tolerates 2. The threshold is configurable at key generation time.
### Transport Modes
**Consensus (default)**: Peer-to-peer ZAP protocol with built-in PoA consensus. No external dependencies. Nodes discover each other via `--peer` flags. This is the production path.
**Legacy**: NATS pub/sub + Consul service discovery. Deprecated but still supported via `--mode=legacy`.
### Packages
```
cmd/mpcd/ Daemon binary (CLI, API server, node lifecycle)
pkg/mpc/ Core MPC node -- session management, key generation, signing
keygen_session.go CGGMP21 distributed key generation
signing_session.go CGGMP21 threshold signing (secp256k1)
signing_session_frost.go FROST threshold signing (Ed25519)
bls_keygen_session.go BLS key generation
bls_signing_session.go BLS threshold signing
sr25519_keygen_session.go SR25519 key generation
sr25519_signing_session.go SR25519 threshold signing
reshare_session.go Key resharing (rotate shares without changing public key)
recovery.go Key share recovery
tfhe_session.go FHE threshold decryption sessions
pkg/api/ HTTP API (key generation, signing, key info, health)
pkg/transport/ P2P transport (consensus mode ZAP, legacy NATS)
pkg/messaging/ PubSub abstraction over transport layer
pkg/db/ Key share storage (SQLite default, PostgreSQL optional)
pkg/kvstore/ Encrypted key-value store (AES-256, age encryption)
pkg/keyinfo/ Key metadata management
pkg/identity/ Node identity (Ed25519 keypair, mutual authentication)
pkg/backup/ Encrypted periodic backups
pkg/encryption/ AES-256-GCM encryption for key material at rest
pkg/kms/ KMS integration for secret management
pkg/hsm/ HSM provider abstraction (env, AWS, GCP)
pkg/client/ Go client library for MPC API
pkg/event/ Event types (keygen, sign, reshare)
pkg/eventconsumer/ Event processing pipeline
pkg/protocol/ Wire protocol messages
pkg/settlement/ Trade settlement signing
pkg/smart/ Smart contract transaction construction
pkg/custody/ Custody policy engine
pkg/integrity/ Key share integrity verification
pkg/txtracker/ Transaction lifecycle tracking
```
### Security Properties
- Key shares encrypted at rest with AES-256-GCM (key from HSM/KMS)
- Inter-node messages authenticated with Ed25519 signatures
- No key share leaves the node unencrypted
- Resharing rotates shares without changing the public key or requiring all nodes
- Backup files encrypted with age (modern, audited encryption)
- Secret key bytes zeroed from memory after use (`pkg/mpc/secret.go`)
## Quick Start
### Consensus Mode (recommended)
```bash
# Node 0
mpcd start --node-id node0 --listen :9999 --api :9800 \
--threshold 2 --peer node1:9999 --peer node2:9999
# Node 1
mpcd start --node-id node1 --listen :9999 --api :9801 \
--threshold 2 --peer node0:9999 --peer node2:9999
# Node 2
mpcd start --node-id node2 --listen :9999 --api :9802 \
--threshold 2 --peer node0:9999 --peer node1:9999
```
### Generate a Wallet
```bash
curl -X POST http://localhost:9800/v1/keygen \
-H "Content-Type: application/json" \
-d '{"wallet_id": "w-001", "key_type": "secp256k1"}'
```
### Sign a Transaction
```bash
curl -X POST http://localhost:9800/v1/sign \
-H "Content-Type: application/json" \
-d '{"wallet_id": "w-001", "message": "0xdeadbeef...", "key_type": "secp256k1"}'
```
### Go Client
```go
import "github.com/luxfi/mpc/pkg/client"
c := client.New("http://localhost:9800")
result, err := c.CreateWallet("w-001", "secp256k1")
sig, err := c.Sign("w-001", txHash, "secp256k1")
```
## Configuration
`config.yaml` or environment variables (`LUX_MPC_*`):
```yaml
mode: consensus
environment: local # mainnet | testnet | local
mpc_threshold: 2
max_concurrent_keygen: 2
db_path: "." # SQLite (default), or postgres:// URL
backup_enabled: true
backup_period_seconds: 300
backup_dir: backups
```
All secrets are sourced from KMS via `--hsm-provider=env|aws|gcp`. No plaintext secrets in config.
## Deployment
### Docker Compose
```bash
docker compose up
```
### Kubernetes
```bash
cd k8s && kubectl kustomize . | kubectl apply -f -
```
K8s manifests are in `k8s/` with Kustomize overlays. Production deployment uses `cloudbuild.yaml` for CI/CD to GHCR.
## Testing
```bash
go test ./... # 331 test functions
# End-to-end (3-node cluster)
cd e2e && make test
```
## Papers
- [Lux Threshold MPC](https://github.com/luxfi/papers/blob/main/lux-threshold-mpc.pdf) -- protocol specification, security proofs
- [Lux LSS MPC](https://github.com/luxfi/papers/blob/main/lux-lss-mpc.pdf) -- linear secret sharing in MPC
- [Lux Validator MPC](https://github.com/luxfi/papers/blob/main/lux-validator-mpc.pdf) -- MPC integration with validator nodes
- [Lux HSM Boundary](https://github.com/luxfi/papers/blob/main/lux-hsm-boundary.pdf) -- HSM trust boundary analysis
- [Lux FHE MPC Hybrid](https://github.com/luxfi/papers/blob/main/lux-fhe-mpc-hybrid.pdf) -- FHE threshold decryption via MPC
- [Lux M-Chain MPC](https://github.com/luxfi/papers/blob/main/lux-mchain-mpc.pdf) -- MPC chain architecture
## Dependencies
- [`luxfi/threshold`](https://github.com/luxfi/threshold) -- CGGMP21 and FROST protocol implementations
- [`luxfi/fhe`](https://github.com/luxfi/fhe) -- FHE threshold decryption sessions
- [`luxfi/hsm`](https://github.com/luxfi/hsm) -- HSM abstraction layer
- [`hanzoai/base`](https://github.com/hanzoai/base) -- Application framework
## License
Lux Ecosystem License v1.2. See [LICENSE](LICENSE).