← Back to projects

In design·Solidity · EVM · Zero-knowledge proofs (Semaphore / MACI)

Voices — publicly auditable ZK voting

A voting system where anyone can audit the election, nobody can see who you are, and you can still confirm your own vote counted.

?

The questions

  • Can a blockchain vote be publicly auditable by anyone, secret to everyone, and personally verifiable — without handing the voter a receipt that a coercer could demand?

How it builds up

Each block answers a piece of the question and feeds the next — foundations at the top, the answer at the bottom.

flowchart TD
  Q(["Auditable by all, secret to all,<br/>verifiable by you — no coercible receipt?"]):::q
  E["prove eligibility<br/>government ID, off-chain"]
  M["anonymous credential<br/>Merkle-tree membership"]
  V["cast vote<br/>ZK proof + nullifier"]
  T["public tally<br/>anyone audits"]
  P["personal check<br/>end-to-end verifiable"]
  Q --> E --> M --> V --> T
  V --> P
  T --> ANS(["ZK membership + on-chain<br/>auditability, receipt-free"]):::a
  P --> ANS
  classDef q fill:#1a1206,stroke:#f0a83e,color:#f3c98a;
  classDef a fill:#f0a83e,stroke:#f0a83e,color:#10141a;

Inside the build

Each stage of the calculation. Click one to expand its full write-up and validation figure.

01eligibility proof — authorize without exposing

A government ID is verified once, off-chain, by an eligibility issuer. Only a zero-knowledge proof of set membership ever touches the chain — the ID itself never does.

02anonymous credential — one person, one vote

The eligible voter joins a Merkle-tree commitment set; a nullifier makes double-voting detectable without linking a vote back to a voter.

03cast + tally — public auditability

Votes are recorded on-chain with the ZK eligibility proof, so anyone can confirm every vote came from an anonymous, authorized, unique voter — without seeing who.

04personal verification — the hard part

The voter confirms their vote was counted via end-to-end verifiability rather than a plaintext receipt — because a transferable proof of how you voted is exactly what enables coercion and vote-buying.

What it shows

  • The core tension is real: personal verifiability and coercion-resistance pull in opposite directions. The resolution is end-to-end verifiability — assurance your vote was cast and counted — without a transferable proof of content.
  • Zero-knowledge set membership plus a nullifier gives eligibility and one-person-one-vote without ever putting an ID on-chain — the standard building block (Semaphore), with MACI-style anti-coercion.
  • The honest trust boundary is the eligibility issuer: public auditability does not erase the need to trust whoever verifies IDs, so the design names it rather than hiding it.