MACI Wrapper Guide: Scaffold ETH 2 & MACI Voting Template by Yash
Welcome to the hacker guide for the Scaffold ETH 2 + MACI Voting Template! This guide will help you get started with the template, providing step-by-step instructions to set up and customize your decentralized voting application, understand MACI, and explore project ideas.
Understanding MACI
What is MACI?
Minimal Anti-Collusion Infrastructure (MACI) is a cryptographic protocol designed to enhance the privacy and security of voting systems on blockchain platforms. MACI ensures that votes are cast anonymously, preventing voters from being coerced or bribed. It combines several cryptographic techniques, including zk-SNARKs (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) and Merkle trees, to achieve its anti-collusion goals.
Key Features of MACI
- Anonymity: Ensures that the identity of the voter is concealed, making it impossible to link votes to individuals.
- Collusion Resistance: Prevents voters from proving how they voted, thereby deterring bribery and coercion.
- Privacy: Maintains the confidentiality of individual votes while allowing the aggregate result to be verified.
How MACI Works
- Voter Registration: Voters register their identities using a public-private key pair.
- Vote Casting: Votes are encrypted and submitted to the MACI contract. When votes are processed, only votes of eligible users are counted.
- Tallying Votes: After the voting period, the votes are decrypted and tallied in a way that ensures the privacy and integrity of the results.
Quickstart Guide
1. Clone and Set Up the Project
Clone the project repository and install the dependencies:
git clone https://github.com/yashgo0018/maci-wrapper.git
cd maci-wrapper
yarn install
2. Download the zkeys for the MACI Circuits
In your first terminal window, run:
yarn download-zkeys
3. Update Environment Variables
Copy the example environment files to the required .env
files:
cp packages/hardhat/.env.example packages/hardhat/.env
cp packages/nextjs/.env.example packages/nextjs/.env.local
Update the values of the environment variables in these new .env
files.
4. Start a Local Ethereum Network
In your first terminal window, run:
yarn chain
This will start a local Ethereum network using Hardhat.
5. Deploy Contracts
In a second terminal window, deploy your contracts:
yarn deploy
6. Launch the NextJS Application
In a third terminal window, start the NextJS frontend:
yarn start
7. Compute Results
In a fourth terminal window, clone the MACI repository:
git clone git@github.com:privacy-scaling-explorations/maci.git
Copy the zkeys generated from the maci-wrapper repo to the CLI directory of the MACI repo:
cp -r ../maci-wrapper/packages/hardhat/zkeys ./cli
Install dependencies and build the MACI project:
pnpm i
pnpm run build
Copy the new contract addresses:
cp -r ../maci-wrapper/packages/contractAddresses.json ./cli/build/contractAddresses.json
Follow the MACI documentation to merge signups, merge messages, generate proof, and then you can upload the tally.json
file to the admin panel after the poll is over.
8. Interact with Your DApp
Navigate to http://localhost:3000
to interact with your decentralized application (dApp).
9. Modifications
You can modify the app configuration in packages/nextjs/scaffold.config.ts
to change the target network and packages/hardhat/constants.ts
is you want to update the zkeys or use your own custom contracts for voice credit proxy
, gate keeper
, verifier
or topup credits
.
Example Configuration Changes
To host your dApp on a separate network (e.g., Sepolia testnet), you need to update the following file:
packages/nextjs/scaffold.config.ts
...
const scaffoldConfig = {
...
targetNetworks: [chains.sepolia],
...
- Deploying Contracts to Sepolia
Ensure your packages/hardhat/.env
file contains your private key and Alchemy project ID:
DEPLOYER_PRIVATE_KEY=your_private_key
ALCHEMY_API_KEY=your_alchemy_project_id
Then, deploy your contracts to Sepolia:
yarn deploy --network sepolia
Usage
Register
Use the app's interface to register with the MACI contract and gain voting rights.
Create Polls
As an admin, you can create polls with custom questions and options.
Vote
Registered voters can participate in polls, utilizing MACI's secure voting mechanism.
View Results
Access poll outcomes after the voting phase ends.
Admin Dashboard
Monitor and manage ongoing polls, including viewing detailed poll status.