Creating a Smart Contract for Decentralized Voting

Creating a Smart Contract for Decentralized Voting
none 0.0 0


In this tutorial, we will learn how to create a smart contract for decentralized voting. This means that anyone with an internet connection can vote without the need for a central authority. We will use Solidity, the programming language for Ethereum, to write the smart contract, and we will deploy it on a test network.


Before starting this tutorial, you should have a basic understanding of Ethereum, blockchain, and smart contracts. You should also have a development environment set up with a code editor and the necessary tools, such as Solidity and a test network. If you need help with these prerequisites, you can refer to the Ethereum documentation or other tutorials.

Tutorial Github repo link: GITHUB REPO


We will use Remix, an online IDE, for Solidity development, and the Rinkeby test network for this tutorial. We will also need a MetaMask wallet to interact with the test network. You can install MetaMask as a browser extension.

Getting Started

  • Step 1: Open Remix in your web browser.

Create a new file calledVoting.sol and copy the following code into it:

pragma solidity ^0.8.0;
contract Voting {
    mapping (address => bool) public hasVoted;
    mapping (string => uint256) public votes;
    string[] public candidates;
    constructor(string[] memory _candidates) {
        candidates = _candidates;
    function vote(string memory _candidate) public {
        require(!hasVoted[msg.sender], "You have already voted");
        require(validCandidate(_candidate), "Not a valid candidate");
        hasVoted[msg.sender] = true;
    function validCandidate(string memory _candidate) view public returns (bool) {
        for (uint i = 0; i < candidates.length; i++) {
            if (keccak256(bytes(candidates[i])) == keccak256(bytes(_candidate))) {
                return true;
        return false;
    function getVotes(string memory _candidate) view public returns (uint256) {
        return votes[_candidate];

This smart contract has a voting contract that stores the votes for different candidates. It has three mappings:

  1. has-voted: A boolean value that tracks whether an address has already been voted.
  2. votes: A mapping from the candidate’s name to the number of votes they have received.
  3. candidates: A string array that contains the names of the candidates.

The contract has four functions:

  1. constructor: A constructor that takes an array of candidate names as input and initializes the candidate’s array.
  2. vote: A function that allows users to vote for a candidate. It checks if the user has already voted, and if the candidate is valid, and then increments the vote count for that candidate.
  3. validCandidate: A function that checks if the candidate name is in the candidates’ array.
  4. get-votes: A function that returns the number of votes a candidate has received.
  • Step 2: Compile the smart contract by clicking the “Compile” button in Remix. Make sure there are no errors.

  • Step 3: Deploy the smart contract to the Rinkeby test network by clicking the “Deploy & Run Transactions” button in Remix.

Make sure you have connected to the Rinkeby network in MetaMask and have enough test Ether to pay for the deployment.

  • Step 4: Interact with the smart contract by calling the functions. You can do this in Remix by clicking on the “Voting” contract in the “Deployed Contracts” section.

You can also use the Remix console or write a client application that interacts with the smart contract using web3.js or other tools.


In conclusion, we have learned how to create a smart contract for decentralised voting using Solidity. We have also learned how to deploy the smart contract to a test network and interact with it using Remix and MetaMask.

With this knowledge, you can create your own decentralised voting applications and explore the possibilities of blockchain technology. By removing the need for a central authority, decentralized voting can increase transparency, reduce fraud, and empower individuals to have a say in important decisions.

Next Steps

Now that you have created a smart contract for decentralised voting, you can explore more advanced topics such as:

  • Adding more complex voting rules such as weighted voting or quadratic voting.
  • Implementing a user interface for the voting application using web3.js or other tools.
  • Deploying the smart contract to the Ethereum mainnet for real-world use.
  • Learning about other use cases for smart contracts such as decentralised finance (DeFi) or non-fungible tokens (NFTs).

About the Author

Imole Peter L.

A web3 enthusiast, content writer for web3 brands, visual artist, and seasoned author (Pen name: Sasani Eldis). Connect with me on LinkedIn


1 Like

Updated to include card name and description

1 Like

I will be reviewing this

I’m already reviewing this piece on the trello board @Kunaldawar

but this piece has to be reviewed on celo academy and over here I was the one who first said to be reviewing this.

Hi @Kunaldawar. I’m sorry for the confusion. I was the one who linked this card here as soon as I heard of the readiness of the academy. I already worked it on Trello and was in progress when academy launched. @joenyzio approved the card beforehand. @joenyzio also made comment in recent update to finish off the cards in the categories like mine on Trello that further ones (in request and Todo) will be handled here. Reagrds

@Kunaldawar @SasaniEldis This piece is already in publish on trello… so apparently It’s past reviewing

So how do we go about this @joenyzio , this piece is already in publish on the trello board

1 Like

Hi @SasaniEldis - my fault for the confusing process of migrating. We’ll be finished after today and everything can be done in the Academy. @Phenzic and @Kunaldawar if you have any suggestions for this post please leave them for @SasaniEldis and you can both invoice for reviewing this project. Thanks!

1 Like

I have fixed the Needed things in Post.

1 Like

@Phenzic do you want to suggest any changes in this if not I can publish this post

1 Like


I already made suggestions while it was in the Trello board…
It’s all ready for publish