leo/examples/vote
Pranav Gaddamadugu f7e0352500 WIP
2024-05-18 16:43:53 -07:00
..
build WIP 2024-05-18 16:43:53 -07:00
inputs Update examples 2024-01-15 15:45:09 -08:00
src write examples using new async syntax 2024-04-09 13:53:26 -07:00
.env Update default PK in examples .env 2024-05-15 08:22:10 -07:00
.gitignore [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
leo.lock make example compatible w/ stubs 2023-12-11 13:19:42 -08:00
program.json [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
README.md Update examples and CI 2024-01-15 15:45:08 -08:00
run.sh WIP 2024-05-15 20:59:10 -07:00

Summary

vote.leo is a general vote program.

Anyone can issue new proposals, proposers can issue tickets to the voters, and voters can vote without exposing their identity.

This example is inspired by the aleo-vote example written by the Aleo community.

Noteworthy Features

Voter identity is concealed by privately passing a voter's ballot into a function. Proposal information and voting results are revealed using the public mapping datatype in Leo.

How to Run

To compile this Leo program, run:

leo run <function_name> <input_1> <input_2>

Make changes to vote/inputs/vote.in before running each command.

Propose

Anyone can issue a new proposal publicly by calling propose function.

Run propose:

leo run propose <inputs>

Output sample:

 {
  owner: aleo1kkk52quhnxgn2nfrcd9jqk7c9x27c23f2wvw7fyzcze56yahvcgszgttu2.private,
  id: 2805252584833208809872967597325381727971256629741137995614832105537063464740field.private,
  info: {
    title: 2077160157502449938194577302446444field.private,
    content: 1452374294790018907888397545906607852827800436field.private,
    proposer: aleo1kkk52quhnxgn2nfrcd9jqk7c9x27c23f2wvw7fyzcze56yahvcgszgttu2.private
  },
  _nonce: 1639660347839832220966145410710039205878572956621820215177036061076060242021group.public
}

Create Ticket

Proposers can create new tickets for proposed proposals.

Ticket is a record with owner and pid, it can be used to vote for the specific proposal - pid, and can only be used(voted) by the ticket owner.

Run new_ticket:

leo run new_ticket <inputs>

Output sample:

{
  owner: aleo1kkk52quhnxgn2nfrcd9jqk7c9x27c23f2wvw7fyzcze56yahvcgszgttu2.private,
  pid: 2264670486490520844857553240576860973319410481267184439818180411609250173817field.private,
  _nonce: 1637267040221574073903539416642641433705357302885235345311606754421919550724group.public
}

Vote

A ticket owner can use their ticket record to vote agree / disagree with the specific proposal - pid.

Since the ticket record can be used as an input privately, the voter's privacy is protected.

Run agree:

leo run agree <inputs>

Run disagree:

leo run disagree <inputs>