Comencemos agregando la función winningProposal
a nuestro contrato. Esta función iterará sobre todas las propuestas y devolverá la que tenga más votos. Además, crearemos una función winnerName
para devolver el nombre de la propuesta ganadora. Aquí está la versión final de nuestro contrato:
Solidez
// Identificador de licencia SPDX: GPL-3.0
pragma solidez >=0.7.0 <0.9.0;
contrato Votante {
struct Persona {
bool voted;
uint vote;
}
struct Propuesta {
string name;
uint voteCount;
}
Propuesta[] propuestas públicas;
mapeo (dirección => Persona) votantes públicos;
función registrarVoter() público {
voters[msg.sender].voted = false;
}
función addProposal(cadena memoria _nombre) público {
proposals.push(Proposal(_name, 0));
}
función votar(uint _propuesta) público {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
función winProposal() vista pública devuelve (uint winProposal_) {
uint winVoteCount = 0;
para (uint p = 0; p < propuestas.longitud; p++) {
if (propuestas[p].voteCount > winVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
función nombreganador() vista pública devuelve (memoria de cadena nombreganador_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Te explicamos las nuevas incorporaciones:
Función de propuesta ganadora: esta función itera sobre todas las propuestas y encuentra la que tiene el mayor recuento de votos. Devuelve el índice de esta propuesta en la matriz proposals
. Es una función de view
, lo que significa que no modifica el estado del contrato y solo lee los datos.
Función de nombre del ganador: esta función llama a la función winningProposal
para obtener el índice de la propuesta ganadora y luego devuelve el nombre de esta propuesta.
Compile su contrato haciendo clic en el icono del compilador Solidity en la barra lateral izquierda y luego haciendo clic en el botón "Compilar".
Implemente su contrato en la pestaña "Implementar y ejecutar transacciones" e interactúe con él. Registre algunos votantes, agregue algunas propuestas, emita sus votos y, finalmente, verifique el ganador.
En la próxima lección, analizaremos las interacciones de contratos y el registro de eventos. Aprenderemos cómo los contratos pueden interactuar entre sí y cómo registrar y monitorear actividades en blockchain. ¡Felicitaciones por construir su primer sistema de votación descentralizado en Ethereum!
Comencemos agregando la función winningProposal
a nuestro contrato. Esta función iterará sobre todas las propuestas y devolverá la que tenga más votos. Además, crearemos una función winnerName
para devolver el nombre de la propuesta ganadora. Aquí está la versión final de nuestro contrato:
Solidez
// Identificador de licencia SPDX: GPL-3.0
pragma solidez >=0.7.0 <0.9.0;
contrato Votante {
struct Persona {
bool voted;
uint vote;
}
struct Propuesta {
string name;
uint voteCount;
}
Propuesta[] propuestas públicas;
mapeo (dirección => Persona) votantes públicos;
función registrarVoter() público {
voters[msg.sender].voted = false;
}
función addProposal(cadena memoria _nombre) público {
proposals.push(Proposal(_name, 0));
}
función votar(uint _propuesta) público {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
función winProposal() vista pública devuelve (uint winProposal_) {
uint winVoteCount = 0;
para (uint p = 0; p < propuestas.longitud; p++) {
if (propuestas[p].voteCount > winVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
función nombreganador() vista pública devuelve (memoria de cadena nombreganador_) {
winnerName_ = proposals[winningProposal()].name;
}
}
Te explicamos las nuevas incorporaciones:
Función de propuesta ganadora: esta función itera sobre todas las propuestas y encuentra la que tiene el mayor recuento de votos. Devuelve el índice de esta propuesta en la matriz proposals
. Es una función de view
, lo que significa que no modifica el estado del contrato y solo lee los datos.
Función de nombre del ganador: esta función llama a la función winningProposal
para obtener el índice de la propuesta ganadora y luego devuelve el nombre de esta propuesta.
Compile su contrato haciendo clic en el icono del compilador Solidity en la barra lateral izquierda y luego haciendo clic en el botón "Compilar".
Implemente su contrato en la pestaña "Implementar y ejecutar transacciones" e interactúe con él. Registre algunos votantes, agregue algunas propuestas, emita sus votos y, finalmente, verifique el ganador.
En la próxima lección, analizaremos las interacciones de contratos y el registro de eventos. Aprenderemos cómo los contratos pueden interactuar entre sí y cómo registrar y monitorear actividades en blockchain. ¡Felicitaciones por construir su primer sistema de votación descentralizado en Ethereum!