A private voting zkApp on Mina Protocol to enable groups such as DAOs to vote on proposals anonymously.
This project tries to solve the problem of voting privately on Mina Protocol using a ZK commitment + nullifier scheme to prevent double-voting and a relayer system to update the Mina contract state anonymously. The list of voters (like a DAO memberlist) is whitelisted to register to vote on a certain poll. Voters start by registering - creating a ZK note with their commitment and have their registration recorded (publicly) on-chain to prevent registering multiple times. Registered voters can then vote through a Relayer by providing a ZK proof of their vote along with revealing their Nullifier. Commitments and Nullifiers are stored on a Merkle Tree. After the Relayer submits the transaction on chain the new vote tally state is updated on a Mina contract. Using ZK Proof the nullifier cannot link back to the commitment and the voter was able to vote privately!
This project uses the Mina protocol at its core. The two biggest problems to solve were the ability to update the state of the Mina contracts anonymously and to prevent double-voting. A relayer solved the issue of pushing transactions to the Mina protocol anonymously. A ZK commitment and nullifier scheme inspired by Tornado Cash helps prevent double-voting while staying anonymous. SnarkyJS helped with the functions relating to ZK Proofs and verification.