In a blockchain-based polling/voting system, what is the best way to ensure that nobody votes more than once, and what is the best way to keep votes secret (if that's a requirement)? The info available in the blockchain should be 1) who voted and 2) how many votes for each option.
2 Answers
You can use colored coins to do voting on the Blockchain.
You can start by creating "Vote coins", and issue as many of them as you have registered voters. Then you ask the voters to generate a Bitcoin address, and that they give it to you.
You then send 1 "vote coin" to each of those addresses. You designate two or more addresses, one for each candidate/proposition. Finally the voters have to send the vote coin to the address representing the proposition they want to vote for.
When the vote is closed, you simply look at the "vote coin" balance in each of the two addresses.
The votes are secret because nobody can tell which address belongs to which voter.
Coinprism is a web wallet that lets you issue, send and receive your own colored coins. It's quite simple to use.
For secrecy, the voters could go to the voting office, the officials verify that the voter is allowed to vote, the voter writes down his address on a piece of paper, and slide it into a sealed box. At the end of that registration process, the voting office has a box with 100 pieces of papers with each an address. They can then send the "vote coins" to those 100 addresses, without knowing which belongs to whom.
Of course, this is just an illustration, it's possible to achieve the same without requiring people to travel using the equivalent process implemented as open source software.
-
1"nobody can tell which address belongs to which voter": The person who issued the vote coins knows which address belonged to each voter, don't they? Commented May 27, 2014 at 14:22
-
I agree with Nate's objection, the proposed solution doesn't seem to address secrecy. If more than one person knows a secret, it isn't a secret anymore. Commented May 28, 2014 at 8:31
-
Well, blockchain or not, it's physically impossible to hold a vote where all voters are 100% anonymous, and where a person can't vote more than once. It's either one or the other. If you want to limit one person per vote, there has to be some kind of central authority verifying identities.– FlavienCommented May 28, 2014 at 13:32
-
Flavien, secrecy is a requirement, but anonymity isn't. I think the flaw in your proposed solution is that the issuing agency knows who voted for what. If the issuing agency just knows who has voted and can invalidate double votes, then the problem is solved. Current voting systems do keep track of who has voted and ensure that there are no double votes, but respect the secrecy of individual votes. Commented May 28, 2014 at 17:17
-
Ok, then this can easily be solved. I've updated my answer.– FlavienCommented May 28, 2014 at 20:57
as for making votes secret, we can use coinjoin. Groups of 1000 people mix their votes together. You can prove that a person made one of the votes in the pool of 1000, but you cannot prove which vote was theirs.
-
Except that anyone within the group of 1000 can see who everyone else in the group of 1000 voted for. Coinjoin protects anonymity OUTSIDE the group but not inside. Commented Feb 14, 2015 at 18:31
yes
if the last number in the sending address is even, andno
if odd. And if it's not public which addresses are used in the system, then no-one can void your vote. Unless 'they' track your wallet, and see you sending 1 satoshi to an address and conclude it's for voting. Then you can only count the first vote or something. Like sealing vote-paper on a real vote.