WEB3DEV

Cover image for Construção do Nosso Primeiro Projeto Blockchain: um Contrato de Votação Blockchain
Isabela Curado Nehme
Isabela Curado Nehme

Posted on

Construção do Nosso Primeiro Projeto Blockchain: um Contrato de Votação Blockchain

https://res.cloudinary.com/practicaldev/image/fetch/s--mmlT3B5t--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8qlvukkzf3nuyxaf35j.jpg

Todos nós já ouvimos sobre as últimas eleições realizadas na Nigéria, como parece haver alegações de adulteração de votos eleitorais, erros na contagem de votos e tantas outras desculpas, esse foi o meu motivo para construir este projeto😂😂. Então, pensei 🤔 "Como seria se nosso sistema de votação nigeriano fosse baseado em blockchain", então decidi construir o projeto.

POR QUE UM SISTEMA DE VOTAÇÃO BLOCKCHAIN?

Caso você esteja se perguntando como um sistema de votação baseado em blockchain resolve os problemas do nosso sistema de votação tradicional, deixe-me responder às suas perguntas curiosas. Em primeiro lugar, a blockchain opera sem a necessidade mínima de confiança e é descentralizada, portanto, nenhum indivíduo tem o poder de controlar ou manipular os votos e, em segundo lugar, eu simplesmente adoro a ideia 😂😂.

O QUE VOU APRENDER COM ESTE PROJETO?

Você ganhará experiência prática sobre como funciona um contrato inteligente e como ele é implantado. Você também implementará o conhecimento adquirido em meu último tutorial sobre palavras-chave do Solidity.

Vamos lá! 🚀🚀🚀

CONSTRUINDO NOSSO CONTRATO INTELIGENTE

Primeiro de tudo, vá para o Remix. Remix é um IDE (ambiente de desenvolvimento integrado) online para escrever e implantar contratos inteligentes. Crie um novo arquivo chamado "Voting.sol" dentro do diretório de contratos.

https://res.cloudinary.com/practicaldev/image/fetch/s--Do0l8fIj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6t5wrs9bocundzs0w6at.png

O Sistema Blockchain

O começo de um novo capítulo😌.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract VotingSystem{
   // O resto do código vai aqui
}
Enter fullscreen mode Exit fullscreen mode

Estamos inicializando um novo contrato chamado VotingSystem que roda em versões do compilador Solidity 0.8.9 e superiores.

Criando Nossos Candidatos

Estaremos usando os três mosqueteiros das eleições nigerianas de 2023 😂😂, Atiku, Obi e Tinubu 🙌.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract VotingSystem{
   struct Candidate{
        string name;
        uint numberOfVotes;
    }
   mapping(uint => Candidate) candidates;
   constructor(){
        candidates[0] = Candidate("Tinubu", 0);
        candidates[1] = Candidate("Atiku", 0);
        candidates[2] = Candidate("Obi", 0);
    }
}
Enter fullscreen mode Exit fullscreen mode

Aqui, criamos uma struct candidato (Candidate) para conter o nome (name) e o número de votos (numberOfVotes) de cada candidato. Estamos mapeando um uint para nosso Candidate para controlar o número de candidatos que temos e definir automaticamente o seu número de votos como 0.

Lógica de Votação

Vamos resolver o problema da votação dupla e da manipulação de votos.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract VotingSystem{
   struct Candidate{
        string name;
        uint numberOfVotes;
   }
   mapping (address => bool) voterVoted;
   mapping(address => uint) votesPerVoter;
   mapping(uint => Candidate) candidates;
   constructor(){
        candidates[0] = Candidate("Tinubu", 0);
        candidates[1] = Candidate("Atiku", 0);
        candidates[2] = Candidate("Obi", 0);
        voterVoted[msg.sender] = false;
    }
   modifier notVoted {
        require(!voterVoted[msg.sender] || votesPerVoter[msg.sender] == 0, "Você já votou");
        _;
    }
}
Enter fullscreen mode Exit fullscreen mode

Criamos dois mapeamentos: voterVoted serve para verificar se um endereço já votou em um candidato antes e retorna um booleano, enquanto votesPerVoter garante que um endereço tenha apenas uma chance de votar. O modificador (modifier) é usado para implementar toda a lógica e será usado em uma função Vote (votar).

Função Vote

