ZeroPoll is a private voting system powered by zero-knowledge proofs
The code of ZeroPoll defines a secure, privacy-preserving poll system. It leverages zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge) to ensure that votes are both anonymous and verifiable without revealing any sensitive information.
Here’s how it works: Participants know which other participants wallets are eligible to vote. ZeroPoll allow participants to verify this through a zero-knowledge proof, called a commitment, which confirms eligibility without ever revealing the public key used for voting. This verification process happens on client-side.
Zeropoll takes privacy even further. Not only are the votes anonymous, but every poll option is securely hashed with a salt before being added to the chain. This ensures that only participants with access to the poll can view the options.
When voting, participants create a zero-knowledge proof of their votes associated with the hash of the poll option and transact to the Runtime Module, where the votes will persist without reveling any sensitive information.
The poll ui also consumes the votes directly from this runtime module and by executing zero-knowledge proofs, it ensures the text of each poll option is correct and how much votes was casted.
Zeropoll isn't limited to traditional elections. It’s ideal for any situation where private, secure voting is essential—whether it's in businesses, organizations, or even casual social interactions. You can experience this next level of voting today - visit zeropoll.xyz, connect your Auro Wallet and experience the future of anonymous voting.
Zeropoll can be splited in 2 parts:
The Chain, with the Runtime Modules - operates with Protokit and O1JS—Mina's zero-knowledge DSL for writing provable code.
The Web App, made with Next.js, React, Zustand, ShadcnUI and Tailwind. It offers a UI for users to interact with the chain in a easy way.
Both, the chains modules and the web app are made with Typescript and was initially set up with proto-kit/starter-kit (https://github.com/proto-kit/starter-kit).
ZK Program, Commitment from Merkle Map, Nullifiers, Hashed poll options with Salt
Anonymity: The system ensures that votes are anonymous by using zk-SNARKs. The nullifier mechanism guarantees that each participant can vote only once, without revealing their vote or identity.
Merkle Tree: The commitmentRoot is derived from a Merkle tree, which participants can verify to ensure that only the correct set of participants is allowed to vote.
Salts: The use of salts in the commitment process (if implemented) adds an extra layer of security, making it even harder to link a vote back to a specific participant.