From a6e035275fc07f11d0354d0794eaa15d937ba278 Mon Sep 17 00:00:00 2001 From: Cat McGee Date: Tue, 28 Nov 2023 21:00:22 +0000 Subject: [PATCH] feat(docs): Add simple private voting tutorial (#3402) Closes https://github.com/AztecProtocol/aztec-packages/issues/3422 . simple tutorial # Checklist: Remove the checklist to signal you've completed it. Enable auto-merge if the PR is ready to merge. - [x] If the pull request requires a cryptography review (e.g. cryptographic algorithm implementations) I have added the 'crypto' tag. - [x] I have reviewed my diff in github, line by line and removed unexpected formatting changes, testing logs, or commented-out code. - [x] Every change is related to the PR description. - [x] I have [linked](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) this pull request to relevant issues (if any exist). --------- Co-authored-by: Rahul Kothari Co-authored-by: josh crites --- .../writing_private_voting_contract.md | 234 ++++++++++++++++++ docs/sidebars.js | 2 + docs/static/img/tutorials/voting_flow.png | Bin 0 -> 75581 bytes .../end-to-end/src/cli_docs_sandbox.test.ts | 1 + yarn-project/noir-contracts/Nargo.toml | 1 + .../easy_private_voting_contract/Nargo.toml | 8 + .../easy_private_voting_contract/src/main.nr | 109 ++++++++ 7 files changed, 355 insertions(+) create mode 100644 docs/docs/dev_docs/tutorials/writing_private_voting_contract.md create mode 100644 docs/static/img/tutorials/voting_flow.png create mode 100644 yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/Nargo.toml create mode 100644 yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr diff --git a/docs/docs/dev_docs/tutorials/writing_private_voting_contract.md b/docs/docs/dev_docs/tutorials/writing_private_voting_contract.md new file mode 100644 index 00000000000..ecfa4fb2b2d --- /dev/null +++ b/docs/docs/dev_docs/tutorials/writing_private_voting_contract.md @@ -0,0 +1,234 @@ +import Image from '@theme/IdealImage'; + +# Writing a private voting smart contract in Aztec.nr + +In this tutorial we will go through writing a very simple private voting smart contract in Aztec.nr. You will learn about private functions, public functions, composability between them, state management and creatively using nullifiers to prevent people from voting twice! + +We will build this: + + + +* The contract will be initialized with an admin, stored publicly +* A voter can vote privately, which will call a public function and update the votes publically +* The admin can end the voting period, which is a public boolean + +To keep things simple, we won't create ballots or allow for delegate voting. + +## Prerequisites + +- You have followed the [quickstart](../getting_started/quickstart.md) +- Running Aztec Sandbox + +## Set up a project + +First, [create a new contract project with `nargo`](../getting_started/aztecnr-getting-started.md). + +```bash +nargo new --contract private_voting +``` + +Your file structure should look something like this: + +```tree +. +| | |--private_voting +| | | |--src +| | | | |--main.nr +| | | |--Nargo.toml +``` + +The file `main.nr` will soon turn into our smart contract! + +We will need the Aztec library to create this contract. Add the following content to `Nargo.toml`: + +```toml +[package] +name = "private_voting" +type = "contract" +authors = [""] +compiler_version = ">=0.18.0" + +[dependencies] +aztec = { git="https://github.com/AztecProtocol/aztec-packages", tag="#include_aztec_version", directory="yarn-project/aztec-nr/aztec" } +``` + +## Initiate the contract and define imports + +Go to `main.nr` and delete the sample code. Replace it with this contract initialization: + +```rust +contract Voting { + +} +``` +This defines a contract called `Voter`. Everything will sit inside this block. + +Inside this, paste these imports: + +#include_code imports yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +We are using various utils within the Aztec library: + +* `context` - exposes things such as the contract address, msg_sender, etc +* `oracle::get_secret_key` - get your secret key to help us create a randomized nullifier +* `selector::compute_selector` - compute a function selector so we can call functions from other functions +* `state_vars::{ map::Map, public_state::PublicState, }` - we will use a Map to store the votes (key = voteId, value = number of votes), and PublicState to hold our public values that we mentioned earlier +* `types::type_serialization::{..}` - various serialization methods for defining how to use these types +* `types::address::{AztecAddress},` - our admin will be held as an address +* `constants_gen::EMPTY_NULLIFIED_COMMITMENT,` - this will come in useful when creating our nullifier + +## Set up storage + +Under these imports, we need to set up our contract storage. This is done in two steps: + +1. Storage struct +2. Storage impl block with init function + +Define the storage struct like so: + +#include_code storage_struct yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +In this contract, we will store three vars: +1. admin, as an Aztec address held in public state +2. tally, as a map with key as the persona and value as the number (in Field) held in public state +3. voteEnded, as a boolean held in public state + +Under the struct, define the impl block like this: + +#include_code storage_impl yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +The `impl` block must define one function `init` that explains how to access and manipulate our variables. We pass context, a storage slot, and serialization methods we imported earlier. + +This `init` function will be called every time we access `storage` in our functions. + +## Constructor + +The next step is to initialize the contract with a constructor. The constructor will take an address as a parameter and set the admin. + +All constructors must be private, and because the admin is in public storage, we cannot directly update it from the constructor. You can find more information about this [here](../../concepts/foundation/communication/public_private_calls.md). + +Therefore our constructor must call a public function by using `context.call_public_function()`. Paste this under the `impl` storage block: + +#include_code constructor yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +`context.call_public_function()` takes three arguments: +1. The contract address whose method we want to call +2. The selector of the function to call (we can use `compute_selector()` for this) +3. The arguments of the function (we pass the `admin`) + +We now need to write the `_initialize()` function: + +#include_code initialize yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +This function takes the admin argument and writes it to the storage. We are also using this function to set the `voteEnded` boolean as false in the same way. + +This function is set as `internal` so that it can only be called from within the contract. This stops anyone from setting a new admin. + +## Casting a vote privately + +For the sake of simplicity, we will have three requirements: +1. Everyone with an Aztec account gets a vote +2. They can only vote once in this contract +3. Who they are is private, but their actual vote is not + +To ensure someone only votes once, we will create a nullifier as part of the function call. If they try to vote again, the function will revert as it creates the same nullifier again, which can't be added to the nullifier tree (as that indicates a double spend). + +Create a private function called `cast_vote`: + +#include_code cast_vote yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +In this function, we do not create a nullifier with the address directly. This would leak privacy as it would be easy to reverse-engineer. We must add some randomness or some form of secret, like [nullifier secrets](../../concepts/foundation/accounts/keys.md#nullifier-secrets). + +To do this, we make an [oracle call](../contracts/syntax/functions.md#oracle-functions) to fetch the caller's secret key, hash it to create a nullifier, and push the nullifier to Aztec. The `secret.high` and `secret.low` values here refer to how we divide a large [Grumpkin scalar](https://github.com/AztecProtocol/aztec-packages/blob/7fb35874eae3f2cad5cb922282a619206573592c/noir/noir_stdlib/src/grumpkin_scalar.nr) value into its higher and lower parts. This allows for faster cryptographic computations so our hash can still be secure but is calculated faster. + +After pushing the nullifier, we update the `tally` to reflect this vote. As we know from before, a private function cannot update public state directly, so we are calling a public function. + +Create this new public function like this: + +#include_code add_to_tally_public yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +The first thing we do here is assert that the vote has not ended. + +`assert()` takes two arguments: the assertion, in this case that `storage.voteEnded` is not false, and the error thrown if the assertion fails. + +The code after the assertion will only run if the assertion is true. In this snippet, we read the current vote tally at the voteId, add 1 to it, and write this new number to the voteId. The `Field` element allows us to use `+` to add to an integer. + +## Getting the number of votes + +We will create a function that anyone can call that will return the number of votes at a given vote Id. Paste this in your contract: + +#include_code get_vote yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +We set it as `unconstrained` and do not annotate it because it is only reading from state. You can read more about unconstrained functions [here](../../concepts/advanced/acir_simulator.md#unconstrained-functions). + +## Allowing an admin to end a voting period + +To ensure that only an admin can end a voting period, we can use another `assert()` statement. + +Paste this function in your contract: + +#include_code end_vote yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +Here, we are asserting that the `msg_sender()` is equal to the admin stored in public state. We have to create an `AztecAddress` type from the `msg_sender()` in order to do a direct comparison. + +## compute_note_hash_and_nullifier + +Every Aztec contract that has storage must have a `compute_note_hash_and_nullifier()` function. If you try to compile without this function, you will get an error. This is explained in more detail [here](../contracts/resources/common_patterns/main.md#working-with-compute_note_hash_and_nullifier). + +At the end of the contract, paste this: + +#include_code compute_note_hash_and_nullifier yarn-project/noir-contracts/src/contracts/easy_private_voting_contract/src/main.nr rust + +We can simply return `[0,0,0,0]` because we are not creating any notes in our contract. + +## Compiling and deploying + +The easiest way to compile and deploy a contract is by using the [Aztec CLI](../cli/cli-commands.md). + +In the `private_voting` directory, run this: + +```bash +aztec-cli compile . +``` + +This should create a new directory called `target` and a JSON artifact inside it called `Voting.json`. If you are getting some errors here you might want to check out the [debugging page](../debugging/main.md). + +Once it is compiled you can deploy it to the sandbox. Ensure your [sandbox is running](../cli/sandbox-reference.md) and run this in the same dir as before: + +```bash +aztec-cli deploy ./target/Voting.json --args $ADMIN_ADDRESS +``` + +The constructor takes an address as an argument to set the admin, so you can use an address that is deployed with the sandbox - check the sandbox terminal or run `aztec-cli get-accounts`. + +You should see a success message with the contract address. Now we can start calling functions! + +Cast a vote like this: + +```bash +aztec-cli send cast_vote --contract-artifact ./target/Voting.json --contract-address $CONTRACT_ADDRESS --args 1 --private-key $PRIVATE_KEY +``` + +You can get the contract address from the sandbox terminal or the message printed when you deployed the contract. You can also get a private key from the sandbox terminal, or generate one with `aztec-cli generate-private-key`. + +This should return a `mined` success message. + +You can now try running this command again to ensure our nullifier works. + +Get the number of votes like this: + +```bash +aztec-cli call get_vote --contract-artifact ./target/Voting.json --contract-address $CONTRACT_ADDRESS --args 1 +``` + +This should return `1n`. + +You can follow this pattern to test `end_vote()` and access control of other functions. Find more information about calling functions from the CLI [here](../cli/cli-commands.md). + +## Next steps + +Now you have learned the foundations of Aztec smart contracts, you can start to play around with some more advanced features. Some ideas: + +* Add some more features into this contract, like the admin can distribute votes, people can delegate their votes, or voteIds can have more data like names, descriptions, etc +* Create a frontend for this contract using [Aztec.js](../aztecjs/main.md). +* Go to the [next tutorial](writing_token_contract.md) and learn how to write a token contract \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js index cf0523153b1..3a20fac23d1 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -223,6 +223,8 @@ const sidebars = { }, items: [ "dev_docs/tutorials/writing_token_contract", + "dev_docs/tutorials/writing_private_voting_contract", + { label: "Writing a DApp", type: "category", diff --git a/docs/static/img/tutorials/voting_flow.png b/docs/static/img/tutorials/voting_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..68c0444f776d4cb7c393307d0f958232e62dd2f2 GIT binary patch literal 75581 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, // admin can end vote + tally: Map>, // we will store candidate as key and number of votes as value + voteEnded: PublicState, // voteEnded is boolean +} + // docs:end:storage_struct + // docs:start:storage_impl + impl Storage { + fn init(context: Context) -> Self { + Storage { + admin: PublicState::new( + context, + 1, // storage slot. this can be anything except 0. it is hashed, and hash on 0 = 0 + AztecAddressSerializationMethods, + ), + tally: Map::new( + context, + 2, + |context, slot| { + PublicState::new( + context, + slot, + FieldSerializationMethods, + ) + }, + ), + voteEnded: PublicState::new( + context, + 3, + BoolSerializationMethods, + ) + } } + } + // docs:end:storage_impl + // docs:start:constructor + #[aztec(private)] // annotation to mark function as private and expose private context + fn constructor(admin: AztecAddress) { // called when contract is deployed + context.call_public_function( + // we cannot update public state directly from private function but we can call public function (which queues it) + context.this_address(), // contract address whose method we want to call + compute_selector("_initialize((Field))"), // function selector + [admin.address] // parameters + ); + } + // docs:end:constructor + // docs:start:initialize + #[aztec(public)] // annotation to mark function as public and expose public context + internal fn _initialize(admin: AztecAddress) { // internal - can only be called by contract + storage.admin.write(admin); + storage.voteEnded.write(false); + } + // docs:end:initialize + // docs:start:cast_vote + #[aztec(private)] // annotation to mark function as private and expose private context + fn cast_vote(candidate: Field) { + let secret = get_secret_key(context.msg_sender()); // get secret key of caller of function + let nullifier = dep::std::hash::pedersen_hash([context.msg_sender(), secret.low, secret.high]); // compute nullifier with this secret key so others can't descrypt it + context.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT); // push nullifier + context.call_public_function( + context.this_address(), + compute_selector("add_to_tally_public(Field)"), + [candidate]); + } + // docs:end:cast_vote + + // docs:start:add_to_tally_public + #[aztec(public)] + internal fn add_to_tally_public(candidate: Field) { + assert(storage.voteEnded.read() == false, "Vote has ended"); // assert that vote has not ended + let new_tally = storage.tally.at(candidate).read() + 1; + storage.tally.at(candidate).write(new_tally); + } + // docs:end:add_to_tally_public + + // docs:start:end_vote + #[aztec(public)] + fn end_vote() { + assert(storage.admin.read().eq(AztecAddress::new(context.msg_sender())), "Only admin can end votes"); // assert that caller is admin + storage.voteEnded.write(true); + } + // docs:end:end_vote + // docs:start:get_vote + unconstrained fn get_vote(candidate: Field) -> Field { + storage.tally.at(candidate).read() + } + // docs:end:get_vote + // docs:start:compute_note_hash_and_nullifier + unconstrained fn compute_note_hash_and_nullifier(contract_address: Field, nonce: Field, storage_slot: Field, serialized_note: [Field; 0]) -> [Field; 4] { + [0, 0, 0, 0] + } + // docs:end:compute_note_hash_and_nullifier +} \ No newline at end of file