Vamos votar no candidato certo:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract VotingSystem{
   // O código que escrevemos anteriormente
   function vote(string memory _nameofCandidate) public notVoted returns (string memory) {
        bytes32 nameHash = keccak256(abi.encodePacked(_nameofCandidate));
        bytes32 tinubuHash = keccak256(abi.encodePacked("Tinubu"));
        bytes32 atikuHash = keccak256(abi.encodePacked("Atiku"));
        bytes32 obiHash = keccak256(abi.encodePacked("Obi"));
        if (nameHash == tinubuHash){
            candidates[0].numberOfVotes++;
        } else if(nameHash == atikuHash){
            candidates[1].numberOfVotes++;
        } else if(nameHash == obiHash){
            candidates[2].numberOfVotes++;
        }else {
        revert("Nome de candidato inválido");
        }
        voterVoted[msg.sender] = true;
        string memory Text = "Você já manifestou o seu voto";
        votesPerVoter[msg.sender]++;
        return Text;
    }
}
Enter fullscreen mode Exit fullscreen mode

Esta é a nossa função Vote, que é utilizada para emitir votos, ela recebe o nome do candidato (nameOfCandidate) em que o endereço que está votando. Como o Solidity não pode comparar duas strings juntas, geramos um hash do nome do nosso Candidate e do _nameofCandidate usando o algoritmo keccak256 e os comparamos, de modo que, se o nome do Candidate corresponder ao _nameofCandidate, a sua contagem de votos será aumentado em um, caso contrário, será revertido para nome de candidato inválido.

Obtendo os Votos do Nosso Candidato

Depois de votar, queremos ter certeza de que o candidato certo está liderando 🙈.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract VotingSystem{
   // Código escrito anteriormente
   function getVotes() public view returns( Candidate[] memory){
        Candidate[] memory candidateList = new Candidate[](3);
        candidateList[0] = candidates[0];
        candidateList[1] = candidates[1];
        candidateList[2] = candidates[2];
        return candidateList;
    }
}
Enter fullscreen mode Exit fullscreen mode

Esta função permite que qualquer pessoa possa obter a contagem de votos de todos os Candidatos e a retorna em formato de array.

Implantando Nosso Contrato

É hora de lançar nosso projeto para o mundo 😌.

https://res.cloudinary.com/practicaldev/image/fetch/s--AcxCmxtp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ltbu2lr06te7txy05vso.png

Vá em frente e clique no botão Compile (compilar) para compilar o contrato inteligente Solidity na página do compilador solidity.

https://res.cloudinary.com/practicaldev/image/fetch/s--Im4BTW-p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxvij6r5f6mlm9hg97nf.png

Assim, o Remix nos dá 15 endereços com 100 ETH falsos para testar nossos contratos inteligentes em diferentes redes de teste Ethereum. Agora, vamos implantar nosso contrato em um desses endereços. Clique no botão Deploy (implantar) para implantar nosso contrato. O endereço após AT é chamado de endereço do contrato. Podemos usá-lo para interagir com nosso contrato usando uma biblioteca de cliente como web3.js, ethers.js, web3.py, etc.

Conclusão

Concluindo, nossa jornada através do desenvolvimento de um sistema de votação baseado em blockchain foi tanto informativa quanto divertida. Embarcamos nesse projeto com o objetivo de abordar os desafios e preocupações que rodeiam os sistemas de votação tradicionais, particularmente na Nigéria. As questões de adulteração de votos, erros de contagem e outras desculpas que atormentaram as eleições anteriores serviram de catalisador para esse empenho 😂😂.

Ao criar um sistema de votação blockchain, introduzimos uma abordagem descentralizada e sem necessidade mínima de confiança, onde nenhuma entidade única pode manipular ou controlar os votos. Isso não só proporciona transparência, mas também salvaguarda a integridade do processo eleitoral. E não vamos esquecer, fizemos isso porque, bem, adoramos a ideia 😂😂.

Ao longo desta jornada, você teve a oportunidade de adquirir experiência prática no trabalho com contratos inteligentes e na implantação deles. Você também aplicou o conhecimento de nosso tutorial anterior sobre palavras-chave Solidity, aprimorando ainda mais suas habilidades de desenvolvimento de blockchain.

Assim, ao encerrarmos esta aventura, espero que você não só tenha gostado da jornada, como também tenha obtido conhecimentos valiosos sobre como construir seu primeiro projeto de blockchain e implantá-lo com sucesso. Com suas novas habilidades, você está bem equipado para explorar mais possibilidades interessantes no mundo da tecnologia blockchain. Até a próxima, boa codificação! 😌🚀🔗

Este artigo foi escrito por feranmiodugbemi e traduzido por Isabela Curado Nehme. Seu original pode ser lido aqui.

Top comments (0)