How Zero-Knowledge Proofs Can Keep Your Vote Secret
Adole Daniel Inalegwu
Founder & CEO
February 19, 2025
7 min read
Elections sit at an uncomfortable intersection of two requirements that seem to contradict each other. On one hand, you need total transparency: every eligible voter should be able to verify that the final count is correct. On the other hand, you need absolute secrecy: no one should be able to find out how any individual voted. How do you have both at the same time?
Paper elections solve this imperfectly: ballots are secret, but the counting is a social process that depends on people being honest in a room. Digital elections make counting fast and auditable — but they've historically required trusting a central server with everyone's vote data, which is a much worse problem.
What is a zero-knowledge proof?
A zero-knowledge proof (ZKP) is a cryptographic method where one party (the prover) can convince another party (the verifier) that a statement is true, without revealing any information beyond the truth of the statement itself.
A useful analogy: imagine you have a map with a hidden path through a maze, and you want to prove to a friend that you know the path — without showing them the path itself. A ZK proof lets you do exactly that. You can walk through the maze and prove you found the exit, without ever letting your friend see your route.
How Baalot plans to use ZK proofs
A note on status: the ZK-proof and on-chain design described below is on our roadmap, not shipped. Today, Baalot keeps ballots anonymous by storing votes so they can't be read back to a voter and tallying them privately on the server. The cryptographic layer below is where we're headed.
In the design we're building toward, three things would happen in sequence when you cast a vote. First, your device generates a cryptographic commitment — a mathematical fingerprint of your vote that can be verified without revealing the vote itself. Second, this commitment is anchored to a public blockchain, creating a permanent, tamper-proof record that you participated and that your vote was valid. Third, your actual vote choice is held in an encrypted tally structure that can only be opened when the election closes — and even then, only the aggregate result is decrypted, not individual choices.
You can prove your vote was counted without proving how you voted. That's the core guarantee we're designing for.
What this would mean for election integrity
- Administrators cannot see how you voted, even if they want to
- You could verify your own vote commitment on a public blockchain explorer
- The final tally can be independently verified without accessing any individual vote
- A corrupt administrator could not change the result without invalidating the on-chain proofs simultaneously
The trade-offs
ZK proofs are computationally expensive, which is the main engineering challenge of bringing this to phones. Part of the work ahead is keeping proof generation fast enough on low-end Android devices that the voting flow stays smooth, and tuning the proof design for the binary-choice and ranked-choice ballots Baalot supports.
The other trade-off is complexity: ZK proofs require voters to trust mathematical guarantees they may not fully understand. Our answer to this is the public record. You wouldn't need to understand the cryptography to verify your participation — you'd just need a block explorer and your voter receipt. The math handles the secret; the blockchain handles the proof.
Elections have been manipulated by people with physical access to ballot boxes, by administrators with database access, and by network attacks on centralised servers. ZK proofs don't eliminate corruption — but they're designed to make the specific corruptions that have historically worked impossible to execute without being detected. That's the point of building toward them.