Sybil- and bribery-resistant polling on Farcaster, utilizing World ID and MACI.
Our project introduces a Farcaster Frame template for creating secure and anonymous polls. It uses MACI to enable voting privacy and prevent bribery, Pimlico for account management, and offers World ID as a voter identification method to determine eligibility. This setup enables users to generate polls on Farcaster that are secure against bots, bribery, and collusion.
We use World ID for verifying one person per vote, creating sybil-resistant polls and overcoming a challenge not addressed by Twitter and similar platforms. Alternatively, entities such as DAOs can leverage our voting framework by conducting votes restricted to their governance token holders, ensuring a bribery-resistant and accessible platform for governance proposals.
Because for every voter a smart account is deployed, voters can execute transactions directly inside a frame and do not need to pay for gas.
Functionalities we created and tech we used:
Voting System: A set of predefined MACI contracts that allow anonymous voting.
Contract SignUpWorldcoinGatekeeper: This contract allows to gatekeep MACI signups by requiring new voters to verify with World ID.
Poll Creation: A new MACI poll can be registered with our MACI factory.
Web Application: A Next.js webapp, designed for easy integration with Farcaster as a frame. Poll details like questions and options are stored in an offchain database linked to the webapp.
Voter Registration: Voters need to register using a method defined in the Gatekeeper contract. Our setup uses World ID for verification, employing @worldcoin/idkit-core and the Worldcoin app to create a unique nullifier hash for voting. A Pimlico Safe account is also deployed for each voter, allowing votes without gas fees, using @permissionless library.
Voting Process: Registered voters can choose from options set by the poll creator.
Result Calculation and Display: Poll outcomes are calculated through zk-snark functions within the MACI poll contract, with results displayed in the frame for public viewing.