This repository contains the full implementation of ZIP paper (accepted to ACM CCS 2025).
The manuscript will be available online shortly.
Warning: This code is a research prototype intended for proof-of-concept purposes only and is not ready for production use.
ZIP/
├── scripts/
└── src/
├── CNN/
│ ├── LeNet/
│ └── UTKFace_MAE/
├── LLM/
├── piecewise_polynomial_approximation
│ ├── NFGen/
│ └── precomputed_lookup_tables_ieee754/ # Precomputed lookup tables (decimal)
└── proof_generation
├── caulk/
├── ZIP_proof_generation
│ ├── precomputed_lookup_tables_ieee754_hex/ # Precomputed lookup tables (hex)
│ ├── ZIP_circuit
│ │ └── circuit
│ │ ├── linear/ # 🔶 Our linear PLONK circuits (proved via zk-Location)
│ │ └── non-linear/ # 🔶 Our non-linear PLONK circuits
│ └── ZIP_lookup # 🔶 Our multi-lookup argument
│ └── examples/ # y, y′ inputs (see Eq. (2) in the paper)
└── zk-Location/
Before running the scripts, ensure that you have the following installed:
- Python: 3.9+
- Rust: 1.72.0-nightly
- Cargo: 1.72.0-nightly (Rust package management)
- Go: go1.24.4
Note: The package commands below use Debian/Ubuntu (
apt-get
). For Fedora/RHEL, replace withdnf/yum
.
This repo uses Git Large File Storage (LFS) for the SRS files in src/proof_generation/caulk/srs
(~800 MB total).
# Install Git LFS **before** you clone:
sudo apt-get install git-lfs
# Initialize LFS hooks
git lfs install
# Normal clone
git clone https://github.com/vt-asaplab/ZIP.git
cd ZIP
sudo apt-get update
sudo apt-get install -y python3 python3-pip
# Install rustup (Rust toolchain manager)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env" # load cargo into your shell
# Install and set stable Rust globally
rustup toolchain install 1.80.1
rustup default 1.80.1
# Verify
rustc --version # should print: rustc 1.80.1 (or newer)
cargo --version
GO_VERSION=1.24.4
wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
# Add to PATH (if not already present)
echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc
# (Optional) user GOPATH for binaries you install with `go install`
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# Verify
go version # # go version go1.24.4 linux/amd64
-
Create the environment and install Python dependencies:
conda create -n zip python=3.9 -y conda activate zip
python -m pip install -U torch numpy scipy pandas scikit-learn sympy torchvision matplotlib NFGen dill chmod +x scripts/*.sh
-
Precompute piecewise polynomial approximations for the target non-linear functions
./scripts/precompute.sh
- Reproducibility note:
- To match the paper’s numbers, use hardware comparable to our reference machine:
- 48 CPU cores (Intel® Xeon® Platinum 8360Y, 2.40 GHz) and 512 GB RAM.
- The underlying PLONK prover uses all available CPU cores by default, so runtimes vary with core count.
- When running, ensure the machine is otherwise idle to obtain consistent timings.
- To match the paper’s numbers, use hardware comparable to our reference machine:
-
Generate Figure 1:
Memory requirement: ≈ 51 GB RAM (peak usage)
End-to-end runtime: ≈ 45 min (wall-clock)./scripts/fig1.sh
-
Generate Table 1 & 2:
Memory requirement: ≈ 250 GB RAM (peak usage)
End-to-end runtime: ≈ 90 min (wall-clock)./scripts/table1_2.sh
-
Generate Table 3:
Memory requirement: ≈ 7.4 GB RAM (peak usage)
End-to-end runtime: ≈ 80 min (wall-clock)./scripts/table3.sh
-
Generate Table 4:
Memory requirement: < 1 GB RAM (peak usage)
End-to-end runtime: < 1 sec (wall-clock)./scripts/table4.sh <mode> [values_dir] ["activations"] # Quiet mode (recommended): runs everything silently and prints only the totals. ./scripts/table4.sh 1 y_yprime_examples gelu # Verbose mode: shows full logs from Python/Go/Rust plus the totals at the end. ./scripts/table4.sh 0 y_yprime_examples gelu
-
Generate Table 5:
Memory requirement: ≈ 100 GB RAM (peak usage)
End-to-end runtime: ≈ 4 hr (wall-clock)./scripts/table5.sh
-
Generate Table 6:
Memory requirement: ≈ 5 GB RAM (peak usage)
End-to-end runtime: ≈ 12 min (wall-clock)
Reported metric: Table 6 reports the average over 10 runs under identical settings../scripts/table6.sh
-
Generate Table 7:
Memory requirement: ≈ 300 GB RAM (peak usage)
End-to-end runtime: ≈ 3-40 hr (wall-clock)# 1) Run the script: ./scripts/table7.sh # 2) When prompted, enter: # 0 -> prove non-linear only (~3 hr) # 1 -> prove both linear + non-linear (~40 hr)
This project builds upon and integrates several existing open-source implementations:
- gnark: Used for PLONK proving and verification.
- NFGen: Incorporated in
src/piecewise_polynomial_approximation/NFGen/
to precompute piecewise-polynomial approximations of non-linear functions. - zk-Location: Incorporated in
src/proof_generation/zk-Location
to prove IEEE-754–compliant linear operations. - caulk: Integrated into
src/proof_generation/caulk
, and we modified specific files to enable compatibility of its multi-lookup arguments with the ZIP framework.
We gratefully acknowledge the authors and maintainers of these projects for making their work available to the community.