Skip to main content

Dual-Verifiable Framework for Federated Learning using Zero-Knowledge Proofs

Project description

๐Ÿ” Secure FL: Zero-Knowledge Federated Learning

A dual-verifiable framework for federated learning using zero-knowledge proofs to ensure training integrity and aggregation correctness.

๐ŸŽฏ Core Features

  • Dual ZKP Verification: Client-side zk-STARKs + Server-side zk-SNARKs
  • FedJSCM Aggregation: Momentum-based federated optimization
  • Dynamic Proof Rigor: Adaptive proof complexity based on training stability
  • Parameter Quantization: ZKP-compatible weight compression

๐Ÿ—๏ธ Architecture

Client Training + zk-STARK Proof โ†’ FL Server + zk-SNARK Proof โ†’ Verified Model

The system provides dual verification:

  1. Clients generate zk-STARK proofs of correct local training
  2. Server generates zk-SNARK proofs of correct aggregation

๐Ÿš€ Quick Start

Installation

# Install the package with uv (recommended)
uv pip install secure-fl

# Or install from source with uv
git clone https://github.com/krishantt/secure-fl
cd secure-fl
uv pip install -e .

# For development with all dependencies
uv sync --all-extras

ZKP Prerequisites

Install zero-knowledge proof tools:

# Automated setup with make (recommended)
make setup-zkp

# Or manual setup:
# 1. Install Rust
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

# 2. Install Circom
git clone https://github.com/iden3/circom.git
cd circom && cargo install --path circom

# 3. Install SnarkJS
npm install -g snarkjs

# Verify setup
uv run secure-fl check-zkp

Basic Usage

Server

from secure_fl import SecureFlowerServer, create_server_strategy
import torch.nn as nn

# Define model
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(784, 10)
    
    def forward(self, x):
        return self.fc(x.view(-1, 784))

# Create server with ZKP verification
strategy = create_server_strategy(
    model_fn=SimpleModel,
    enable_zkp=True,
    proof_rigor="high"
)

server = SecureFlowerServer(strategy=strategy)
server.start(num_rounds=10)

Configuration

Create and use a configuration file:

# Create example config
uv run secure-fl create-config

# Edit config.yaml as needed
# Then use it:

Client

from secure_fl import create_client, start_client
from torchvision import datasets, transforms

# Load data
transform = transforms.Compose([transforms.ToTensor()])
dataset = datasets.MNIST('./data', train=True, transform=transform)

# Create secure client
client = create_client(
    client_id="client_1",
    model_fn=SimpleModel,
    train_data=dataset,
    enable_zkp=True
)

# Connect to server
start_client(client, "localhost:8080")

CLI Interface

# Start server
uv run secure-fl-server --config config.yaml

# Start client  
uv run secure-fl-client --server localhost:8080 --dataset mnist --client-id client_1

# Check system status
uv run secure-fl check-zkp

๐Ÿ”ฌ Technical Details

Zero-Knowledge Proofs

  • Client-side (zk-STARKs): Prove correct SGD computation using Cairo circuits
  • Server-side (zk-SNARKs): Prove correct FedJSCM aggregation using Circom circuits

FedJSCM Aggregation

Momentum-based federated averaging:

w_{t+1} = w_t - ฮท_g * (ฮฒ * m_t + (1-ฮฒ) * โˆ‡F_t)

where โˆ‡F_t is the federated gradient and m_t is the momentum buffer.

Dynamic Proof Rigor

Automatically adjusts ZKP complexity based on training stability:

  • High stability: Reduced proof complexity for efficiency
  • Low stability: Increased proof rigor for security

๐Ÿ“Š Configuration

Create a config.yaml:

server:
  host: "localhost"
  port: 8080
  num_rounds: 10

strategy:
  min_fit_clients: 2
  fraction_fit: 1.0
  momentum: 0.9

zkp:
  enable_zkp: true
  proof_rigor: "high"
  quantize_weights: true
  quantization_bits: 8

๐Ÿ”ง Development

Setup Development Environment

git clone https://github.com/krishantt/secure-fl
cd secure-fl

# Complete development setup
make dev

# Or manually with uv
uv sync --all-extras
make setup-zkp

Development Commands

# Run tests
make test
make test-quick      # Fast tests with early exit
make test-cov        # With coverage report

# Code quality
make lint           # Check with ruff
make format         # Format code
make type-check     # Run mypy
make check          # All quality checks

