This project aims to develop and validate Private Proof Delegation via server-side FHE-evaluated SNARKs over encrypted single-client or private shared witness and untrusted public verifiability.
- Analysis "SNARK-FHE vs FHE-SNARK for Private Proof Delegation"
- Proposal "PPD via FHE-SNARK"
- Linux amd64 / x86-64 system
- avx512 and aes instruction set extensions
- Go 1.23
- gcc g++ make cmake libgmp-dev libmpfr-dev unzip
make init-submodules build
export LD_LIBRARY_PATH=./vdec/c
go test -v -run TestLigeroPPD github.com/nulltea/lumenos/fhe
Run server:
make server
Run client
make client REMOTE_SERVER_URL=http://<IP>:8080
- BGV params based on
GenerateBGVParamsForNTT
heuristic- Plaintext prime:
144115188075593729
($2^{57} – 2^{18} + 1$ ,$57$ bits) - LogN
max(12, log2(ROWS))
(see table) - LogQ
len([58, 56, 56, ... ])=log2(nttSize)
- LogP
[55,55]
- Plaintext prime:
- Number of queries
306
(according to ref. implementation)
Dimension | 2048x1024 | 4096x2048 | 8192x4096 | 16384x4096 |
---|---|---|---|---|
LogN | 12 | 12 | 13 | 14 |
Encode eval | 5.17s | 12.63s | 1m 6.78s | 2m 22.73s |
Commit eval | 1.03s | 2.04s | 9.17s | 18.79s |
Inner product eval | 8.51s | 22.74s | 1m 49.60s | 4m 7.48s |
Query cols eval | 1.10s | 1.42s | 3.55s | 7.63s |
Prove eval total | 9.61s | 24.17s | 1m 53.16s | 4m 15.12s |
135 MB | 269 MB | 1.1 GB | 2.1 GB | |
41 MB | 41 MB | 81 MB | 162 MB | |
Proof size | 310 MB | 579 MB | 2.2 GB | 4.5 GB |
Peak RAM (GB) | 5.74 GB | 10.79 GB | 41.23 GB | 79.43 GB |
Hardware: m7i.8xlarge, 32 vCPUs 128GB RAM
Dimension | 2048x1024 | 4096x2048 | 8192x4096 | 16384x4096 |
---|---|---|---|---|
LogN | 12 | 12 | 13 | 14 |
Keys | 69 MB | 103 MB | 237 MB | 504 MB |
Encrypted proof size | 310 MB | 579 MB | 2.2 GB | 4.5 GB |
Decrypt |
95.85ms | 107.73ms | 220.10ms | 513.26ms |
Decrypt |
531.57ms | 1.05s | 4.32s | 47.53s |
Decrypt total | 627.49ms | 1.16s | 4.54s | 48.05s |
Batch ciphertexts | 239.94ms | 261.73ms | 593.67ms | 1.32s |
PoD prover | 22.96s | 22.82s | 22.82s | 22.70s |
Public verifier | 151.94ms | 197.06ms | 389.39ms | 804.64ms |
Ligero local | 3.89s | 16.81s | 1m 20.69s | 14m 21.94s |
Peak RAM (GB) | 1.05 GB | 1.83 GB | 6.34 GB | 7.18 GB |
Hardware: m7i.8xlarge, 2 vCPUs 8GB RAM
Note: for
16384x4096
, Ligero local had to tap into swap memory, which explains the sudden drop in performance. Assume that on devices where swap is unavailable, proof generation for this configuration would fail with OOM.
- Same hardware as above.
- Server performs ring switch to LogN: 10 for inner product ciphertexts
$ct[\langle r_i,M_{i,j}\rangle]$ .- Note: correct deployment requires SlotsToCoeff ("unbatching") before ring switch which is not yet implemented for BFV. Verification is skipped because of this.
- PoD prover runs optimized GBFV version vdec_gbfv.c
- Note: Lattigo currently does not support GBFV. So final PoD is partially invalid (h_our coeff check fails).
Dimension | 2048x1024 | 4096x2048 | 8192x4096 | 16384x4096 |
---|---|---|---|---|
LogN | 12 | 12 | 13 | 14 |
Encode eval | 5.16s | 12.72s | 1m 6.39s | 2m 23.12s |
Commit eval | 1.03s | 2.04s | 9.18s | 18.80s |
Inner product eval | 8.51s | 22.65s | 1m 50.17s | 4m 8.44s |
Query cols eval | 1.10s | 1.41s | 3.55s | 7.63s |
Prove eval total | 9.67s | 24.32s | 1m 53.73s | 4m 16.12s |
17 MB / -7.94x | 34 MB / -7.91x | 68 MB / -16.57x | 68 MB / -31.62x | |
41 MB | 41 MB | 81 MB | 162 MB | |
Proof size | 75 MB / -4.13x | 109 MB / -5.31x | 218 MB / -10.33x | 299 MB / -15.41x |
Peak RAM (GB) | 5.40 GB | 10.78 GB | 41.90 GB | 79.25 GB |
Dimension | 2048x1024 | 4096x2048 | 8192x4096 | 16384x4096 |
---|---|---|---|---|
LogN | 12 | 12 | 13 | 14 |
Keys | 74 MB / +1.07x | 110 MB / +1.07x | 252 MB / +1.06x | 533 MB / +1.06x |
Encrypted proof size | 75 MB | 109 MB | 218 MB | 299 MB |
Decrypt |
98.15ms | 107.52ms | 223.39ms | 483.88ms |
Decrypt |
72.35ms / -7.35x | 146.75ms / -7.15x | 284.23ms / -15.19x | 287.14ms / -165.52x |
Decrypt total | 170.58ms ~ -3.68x | 254.38ms ~ -4.56x | 507.71ms ~ -8.94x | 771.12ms ~ -62.31x |
Batch ciphertexts | 243.19ms | 269.33ms | 595.06ms | 1.26s |
PoD prover | 3.21s / -7.15x | 3.05s / -7.48x | 3.20s / -7.13x | 3.20s / -7.09x |
Public verifier | N/A | N/A | N/A | N/A |
Ligero local | 3.99s | 16.66s | 1m 20.11s | 10m 15.22s |
Peak RAM (GB) | 0.56 GB / -1.88x | 1.40 GB / -1.31x | 5.39 GB / -1.18x | 7.05 GB (≈) |
Run the server:
./scripts/benchmark_server.sh
Run the client:
REMOTE_SERVER_URL=http://<IP>:8080 ./scripts/benchmark_client.sh
Run the client with ring switch and GBFV (experimental):
RING_SWITCH_LOGN=10 IS_GBFV=true REMOTE_SERVER_URL=http://<IP>:8080 \
./scripts/benchmark_client.sh -ringSwitchLogN 10