Files
mpc/docs/INSTALLATION.md
T
zeekay e32d6d0c56 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

5.1 KiB

MPC Installation Guide

Prerequisites

Before starting, ensure you have:

  • Go 1.23+ installed: Install Go here
  • NATS server running
  • Consul server running

Clone and Install MPC

Clone the Repository

git clone https://github.com/luxfi/mpc.git
cd mpc

Build the Project

With Make:

make

Or with Go:

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:

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

docker compose up -d

Generate Peer Configuration

mpc generate-peers -n 3

Example output:

{
  "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

cp config.yaml.template config.yaml

Edit config.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"
< /dev/urandom tr -dc 'A-Za-z0-9!@#$^&*()-_=+[]{}|;:,.<>?/~' | head -c 16; echo

Example:

badger_password: "F))ysJp?E]ol&I;^"

2. Register Peers to Consul

mpc register-peers

Event Initiator Setup

Generate the Initiator

mpc generate-initiator

💡 Use --encrypt in production.

Add Public Key to config.yaml

From event_initiator.identity.json:

{
  "public_key": "09be5d070816aadaa1b6638cad33e819a8aed7101626f6bf1e0b427412c3408a"
}

Update config.yaml:

event_initiator_pubkey: "09be5d070816aadaa1b6638cad33e819a8aed7101626f6bf1e0b427412c3408a"

Configure Node Identities

1. Create Node Folders

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:

cd node0
mpc generate-identity --node node0

💡 For production, use encryption:

mpc generate-identity --node node0 --encrypt

Generate Strong Password for Encryption

< /dev/urandom tr -dc 'A-Za-z0-9!@#$^&*()-_=+[]{}|;:,.<>?/~' | head -c 16; echo

3. Distribute Identity Files to All Nodes

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:

cd node0
lux-mpc start -n node0
cd node1
lux-mpc start -n node1
cd node2
lux-mpc start -n node2

💡 In production, avoid hardcoded passwords:

lux-mpc start -n node0 --prompt-credentials

All node ready


Production Deployment (High Security)

  1. Use production-grade NATS and Consul clusters.
  2. Enable TLS certificates on all endpoints.
  3. Encrypt all keys:
    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