296 lines
No EOL
7.4 KiB
Bash
296 lines
No EOL
7.4 KiB
Bash
#!/bin/bash
|
|
|
|
# License Verification ZKP System - Setup Script
|
|
set -e
|
|
|
|
echo "======================================"
|
|
echo "License Verification ZKP System Setup"
|
|
echo "======================================"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Check prerequisites
|
|
echo -e "\n${YELLOW}Checking prerequisites...${NC}"
|
|
|
|
if ! command -v docker &> /dev/null; then
|
|
echo -e "${RED}Docker is not installed. Please install Docker first.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v docker compose &> /dev/null; then
|
|
echo -e "${RED}Docker Compose is not installed. Please install Docker Compose first.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}✓ Docker and Docker Compose found${NC}"
|
|
|
|
# Create directory structure
|
|
echo -e "\n${YELLOW}Creating directory structure...${NC}"
|
|
|
|
mkdir -p db/init
|
|
mkdir -p zkp-service/src
|
|
mkdir -p zkp-service/circuits
|
|
mkdir -p zkp-service/keys
|
|
mkdir -p zkp-service/scripts
|
|
mkdir -p merkle-service/src
|
|
mkdir -p test-frontend/src
|
|
mkdir -p monitoring
|
|
|
|
echo -e "${GREEN}✓ Directories created${NC}"
|
|
|
|
# Create environment file
|
|
echo -e "\n${YELLOW}Creating environment configuration...${NC}"
|
|
|
|
cat > .env << 'EOF'
|
|
# Database Configuration
|
|
POSTGRES_USER=license_admin
|
|
POSTGRES_PASSWORD=secure_license_pass_123
|
|
POSTGRES_DB=license_verification
|
|
DATABASE_URL=postgresql://license_admin:secure_license_pass_123@postgres:5432/license_verification
|
|
|
|
# ZKP Service Configuration
|
|
CIRCUIT_PATH=/app/circuits
|
|
PROVING_KEYS_PATH=/app/keys
|
|
NODE_ENV=development
|
|
LOG_LEVEL=info
|
|
|
|
# Merkle Tree Configuration
|
|
TREE_DEPTH=17
|
|
UPDATE_INTERVAL=3600
|
|
|
|
# Redis Configuration
|
|
REDIS_URL=redis://redis:6379
|
|
|
|
# Service Ports
|
|
ZKP_PORT=8080
|
|
MERKLE_PORT=8082
|
|
FRONTEND_PORT=3000
|
|
EOF
|
|
|
|
echo -e "${GREEN}✓ Environment file created${NC}"
|
|
|
|
# Create simple Circom circuit for testing
|
|
echo -e "\n${YELLOW}Creating test circuit...${NC}"
|
|
|
|
cat > zkp-service/circuits/license_verification.circom << 'EOF'
|
|
pragma circom 2.0.0;
|
|
|
|
include "../../node_modules/circomlib/circuits/poseidon.circom";
|
|
include "../../node_modules/circomlib/circuits/comparators.circom";
|
|
|
|
template LicenseVerification() {
|
|
// Simple version for testing - expand for production
|
|
signal input licenseNumber;
|
|
signal input expiryDate;
|
|
signal input currentDate;
|
|
|
|
// Public inputs
|
|
signal input merkleRoot;
|
|
|
|
// Check if license is not expired
|
|
component notExpired = GreaterThan(32);
|
|
notExpired.in[0] <== expiryDate;
|
|
notExpired.in[1] <== currentDate;
|
|
|
|
// Output validity
|
|
signal output isValid;
|
|
isValid <== notExpired.out;
|
|
}
|
|
|
|
component main = LicenseVerification();
|
|
EOF
|
|
|
|
echo -e "${GREEN}✓ Test circuit created${NC}"
|
|
|
|
# Create circuit compilation script
|
|
echo -e "\n${YELLOW}Creating circuit compilation script...${NC}"
|
|
|
|
cat > zkp-service/scripts/compile-circuits.js << 'EOF'
|
|
#!/usr/bin/env node
|
|
|
|
const { exec } = require('child_process');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
async function compileCircuit() {
|
|
console.log('Compiling circuit...');
|
|
|
|
const circuitPath = path.join(__dirname, '../circuits/license_verification.circom');
|
|
const outputDir = path.join(__dirname, '../circuits');
|
|
|
|
// Compile circuit
|
|
exec(`circom ${circuitPath} --r1cs --wasm --sym -o ${outputDir}`, (error, stdout, stderr) => {
|
|
if (error) {
|
|
console.error(`Compilation error: ${error}`);
|
|
return;
|
|
}
|
|
console.log('Circuit compiled successfully');
|
|
console.log(stdout);
|
|
});
|
|
}
|
|
|
|
compileCircuit();
|
|
EOF
|
|
|
|
chmod +x zkp-service/scripts/compile-circuits.js
|
|
|
|
echo -e "${GREEN}✓ Compilation script created${NC}"
|
|
|
|
# Create Makefile for easy commands
|
|
echo -e "\n${YELLOW}Creating Makefile...${NC}"
|
|
|
|
cat > Makefile << 'EOF'
|
|
.PHONY: help up down logs benchmark clean reset
|
|
|
|
help:
|
|
@echo "License Verification ZKP System - Available Commands:"
|
|
@echo " make up - Start all services"
|
|
@echo " make down - Stop all services"
|
|
@echo " make logs - View logs"
|
|
@echo " make benchmark - Run performance benchmark"
|
|
@echo " make clean - Clean up containers and volumes"
|
|
@echo " make reset - Full reset (removes all data)"
|
|
@echo " make db-init - Initialize database with test data"
|
|
@echo " make compile - Compile Circom circuits"
|
|
|
|
up:
|
|
docker compose up -d
|
|
@echo "Services starting... Check status with 'docker compose ps'"
|
|
|
|
down:
|
|
docker compose down
|
|
|
|
logs:
|
|
docker compose logs -f
|
|
|
|
benchmark:
|
|
docker compose exec zkp-engine npm run benchmark
|
|
|
|
clean:
|
|
docker compose down -v
|
|
rm -rf postgres_data redis_data proving_keys
|
|
|
|
reset: clean
|
|
rm -rf zkp-service/circuits/*.r1cs
|
|
rm -rf zkp-service/circuits/*.wasm
|
|
rm -rf zkp-service/circuits/*.sym
|
|
rm -rf zkp-service/keys/*
|
|
|
|
db-init:
|
|
docker compose exec postgres psql -U license_admin -d license_verification -c "SELECT populate_test_licenses(1000);"
|
|
@echo "Database populated with 1000 test licenses"
|
|
|
|
compile:
|
|
docker compose exec zkp-engine node scripts/compile-circuits.js
|
|
|
|
monitor:
|
|
@echo "Opening monitoring dashboard at http://localhost:9090"
|
|
@xdg-open http://localhost:9090 2>/dev/null || open http://localhost:9090 2>/dev/null || echo "Please open http://localhost:9090 in your browser"
|
|
EOF
|
|
|
|
echo -e "${GREEN}✓ Makefile created${NC}"
|
|
|
|
# Create README
|
|
echo -e "\n${YELLOW}Creating README...${NC}"
|
|
|
|
cat > README.md << 'EOF'
|
|
# License Verification ZKP System - Test Environment
|
|
|
|
## Quick Start
|
|
|
|
1. **Start the system:**
|
|
```bash
|
|
make up
|
|
```
|
|
|
|
2. **Initialize test data:**
|
|
```bash
|
|
make db-init
|
|
```
|
|
|
|
3. **Run benchmarks:**
|
|
```bash
|
|
make benchmark
|
|
```
|
|
|
|
## Architecture
|
|
|
|
- **PostgreSQL**: Stores licenses and Merkle tree structure
|
|
- **ZKP Engine**: Handles proof generation and verification
|
|
- **Redis**: Caches Merkle proofs for performance
|
|
- **Merkle Service**: Manages Merkle tree updates
|
|
|
|
## Performance Expectations
|
|
|
|
Based on your simple age circuit benchmarks:
|
|
- **Proof Generation**: 3,500-4,500ms (browser)
|
|
- **Proof Verification**: 25-40ms (server)
|
|
- **Memory Usage**: 150-250MB peak during generation
|
|
|
|
## Monitoring
|
|
|
|
View real-time metrics:
|
|
```bash
|
|
curl http://localhost:8081/metrics
|
|
```
|
|
|
|
View benchmark results:
|
|
```bash
|
|
curl http://localhost:8080/api/benchmark
|
|
```
|
|
|
|
## Database Access
|
|
|
|
```bash
|
|
docker compose exec postgres psql -U license_admin -d license_verification
|
|
```
|
|
|
|
Useful queries:
|
|
```sql
|
|
-- View benchmark results
|
|
SELECT * FROM benchmark_results ORDER BY created_at DESC LIMIT 10;
|
|
|
|
-- Check Merkle tree status
|
|
SELECT * FROM merkle_tree_stats;
|
|
|
|
-- View recent verifications
|
|
SELECT * FROM verification_audit ORDER BY created_at DESC LIMIT 10;
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
If proof generation is too slow:
|
|
1. Check memory allocation: `docker stats`
|
|
2. Reduce tree depth in `.env` (affects max licenses)
|
|
3. Consider server-side proof generation
|
|
|
|
## Clean Up
|
|
|
|
```bash
|
|
make down # Stop services
|
|
make clean # Remove all data
|
|
make reset # Full system reset
|
|
```
|
|
EOF
|
|
|
|
echo -e "${GREEN}✓ README created${NC}"
|
|
|
|
# Final instructions
|
|
echo -e "\n${GREEN}======================================"
|
|
echo "Setup Complete!"
|
|
echo "======================================${NC}"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "1. Start the services: ${YELLOW}make up${NC}"
|
|
echo "2. Wait for startup: ${YELLOW}docker compose ps${NC}"
|
|
echo "3. Initialize test data: ${YELLOW}make db-init${NC}"
|
|
echo "4. Run benchmarks: ${YELLOW}make benchmark${NC}"
|
|
echo ""
|
|
echo "Monitor logs: ${YELLOW}make logs${NC}"
|
|
echo "View metrics: ${YELLOW}curl http://localhost:8081/metrics${NC}"
|
|
echo ""
|
|
echo -e "${GREEN}Ready to test your license verification system!${NC}" |