Transparent Voting.
Private Choices.

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.

The idea

What VoteSecure is designed to guarantee (Architecture v2.3)

🔐

No ballot is ever opened

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.

🗝️

Nobody holds the key

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.

🛡️

The chain checks the count

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.

👤

Your wallet stays off chain

JoyID only derives a per-election pseudonym on your device. Your wallet signs no transaction and never appears next to your ballot.

⚡

Free for voters

The organiser funds storage and fees. A Ballot Relay posts ballots in shuffled batches, so even the timing of your vote is hidden.

🔄

Revote, results at release

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.

How it works

1

Configure

Questions and options, schedule, eligibility (public, one invite key, or one key per voter), revote limit, and the minimum group size k for reporting.

2

Choose trustees

The trustees create the election key together. Each holds one share; the whole key never exists anywhere.

3

Publish and fund

One transaction creates the election's rules, its fund and an empty ballot box. The locked CKB comes back after the audit period.

4

Seal and release

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.

1

Open the link

Use the invitation link or QR code. Nothing to install.

2

Connect JoyID

Your passkey derives a pseudonym for this election only. An empty wallet is enough.

3

Cast your ballot

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.

4

Verify

Check that your ballot is included. After release, anyone can recheck every proof, every sum and the final count from public chain data.

What this prototype does today

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.

PartDesign (v2.3)This prototype
Ballot encryptionOne encrypted 0/1 per option under the trustees' joint keyEncrypted in the browser with a key the organiser holds
CountingAdded up while encrypted; only sums decrypted by t trusteesThe organiser decrypts the ballots
On-chain scriptFrozen; checks every ballot, the sums and the resultA stub that accepts every transaction
Voter walletDerives a pseudonym only; never on chainConnects directly; no pseudonym yet
SubmissionBallot Relay: sponsored, batched, shuffled, with receiptsSubmitted directly
User flowCreate, invite, vote, revote, release, auditClickable on testnet

Try the flow

Create a test election or vote in one. Use a fresh JoyID wallet; this runs on the CKB testnet.