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
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í
}
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);
}
}
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");
_;
}
}
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;
}
}
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;
}
}
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😌
Ve y haz click en el botón compile para compilar el contrato inteligente de Solidity en la página del compilador de Solidity
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)