Summary
vote.leo is a versatile voting program that allows anyone to issue new proposals, proposers to issue tickets to voters, and voters to cast their votes anonymously. This guide is inspired by the Aleo community's aleo-vote example.
Anonymity: Voter identity is concealed by privately passing a voter's ballot into a function.
Transparency: Proposal information and voting results are revealed using the public mapping datatype in Leo.
First, follow the Leo Installation Instructions. To run the vote program locally, use the following bash script:
Copy code
cd vote ./run.sh
The .env file contains a private key and address. This account signs transactions and checks for record ownership. When executing programs as different parties, ensure the private_key field in .env is set to the correct value. For a full example, refer to ./run.sh.
Create a Proposal
Voter 1 Issues a Ticket and Votes
Voter 2 Issues a Ticket and Votes
How Votes Are Tallied
We'll act as three different parties:
Proposer
Private Key:
APrivateKey1zkp8wKHF9zFX1j4YJrK3JhxtyKDmPbRu9LrnEW8Ki56UQ3GAddress:
aleo1rfez44epy0m7nv4pskvjy6vex64tnt0xy90fyhrg49cwe0t9ws8sh6nhhr
Voter 1
Private Key:
APrivateKey1zkpHmSu9zuhyuCJqVfQE8p82HXpCTLVa8Z2HUNaiy9mrug2Address:
aleo1c45etea8czkyscyqawxs7auqjz08daaagp2zq4qjydkhxt997q9s77rsp2
Voter 2
Private Key:
APrivateKey1zkp6NHwbT7PkpnEFeBidz5ZkZ14W8WXZmJ6kjKbEHYdMmf2Address:
aleo1uc6jphye8y9gfqtezrz240ak963sdgugd7s96qpuw6k7jz9axs8q2qnhxc
To propose a new ballot, set up the .env file for the proposer:
Copy code
Run the propose function:
Copy code
leo run propose "{ title: 2077160157502449938194577302446444field, content: 1452374294790018907888397545906607852827800436field, proposer: aleo1rfez44epy0m7nv4pskvjy6vex64tnt0xy90fyhrg49cwe0t9ws8sh6nhhr }"
This generates a new record with the proposal information and sets a public mapping with the proposal ID.
Set up the .env file for voter 1:
Copy code
echo " NETWORK=testnet3 PRIVATE_KEY=APrivateKey1zkpHmSu9zuhyuCJqVfQE8p82HXpCTLVa8Z2HUNaiy9mrug2 " > .env
Create a new ticket:
Copy code
leo run new_ticket 2264670486490520844857553240576860973319410481267184439818180411609250173817field aleo1c45etea8czkyscyqawxs7auqjz08daaagp2zq4qjydkhxt997q9s77rsp2
Vote using the ticket:
Copy code
leo run agree "{ owner: aleo1c45etea8czkyscyqawxs7auqjz08daaagp2zq4qjydkhxt997q9s77rsp2.private, pid: 2264670486490520844857553240576860973319410481267184439818180411609250173817field.private, _nonce: 1738483341280375163846743812193292672860569105378494043894154684192972730518group.public }"
Set up the .env file for voter 2:
Copy code
echo " NETWORK=testnet3 PRIVATE_KEY=APrivateKey1zkp6NHwbT7PkpnEFeBidz5ZkZ14W8WXZmJ6kjKbEHYdMmf2 " > .env
Create a new ticket:
Copy code
leo run new_ticket 2158670485494560943857353240576760973319410481267184429818180411607250143681field aleo1uc6jphye8y9gfqtezrz240ak963sdgugd7s96qpuw6k7jz9axs8q2qnhxc
Vote using the ticket:
Copy code
leo run disagree "{ owner: aleo1uc6jphye8y9gfqtezrz240ak963sdgugd7s96qpuw6k7jz9axs8q2qnhxc.private, pid: 2158670485494560943857353240576760973319410481267184429818180411607250143681field.private, _nonce: 6511154004161574129036815174288926693337549214513234790975047364416273541105group.public }"
Votes are kept private, but the total number of agreements and disagreements are displayed on-chain in the public mapping. You can query this data on-chain.
By following these steps, you can effectively use the vote.leo program to create proposals and cast votes while maintaining voter anonymity. This secure and transparent voting mechanism showcases the powerful capabilities of Leo in handling complex cryptographic tasks.