# Development workflow
make demo           # Run demonstration
make clean          # Clean artifacts

Docker (Minimal)

# Build image
docker build -t secure-fl:local .

# Start local FL stack
docker compose up -d

# Stop services
docker compose down

๐Ÿ“ˆ Experiments

Run benchmarks and experiments:

# Basic demo
make demo
# or: uv run python experiments/demo.py

# Reproducible benchmark suite
uv run python experiments/canonical_benchmark.py --datasets mnist synthetic_small --num-repeats 5 --require-real-proofs

# Custom training
uv run python experiments/train.py --config experiments/config.yaml

# Check environment
make env-info

๐Ÿท๏ธ Repository Structure

secure-fl/
โ”œโ”€โ”€ src/secure_fl/       # Main package
โ”‚   โ”œโ”€โ”€ federation/      # FL clients, server, and aggregation strategy
โ”‚   โ”œโ”€โ”€ zkp/             # ZKP managers and quantization
โ”‚   โ”œโ”€โ”€ models/          # Model definitions (MNIST/CIFAR/ResNet/MLP)
โ”‚   โ”œโ”€โ”€ core/            # Types, config, exceptions, versioning
โ”‚   โ”œโ”€โ”€ cli/             # CLI commands and setup helpers
โ”‚   โ””โ”€โ”€ utils/           # Logging and helper utilities
โ”œโ”€โ”€ proofs/              # ZKP circuits
โ”‚   โ”œโ”€โ”€ client_circuits/ # zk-STARK (Cairo)
โ”‚   โ””โ”€โ”€ server/          # zk-SNARK (Circom)
โ”œโ”€โ”€ experiments/         # Research experiments
โ”œโ”€โ”€ tests/               # Test suite
โ””โ”€โ”€ docs/                # Documentation

๐Ÿค Contributing

  1. Fork the repository
  2. Set up development environment: make dev
  3. Create a feature branch
  4. Make your changes with proper type hints
  5. Add tests and ensure coverage
  6. Run quality checks: make check
  7. Test your changes: make test
  8. Submit a pull request

Code Style

  • Use type hints throughout
  • Follow the established error handling patterns
  • Add proper logging with context
  • Write tests for new functionality
  • Update documentation as needed

๐Ÿ“„ License

MIT License - see LICENSE for details.

๐Ÿ“š Citation

@misc{timilsina2024secure,
  title={Secure FL: Dual-Verifiable Framework for Federated Learning using Zero-Knowledge Proofs},
  author={Timilsina, Krishant and Paudel, Bindu},
  year={2024},
  url={https://github.com/krishantt/secure-fl}
}

๐Ÿ™ Acknowledgments

  • Flower framework for federated learning infrastructure
  • Circom and Cairo for zero-knowledge proof systems
  • The federated learning and cryptography research communities

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

secure_fl-2026.2.20.dev5.tar.gz (4.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

secure_fl-2026.2.20.dev5-py3-none-any.whl (78.6 kB view details)

Uploaded Python 3

File details

Details for the file secure_fl-2026.2.20.dev5.tar.gz.

File metadata

  • Download URL: secure_fl-2026.2.20.dev5.tar.gz
  • Upload date:
  • Size: 4.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for secure_fl-2026.2.20.dev5.tar.gz
Algorithm Hash digest
SHA256 89649249a7ba903a018523cf0f84229ba379eac7869d577acef8d5b420b113b6
MD5 ff1ede59b1e84bd063e299acfdc33ffe
BLAKE2b-256 5b6e82d67894830d806178c995a7babead5ab3a2ce64d9bf2e1de5fb38eb3c71

See more details on using hashes here.

File details

Details for the file secure_fl-2026.2.20.dev5-py3-none-any.whl.

File metadata

  • Download URL: secure_fl-2026.2.20.dev5-py3-none-any.whl
  • Upload date:
  • Size: 78.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for secure_fl-2026.2.20.dev5-py3-none-any.whl
Algorithm Hash digest
SHA256 a3746cba9577c5e3de5c48d43423ed9e326ddf2bbde9db74db94da5ce8dbef80
MD5 a655d37650b78254d43d08ccdbcd1e2f
BLAKE2b-256 d1dd4f16bc148b7b275a5568719e55527e8d6f36dad1b040442f301ad9d79acc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page