WEB3DEV Español

Cover image for Construyendo nuestro primer proyecto blockchain: Un contrato de votación blockchain
Hector
Hector

Posted on

Construyendo nuestro primer proyecto blockchain: Un contrato de votación blockchain

Todos hemos escuchado sobre la última elección en Nigeria sobre cómo hay alegatos de manipulación con los votos electorales, errores en el recuento de votos y muchas otras excusas y bueno, esa fue mi motivación para construir este proyecto 😂😂. Así que pensé 🤔“¿Cómo sería si nuestro sistema de votación en Nigeria fuese basado en la blockchain ?”, así que decidí construir el proyecto.

¿Por qué un sistema de votación blockchain?

En caso que te preguntes cómo un sistema de votación basado en la blockchain resuelve los problemas en nuestro sistema de votación tradicional, déjame responder tus preguntas curiosas. Antes que nada, la blockchain es confiada y descentralizada, así que ningún individuo tiene el poder de controlar o manipular los votos y en segundo lugar, me gusta la idea😂😂.

¿Qué aprenderé de este proyecto?

Ganarás experiencia práctica sobre cómo un trabajo inteligente funciona y cómo se despliega. También implementarás el conocimiento que ganaste desde mi último tutorial sobre los keywords de Solidity.

Vamos a ello🚀🚀🚀

Construyendo nuestro Contrato Inteligente

Primero que nada, vamos a remix. Remix es un IDE online para escribir y desplegar contratos inteligentes. Crea un nuevo archivo llamado Voting.sol dentro del directorio contracts

Image description

El sistema Blockchain

El comienzo de un nuevo capítulo😌

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

contract VotingSystem{
   //El resto del código va aquí
}
Enter fullscreen mode Exit fullscreen mode

Vamos a inicializar un nuevo contrato llamado VotingSystem que se ejecuta en las versiones del compilador Solidity 0.8.9 y arriba.

Crear nuestros candidatos

Usaremos a los tres mosqueteros de la elección de Nigeria del 2023😂😂, Atiku, Obi y 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

Aquí, creamos una estructura Candidate para mantener el name y el numberOfVotes de cada candidato. Estamos mapeando un uint a nuestro Candidate para mantener el rastreo del número de candidatos que tenemos y automáticamente establecer sus números de votos a 0.

Lógica de la Votación

Vamos a solventar el problema de la doble votación y la manipulación del voto

// 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, "You have already voted");
        _;
    }
}
Enter fullscreen mode Exit fullscreen mode

Creamos dos mapeos, voterVoted es para revisar si una dirección ya ha votado por un candidato antes y regresa un boolean mientras votesPerVoter asegura que una dirección sólo tenga 1 chance de votar. El modifier es usado para implementar toda la lógica y será usado para la función Vote.

Función Vote

Vamos a votar por el candidato correcto

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

contract VotingSystem{
   // El código que hemos escrito antes
   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("Invalid candidate name");
        }
        voterVoted[msg.sender] = true;
        string memory Text = "You have already casted your vote";
        votesPerVoter[msg.sender]++;
        return Text;
    }
}
Enter fullscreen mode Exit fullscreen mode

Esta es nuestra función vote, el cual es usado para hacer votos. Toma el nameOfCandidate que la dirección está votando. Ya que Solidity no puede comparar dos cadenas juntas, hemos generado el hash de nuestro Candidate y el _nameOfCandidate usando el algoritmo keccak256 y los compara, así que cualquier nombre del Candidate coincida el _nameOfCandidate la cuenta del voto se incrementa por uno, si no se revierte a Invalid candidate name.

Obteniendo los votos de nuestro candidato

Luego de la votación, queremos asegurarnos que el candidato correcto 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 función permite que cualquiera retire el recuento de votos para todos los Candidates y lo regrese en un formato array.

Desplegar nuestro contrato

Es hora de desencadenar nuestro proyecto al mundo😌

Image description

Ve y haz click en el botón compile para compilar el contrato inteligente de Solidity en la página del compilador de Solidity

Image description

Así que, remix nos da 15 direcciones con 100 ETH falsos para probar nuestros contratos inteligentes en diferentes redes Ethereum de pruebas. Ahora, desplegaremos nuestro contrato a una de esas direcciones. Haz click en Deploy para desplegar nuestro contrato. La dirección luego de AT se llama la dirección del contrato. Podemos usarlo para interactuar con nuestro contrato, usando la biblioteca del cliente como web3.js, ether.js, web3.py, etc.

Conclusión

En conclusión, nuestro recorrido a través del desarrollo de un sistema de votación basado en la blockchain ha sido informativo y entretenido. Nos embarcamos en este proyecto con la intención de resolver los retos y preocupaciones alrededor de los sistemas de votación tradicionales, particularmente en Nigeria. Los problemas de la manipulación de votos, errores de conteo y otras excusas que han plagado las últimas elecciones sirvieron como el catalizador de esta tarea😂😂.

Al crear un sistema de votación blockchain, hemos introducido un acercamiento descentralizado y confiado, donde ninguna entidad puede manipular el control de los votos. Esto no sólo provee transparencia pero también garantiza la integridad del proceso electoral. Y no nos olvidemos, lo hicimos porque bueno, nos gusta la idea😂😂.

A través de este recorrido, has tenido la oportunidad para ganar experiencia práctica en trabajar con contratos inteligentes y desplegarlos. También has aplicado el conocimiento de nuestros tutoriales anteriores de los keywords de Solidity, mejorando aún más tus habilidades de desarrollo de blockchain.

Así que, mientras terminamos esta aventura, espero que no sólo hayas disfrutado el recorrido pero que también hayas ganado conocimiento valioso sobre construir tu primer proyecto blockchain y desplegarlo exitosamente. Con tus nuevas habilidades, estás bien equipado para explorar posibilidades más emocionantes en el mundo de la tecnología blockchain. Hasta la próxima, ¡feliz codeo!😌🚀🔗

Este artículo es una traducción de feranmiodugbemi, hecha por Héctor Botero. Puedes encontrar el artículo original aquí.
Sería genial escucharte en nuestro Discord, puedes contarnos tus ideas, comentarios, sugerencias y dejarnos saber lo que necesitas.
Si prefieres puedes escribirnos a @web3dev_es en Twitter.

Discussion (0)