mirror of
https://github.com/luxfi/mpc.git
synced 2026-09-24 00:26:24 +00:00
Consolidate the hanzoai/mpc repo into luxfi/mpc (the canonical, deployed MPC — v1.16.0, running as ghcr.io/luxfi/mpc across all clusters). hanzoai/mpc (legacy v1.0.6) carried 5 chain-specific threshold-signing examples luxfi/mpc lacked; they already import github.com/luxfi/mpc/pkg/threshold, so this is a clean port. hanzoai/mpc is being archived — nothing imports it and the deployments already run luxfi/mpc.
240 lines
7.9 KiB
Go
240 lines
7.9 KiB
Go
// Copyright (c) 2024-2025 Hanzo AI Inc.
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// TFHE (Threshold Fully Homomorphic Encryption) Example
|
|
// Demonstrates FHE computations on encrypted data with threshold decryption
|
|
package main
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"log"
|
|
"math/big"
|
|
)
|
|
|
|
func main() {
|
|
fmt.Println("=== TFHE (Threshold Fully Homomorphic Encryption) Example ===")
|
|
fmt.Println()
|
|
|
|
// Note: This example demonstrates the concepts and API usage.
|
|
// Full TFHE requires the luxfi/fhe package to be properly configured.
|
|
|
|
// Define MPC nodes with 2-of-3 threshold
|
|
partyIDs := []string{"node1", "node2", "node3"}
|
|
thresholdValue := 1 // 2-of-3 threshold (t+1 signers required)
|
|
|
|
fmt.Println("1. TFHE Key Generation (Threshold)")
|
|
fmt.Println(" Protocol: Threshold FHE Key Generation")
|
|
fmt.Println(" Use case: Distributed encryption/decryption with computation")
|
|
fmt.Println()
|
|
|
|
// Simulate TFHE key generation
|
|
tfheKeyGen := &TFHEKeyGenSession{
|
|
PartyIDs: partyIDs,
|
|
Threshold: thresholdValue,
|
|
SessionID: generateSessionID(),
|
|
}
|
|
|
|
fmt.Printf(" ✓ Session ID: %s\n", tfheKeyGen.SessionID[:16]+"...")
|
|
fmt.Printf(" ✓ Parties: %v\n", tfheKeyGen.PartyIDs)
|
|
fmt.Printf(" ✓ Threshold: %d-of-%d\n", thresholdValue+1, len(partyIDs))
|
|
fmt.Println()
|
|
|
|
// Example 2: Encrypted Computation
|
|
fmt.Println("2. Homomorphic Computation Example")
|
|
fmt.Println(" Operation: Encrypted addition and multiplication")
|
|
fmt.Println()
|
|
|
|
// Simulate encrypted values
|
|
plaintext1 := big.NewInt(42)
|
|
plaintext2 := big.NewInt(17)
|
|
|
|
// In real TFHE, these would be ciphertexts
|
|
encrypted1 := simulateEncrypt(plaintext1)
|
|
encrypted2 := simulateEncrypt(plaintext2)
|
|
|
|
fmt.Printf(" ✓ Value 1 (plaintext): %d\n", plaintext1)
|
|
fmt.Printf(" ✓ Value 2 (plaintext): %d\n", plaintext2)
|
|
fmt.Printf(" ✓ Encrypted 1: %s...\n", hex.EncodeToString(encrypted1[:16]))
|
|
fmt.Printf(" ✓ Encrypted 2: %s...\n", hex.EncodeToString(encrypted2[:16]))
|
|
fmt.Println()
|
|
|
|
// Homomorphic operations (simulated)
|
|
encryptedSum := simulateHomomorphicAdd(encrypted1, encrypted2)
|
|
encryptedProduct := simulateHomomorphicMul(encrypted1, encrypted2)
|
|
|
|
fmt.Printf(" ✓ Encrypted Sum: %s...\n", hex.EncodeToString(encryptedSum[:16]))
|
|
fmt.Printf(" ✓ Encrypted Product: %s...\n", hex.EncodeToString(encryptedProduct[:16]))
|
|
fmt.Println()
|
|
|
|
// Example 3: Threshold Decryption
|
|
fmt.Println("3. Threshold Decryption")
|
|
fmt.Printf(" Requires %d-of-%d parties to decrypt\n", thresholdValue+1, len(partyIDs))
|
|
fmt.Println()
|
|
|
|
// Simulate partial decryption shares
|
|
share1 := generateDecryptionShare("node1")
|
|
share2 := generateDecryptionShare("node2")
|
|
|
|
fmt.Printf(" ✓ Decryption share from node1: %s...\n", hex.EncodeToString(share1[:16]))
|
|
fmt.Printf(" ✓ Decryption share from node2: %s...\n", hex.EncodeToString(share2[:16]))
|
|
fmt.Printf(" ✓ Threshold met (2 of 3 shares)\n")
|
|
fmt.Printf(" ✓ Decrypted sum would be: %d\n", plaintext1.Int64()+plaintext2.Int64())
|
|
fmt.Printf(" ✓ Decrypted product would be: %d\n", plaintext1.Int64()*plaintext2.Int64())
|
|
fmt.Println()
|
|
|
|
// Example 4: Private Smart Contract Execution
|
|
fmt.Println("4. Private Smart Contract Execution")
|
|
fmt.Println(" Use case: Confidential DeFi transactions")
|
|
fmt.Println()
|
|
|
|
contract := &PrivateContract{
|
|
Name: "ConfidentialSwap",
|
|
InputTypes: []string{"encrypted_amount", "encrypted_price"},
|
|
OutputTypes: []string{"encrypted_result"},
|
|
}
|
|
|
|
fmt.Printf(" ✓ Contract: %s\n", contract.Name)
|
|
fmt.Printf(" ✓ Inputs: %v\n", contract.InputTypes)
|
|
fmt.Printf(" ✓ Outputs: %v\n", contract.OutputTypes)
|
|
fmt.Printf(" ✓ Computation runs on encrypted data\n")
|
|
fmt.Printf(" ✓ Only threshold parties can decrypt result\n")
|
|
fmt.Println()
|
|
|
|
// Example 5: Encrypted Database Query
|
|
fmt.Println("5. Encrypted Database Query")
|
|
fmt.Println(" Use case: Private data analytics")
|
|
fmt.Println()
|
|
|
|
query := &EncryptedQuery{
|
|
Operation: "SUM",
|
|
Column: "encrypted_balance",
|
|
Filter: "encrypted_age > threshold",
|
|
}
|
|
|
|
fmt.Printf(" ✓ Query: %s(%s) WHERE %s\n", query.Operation, query.Column, query.Filter)
|
|
fmt.Printf(" ✓ Database never sees plaintext values\n")
|
|
fmt.Printf(" ✓ Result is encrypted, needs threshold decryption\n")
|
|
fmt.Println()
|
|
|
|
// TFHE capabilities
|
|
fmt.Println("=== TFHE Capabilities ===")
|
|
capabilities := []struct {
|
|
name string
|
|
desc string
|
|
}{
|
|
{"Threshold Key Generation", "Distributed key generation with no single party holding full key"},
|
|
{"Homomorphic Addition", "Add encrypted values without decryption"},
|
|
{"Homomorphic Multiplication", "Multiply encrypted values without decryption"},
|
|
{"Threshold Decryption", "t-of-n parties required to decrypt results"},
|
|
{"Bootstrapping", "Refresh ciphertexts to enable unlimited operations"},
|
|
{"SIMD Operations", "Parallel operations on encrypted vectors"},
|
|
}
|
|
for _, cap := range capabilities {
|
|
fmt.Printf(" ✓ %s\n %s\n", cap.name, cap.desc)
|
|
}
|
|
fmt.Println()
|
|
|
|
// Use cases
|
|
fmt.Println("=== TFHE Use Cases ===")
|
|
useCases := []struct {
|
|
name string
|
|
desc string
|
|
}{
|
|
{"Private DeFi", "Confidential swaps, lending, and trading"},
|
|
{"Healthcare", "Compute on encrypted patient data"},
|
|
{"Finance", "Risk analysis on encrypted portfolios"},
|
|
{"Voting", "Verifiable elections with voter privacy"},
|
|
{"ML/AI", "Private inference on encrypted models"},
|
|
{"Supply Chain", "Track goods without revealing business data"},
|
|
}
|
|
for _, uc := range useCases {
|
|
fmt.Printf(" ✓ %s: %s\n", uc.name, uc.desc)
|
|
}
|
|
fmt.Println()
|
|
|
|
fmt.Println("=== TFHE + MPC Benefits ===")
|
|
fmt.Println(" • Computation on encrypted data (FHE)")
|
|
fmt.Println(" • No single point of decryption (threshold)")
|
|
fmt.Println(" • Key shares distributed across parties")
|
|
fmt.Println(" • Verifiable computation results")
|
|
fmt.Println(" • Post-quantum security (lattice-based)")
|
|
fmt.Println(" • Integration with blockchain for trustless execution")
|
|
fmt.Println()
|
|
fmt.Println("✅ TFHE threshold computation ready!")
|
|
}
|
|
|
|
// TFHEKeyGenSession represents a threshold FHE key generation session
|
|
type TFHEKeyGenSession struct {
|
|
PartyIDs []string
|
|
Threshold int
|
|
SessionID string
|
|
}
|
|
|
|
// PrivateContract represents a confidential smart contract
|
|
type PrivateContract struct {
|
|
Name string
|
|
InputTypes []string
|
|
OutputTypes []string
|
|
}
|
|
|
|
// EncryptedQuery represents a query on encrypted data
|
|
type EncryptedQuery struct {
|
|
Operation string
|
|
Column string
|
|
Filter string
|
|
}
|
|
|
|
// generateSessionID creates a random session identifier
|
|
func generateSessionID() string {
|
|
b := make([]byte, 32)
|
|
_, err := rand.Read(b)
|
|
if err != nil {
|
|
log.Fatalf("Failed to generate session ID: %v", err)
|
|
}
|
|
return hex.EncodeToString(b)
|
|
}
|
|
|
|
// simulateEncrypt simulates FHE encryption (placeholder)
|
|
func simulateEncrypt(plaintext *big.Int) []byte {
|
|
// In real TFHE, this would produce a ciphertext
|
|
// Here we just create a deterministic "encrypted" representation
|
|
result := make([]byte, 64)
|
|
copy(result[:], plaintext.Bytes())
|
|
// Add some "noise" to simulate encryption
|
|
noise := make([]byte, 32)
|
|
rand.Read(noise)
|
|
copy(result[32:], noise)
|
|
return result
|
|
}
|
|
|
|
// simulateHomomorphicAdd simulates homomorphic addition
|
|
func simulateHomomorphicAdd(a, b []byte) []byte {
|
|
result := make([]byte, 64)
|
|
// In real TFHE, this would be actual homomorphic addition
|
|
for i := 0; i < len(a) && i < len(result); i++ {
|
|
result[i] = a[i] ^ b[i] // XOR as placeholder
|
|
}
|
|
return result
|
|
}
|
|
|
|
// simulateHomomorphicMul simulates homomorphic multiplication
|
|
func simulateHomomorphicMul(a, b []byte) []byte {
|
|
result := make([]byte, 64)
|
|
// In real TFHE, this would be actual homomorphic multiplication
|
|
for i := 0; i < len(a) && i < len(result); i++ {
|
|
result[i] = a[i] & b[i] // AND as placeholder
|
|
}
|
|
return result
|
|
}
|
|
|
|
// generateDecryptionShare generates a simulated decryption share
|
|
func generateDecryptionShare(nodeID string) []byte {
|
|
share := make([]byte, 32)
|
|
rand.Read(share)
|
|
// Include node ID in the share for demonstration
|
|
copy(share[:len(nodeID)], []byte(nodeID))
|
|
return share
|
|
}
|