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.
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.
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.