Contents
Method1 details:
In Method1, the identity of the voter is hidden with ZK, but all votes are public. In order to hide voting power, we split whale vote into multiple votes with automatic random delay between them.
Method1 Process:
1. Registration
- Each voter generates a random key pair with the opensource code on our front-end.
- The key pair can be used to vote for multiple proposals, and can be replaced by repeating the registration process.
- Voter downloads and keeps the private key for voting.
- Voter sends the public key to our contract on chain, from the wallet holding Nouns. (Hardware wallets and multisig wallets are supported)
- Our contract verifies Nouns in the wallet, then save the public key in a Merkle tree.
2. Voting
- Voter provides private voting key, wallet address, and proposal ID to the opensource code on our front-end.
- The code pulls Nouns ids in the wallet and all voting public keys from blockchain.
- The code generates ZK proofs. (1 zk proof for 1 Nouns id).
- The code sends ZK proofs and votes to relayers one by one with random delay between them.
- The relayers forward the ZK proofs and votes to our contract on chain.
- The contract verifies the ZK proofs and then updates vote counts.
3**. Tallying**
- The vote counts can be queried from our contract at any time.
Future Improvement:
Public vote counts may affect voter decision during the voting. This can be solved by adding time-locked encryption to the vote. [1]
References:
[1] Homomorphic Time-Lock Puzzles and Applications (https://eprint.iacr.org/2019/635.pdf)

Method2 details:
- In Method2, the voter identity is hidden with ZK, and the vote content is encrypted with homomorphic encryption.