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 and proving assets
โ”‚   โ”‚   โ”œโ”€โ”€ client_circuits/ # zk-STARK/PySNARK client circuits
โ”‚   โ”‚   โ””โ”€โ”€ server/      # zk-SNARK (Circom) server circuits
โ”œโ”€โ”€ 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.22.dev1.tar.gz (4.8 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.22.dev1-py3-none-any.whl (4.8 MB view details)

Uploaded Python 3

File details

Details for the file secure_fl-2026.2.22.dev1.tar.gz.

File metadata

  • Download URL: secure_fl-2026.2.22.dev1.tar.gz
  • Upload date:
  • Size: 4.8 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.22.dev1.tar.gz
Algorithm Hash digest
SHA256 51254ad011e3f86d48b5a0943903a7248f2d8ec46e39fd3009b353b063f10ace
MD5 32ab19c841953fba3050d8b17c17c717
BLAKE2b-256 d6d6c0f8354e70016b9e12609e90d65b910a7020bad690ec748fb4b54980b868

See more details on using hashes here.

File details

Details for the file secure_fl-2026.2.22.dev1-py3-none-any.whl.

File metadata

  • Download URL: secure_fl-2026.2.22.dev1-py3-none-any.whl
  • Upload date:
  • Size: 4.8 MB
  • 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.22.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 e37e683de65366d33010bd07a1f921312ba66f75a85597d2a17de0bb861615b3
MD5 edd30cf831c83d19c080c658094857e0
BLAKE2b-256 7c97c0497869af58552ca39c13e1d8aebb0aa46725f39df1dc4c5fc0b86e3f11

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