A ZKP-based anonymous voting system, ensuring voter privacy and preventing double voting.
This project implements a privacy-preserving voting system using zero-knowledge proofs (ZKPs) with Circom and the Groth16 proving system. Each voter generates a cryptographic commitment to their identity and vote choice, ensuring anonymity while preventing double voting through a nullifier mechanism. The system utilizes Poseidon hashing for efficient commitments and enforces valid vote options within a specified range. The proof is verified both off-chain using snarkjs and on-chain via a Groth16 verifier smart contract.
This project is built using zero-knowledge proofs (ZKPs) with Circom and the Groth16 proving system, enabling anonymous and tamper-proof voting on-chain.
Tech Stack & Architecture Circom – Used to define the zero-knowledge circuit that verifies voter identity and ensures valid voting.
SnarkJS – Used for proof generation and local verification before sending it on-chain.
Poseidon Hash – A ZK-friendly hash function for generating cryptographic commitments efficiently.
Hardhat & Ethers.js – Used for deploying and testing the smart contract verifier.
Solidity Smart Contract (Groth16 Verifier) – Used to verify the proof on-chain.