JavaScript and WebAssembly library for generating and verifying zkSNARK proofs with Groth16, PLONK and FFLONK, used with circom circuits.
TrustLevel/ZK-Voting-App
A privacy-preserving on-chain voting app on Cardano where voters prove membership with zero-knowledge proofs and votes stay anonymous.
- Stars
- 5
- Forks
- 4
- Open issues
- 0
- Last commit
- 3 days ago
What is it?
ZK Voting App is a voting application built on the Cardano blockchain. An organiser creates an event, invites participants by email, and publishes the voting contracts on-chain. Each participant generates a Semaphore identity in the browser and registers a public commitment, then casts a vote backed by a Groth16 zero-knowledge proof. The proof shows the voter belongs to the registered group and includes a one-time nullifier that blocks double voting, so the cast vote cannot be linked to the voter.
The app supports simple voting (one choice per person) and weighted voting (a fixed number of points spread across options). Voters need no wallet or ADA because the backend builds and submits their vote transactions. Events can run on Cardano Mainnet or the Preprod testnet, and the organiser picks the network when creating the event. Tallies are readable on-chain after the voting window closes.
The repository is organised into modules for Aiken smart contracts, a NestJS backend with SQLite and LevelDB storage, a Next.js frontend, a transaction builder, and the ZK proof module.
Key features
- 01Anonymous voting via Groth16 zero-knowledge proofs built on Semaphore
- 02One-time nullifiers prevent double voting
- 03Simple and weighted voting modes
- 04Voters need no wallet or ADA; the backend submits their transactions
- 05Final tallies are publicly verifiable on Cardano
Use cases
- Running a binding, group-closed vote where participants' choices must stay private
- Organising member votes for an organisation that wants on-chain, tamper-evident results
- Trying out anonymous on-chain voting on the Preprod testnet at no cost
Quick start
- 1
Install all workspaces
npm install - 2
Configure environment variables (backend needs a Blockfrost key and funded relay wallet)
cp src/backend/.env.example src/backend/.env && cp src/frontend/.env.example src/frontend/.env.local - 3
Start the backend on port 3000
cd src/backend && npm run start:dev - 4
Start the frontend on port 3002
cd src/frontend && npm run dev
Things to know
- Running locally requires a Blockfrost API key and a funded Preprod relay wallet.
- On Mainnet the organiser pays about 15 ADA plus fees, and a deposit of 1.3 ADA per voter.
- The install may fail without an SSH key for GitHub unless a git URL rewrite to HTTPS is set first.
In collections
Topics
FAQ
- What is ZK-Voting-App?
- A privacy-preserving on-chain voting app on Cardano where voters prove membership with zero-knowledge proofs and votes stay anonymous. ZK Voting App is a voting application built on the Cardano blockchain. An organiser creates an event, invites participants by email, and publishes the voting contracts on-chain. Each participant generates a Semaphore identity in the browser and registers a public commitment, then casts a vote backed by a Groth16 zero-knowledge proof. The proof shows the voter belongs to the registered group and includes a one-time nullifier that blocks double voting, so the cast vote cannot be linked to the voter.
- Is ZK-Voting-App free to use? What license does it have?
- ZK-Voting-App is open source under the Apache-2.0 license. Check the license terms before using it in commercial products.
- Is ZK-Voting-App still maintained?
- Actively maintained. The last commit to ZK-Voting-App was on Nov 4, 2026.
- What can I use ZK-Voting-App for?
- Running a binding, group-closed vote where participants' choices must stay private Organising member votes for an organisation that wants on-chain, tamper-evident results Trying out anonymous on-chain voting on the Preprod testnet at no cost
- How do I install ZK-Voting-App?
- Install all workspaces: npm install Configure environment variables (backend needs a Blockfrost key and funded relay wallet): cp src/backend/.env.example src/backend/.env && cp src/frontend/.env.example src/frontend/.env.local Start the backend on port 3000: cd src/backend && npm run start:dev Start the frontend on port 3002: cd src/frontend && npm run dev
- Where can I get ZK-Voting-App?
- The source code and installation instructions are on GitHub: https://github.com/TrustLevel/ZK-Voting-App
Summary generated by AI from the project's README. GitHub stats refresh daily.
Related projects
A decentralized operating system and node software that runs the Aleo network for zero-knowledge applications.
A zero-knowledge virtual machine that generates proofs of correct execution for programs written in Rust or other LLVM-compiled languages.
TypeScript framework for writing zero-knowledge circuits and zkApps, with proving and verifying in browsers, Node, or for the Mina Protocol.
Self-destructing, end-to-end encrypted pastebin: notes are encrypted in the browser with AES-256-GCM and vanish after one read or 24 hours.
Self-hosted, zero-knowledge sharing of one-time passwords, API keys, text and encrypted files via self-destructing links.