Elections on Nervos CKB that anyone can verify and nobody can link back to a voter. Ballots are counted while still encrypted: no individual ballot is ever decrypted.
What VoteSecure is designed to guarantee (Architecture v2.3)
Each ballot encrypts a 0 or 1 per answer option. Encrypted ballots are added up without being decrypted. Only the sums are decrypted, never a single vote.
The election key is created jointly by several trustees. Any t of n of them can decrypt a sum. No organiser, relay or developer can read results alone.
A frozen on-chain script checks a validity proof on every ballot, adds the encrypted ballots itself, and accepts only the tally the trustees' proofs allow.
JoyID only derives a per-election pseudonym on your device. Your wallet signs no transaction and never appears next to your ballot.
The organiser funds storage and fees. A Ballot Relay posts ballots in shuffled batches, so even the timing of your vote is hidden.
Change your vote before the deadline; only the last one counts. During voting only participation is shown. Option totals appear after release, with small groups merged.
Questions and options, schedule, eligibility (public, one invite key, or one key per voter), revote limit, and the minimum group size k for reporting.
The trustees create the election key together. Each holds one share; the whole key never exists anywhere.
One transaction creates the election's rules, its fund and an empty ballot box. The locked CKB comes back after the audit period.
After voting ends, the box is sealed and the encrypted ballots are summed. After the release time the trustees publish their decryption shares, and anyone can submit the result.
Use the invitation link or QR code. Nothing to install.
Your passkey derives a pseudonym for this election only. An empty wallet is enough.
Your browser encrypts the ballot, adds a proof that it is a valid vote, and sends it to the relay. You get a signed receipt.
Check that your ballot is included. After release, anyone can recheck every proof, every sum and the final count from public chain data.
The prototype shows the user flow on CKB testnet. It was built for an earlier design (v1), so the security guarantees above are not in it yet.
| Part | Design (v2.3) | This prototype |
|---|---|---|
| Ballot encryption | One encrypted 0/1 per option under the trustees' joint key | Encrypted in the browser with a key the organiser holds |
| Counting | Added up while encrypted; only sums decrypted by t trustees | The organiser decrypts the ballots |
| On-chain script | Frozen; checks every ballot, the sums and the result | A stub that accepts every transaction |
| Voter wallet | Derives a pseudonym only; never on chain | Connects directly; no pseudonym yet |
| Submission | Ballot Relay: sponsored, batched, shuffled, with receipts | Submitted directly |
| User flow | Create, invite, vote, revote, release, audit | Clickable on testnet |
Read the full design (opens in a new tab) See what is still unsolved (opens in a new tab)
Create a test election or vote in one. Use a fresh JoyID wallet; this runs on the CKB testnet.