Files
mpc/docs/INSTALLATION.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

297 lines
5.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MPC Installation Guide
## Prerequisites
Before starting, ensure you have:
- **Go** 1.23+ installed: [Install Go here](https://go.dev/doc/install)
- **NATS** server running
- **Consul** server running
---
## Clone and Install MPC
### Clone the Repository
```bash
git clone https://github.com/luxfi/mpc.git
cd mpc
```
### Build the Project
With Make:
```bash
make
```
Or with Go:
```bash
go install ./cmd/lux-mpc
go install ./cmd/mpc
```
### Available Commands
- `lux-mpc`: Start a MPC node
- `mpc`: CLI utility for peer, identity, and initiator configuration
---
## Running NATS and Consul (Development Only)
> ⚠️ This setup is insecure and should only be used for development. For production, use a secure cluster environment with TLS certificates.
### Docker Compose Configuration
Create a `docker-compose.yaml` file:
```yaml
version: "3"
services:
nats-server:
image: nats:latest
container_name: nats-server
command: -js --http_port 8222
ports:
- "4222:4222"
- "8222:8222"
- "6222:6222"
tty: true
restart: always
consul:
image: consul:1.15.4
container_name: consul
ports:
- "8500:8500"
- "8601:8600/udp"
command: "agent -server -ui -node=server-1 -bootstrap-expect=1 -client=0.0.0.0"
restart: always
```
### Start the Services
```bash
docker compose up -d
```
---
## Generate Peer Configuration
```bash
mpc generate-peers -n 3
```
Example output:
```json
{
"node0": "12345678-1234-1234-1234-123456789abc",
"node1": "23456789-2345-2345-2345-23456789abcd",
"node2": "34567890-3456-3456-3456-3456789abcde"
}
```
---
## Cluster Configuration
### 1. Create and Update `config.yaml`
```bash
cp config.yaml.template config.yaml
```
Edit `config.yaml`:
```yaml
nats:
url: nats://127.0.0.1:4222
consul:
address: localhost:8500
mpc_threshold: 2
environment: development
badger_password: "your_badger_password"
event_initiator_pubkey: "your_event_initiator_pubkey"
```
### Generate a Strong Password (Recommended)
```bash
< /dev/urandom tr -dc 'A-Za-z0-9!@#$^&*()-_=+[]{}|;:,.<>?/~' | head -c 16; echo
```
Example:
```yaml
badger_password: "F))ysJp?E]ol&I;^"
```
### 2. Register Peers to Consul
```bash
mpc register-peers
```
---
## Event Initiator Setup
### Generate the Initiator
```bash
mpc generate-initiator
```
> 💡 Use `--encrypt` in production.
### Add Public Key to `config.yaml`
From `event_initiator.identity.json`:
```json
{
"public_key": "09be5d070816aadaa1b6638cad33e819a8aed7101626f6bf1e0b427412c3408a"
}
```
Update `config.yaml`:
```yaml
event_initiator_pubkey: "09be5d070816aadaa1b6638cad33e819a8aed7101626f6bf1e0b427412c3408a"
```
---
## Configure Node Identities
### 1. Create Node Folders
```bash
mkdir node{0..2}
for dir in node{0..2}; do
cp config.yaml peers.json "$dir/"
mkdir -p "$dir/identity"
done
```
### 2. Generate Identity for Each Node
Example for `node0`:
```bash
cd node0
mpc generate-identity --node node0
```
> 💡 For production, use encryption:
>
> ```bash
> mpc generate-identity --node node0 --encrypt
> ```
### Generate Strong Password for Encryption
```bash
< /dev/urandom tr -dc 'A-Za-z0-9!@#$^&*()-_=+[]{}|;:,.<>?/~' | head -c 16; echo
```
### 3. Distribute Identity Files to All Nodes
```bash
cp identity/node0_identity.json ../node1/identity/node0_identity.json
cp identity/node0_identity.json ../node2/identity/node0_identity.json
```
Repeat this for `node1` and `node2`.
### Folder Structure Example
```
├── node0
│   ├── config.yaml
│   ├── identity
│   │   ├── node0_identity.json
│   │   ├── node0_private.key
│   │   ├── node1_identity.json
│   │   └── node2_identity.json
│   └── peers.json
├── node1
│   ├── config.yaml
│   ├── identity
│   │   ├── node0_identity.json
│   │   ├── node1_identity.json
│   │   ├── node1_private.key
│   │   └── node2_identity.json
│   └── peers.json
├── node2
│   ├── config.yaml
│   ├── identity
│   │   ├── node0_identity.json
│   │   ├── node1_identity.json
│   │   ├── node2_identity.json
│   │   └── node2_private.key
│   └── peers.json
```
---
## Start MPC Nodes
Start each node:
```bash
cd node0
lux-mpc start -n node0
```
```bash
cd node1
lux-mpc start -n node1
```
```bash
cd node2
lux-mpc start -n node2
```
> 💡 In production, avoid hardcoded passwords:
>
> ```bash
> lux-mpc start -n node0 --prompt-credentials
> ```
---
![All node ready](images/all-node-ready.png)
---
## Production Deployment (High Security)
1. Use production-grade **NATS** and **Consul** clusters.
2. Enable **TLS certificates** on all endpoints.
3. Encrypt all keys:
```bash
mpc generate-initiator --encrypt
mpc generate-identity --node node0 --encrypt
```
4. Use `--prompt-credentials` to securely input Badger passwords (avoid hardcoding in `config.yaml`).
---
## Appendix
### Decrypt initiator private key with age
```
age --decrypt -o event_initiator.key event_initiator.key.age
```