第3課

Implementación del recuento de votos y anuncio de resultados

En esta lección, implementaremos las partes finales de nuestro sistema de votación descentralizado: contar los votos y anunciar el resultado. Esto implicará ampliar nuestro contrato de votantes por última vez y crear funciones para calcular la propuesta ganadora.

Ampliación del contrato de votantes

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;
    }
}

Comprender el código

Te explicamos las nuevas incorporaciones:

  1. 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.

  2. 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.

Compilación y prueba

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.

Cómo hacerlo:

  1. Implementación: Primero, haga clic en la pestaña "Implementar y ejecutar transacciones" en Remix IDE. Es el que está debajo del ícono del compilador Solidity. Asegúrate de estar en el entorno "JavaScript VM". Luego, haga clic en el botón "Implementar".
  2. Registro de votantes: una vez que se implemente el contrato, lo verá en la sección "Contratos implementados". Haga clic en la flecha para expandirla. Allí encontrará todas las funciones de nuestro contrato enumeradas.
  3. Para registrar votantes, busque la función registrarVoter. Dado que hemos programado nuestro contrato para registrar la cuenta que llama a esta función como votante, puede cambiar de cuenta en el menú desplegable "Cuenta" en la pestaña "Implementar y ejecutar transacciones". Una vez que haya seleccionado una cuenta, haga clic en la función registrarseVotante. Repita este paso para cada cuenta que desee registrar como votante.
  4. Agregar propuestas: para agregar propuestas, busque la función addProposal. Ingrese el nombre de la propuesta en el cuadro de entrada al lado de la función y haga clic en la función. Repita este paso para cada propuesta que desee agregar.
  5. Votación: para votar, cambie a una cuenta de votante y busque la función de votación. Ingrese el índice de la propuesta (el orden en que la agregó, comenzando desde 0) que desea votar en el cuadro de entrada al lado de la función y haga clic en la función. Repita este paso para cada votante.
  6. Verificar al ganador: después de que todos los votantes hayan emitido sus votos, puede verificar el ganador. Busque la función ganadorName y haga clic en ella. El nombre de la propuesta ganadora se mostrará en la consola en la parte inferior de la pantalla.
  7. Recuerde, todas las acciones en la cadena de bloques (incluidas las de prueba en Remix) son transacciones. Puede expandir los detalles de la transacción en la consola para ver más información, como el costo de la transacción y los datos. Es una buena práctica verificar esta información para comprender mejor cómo interactúa su contrato con la cadena de bloques.

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!

免責聲明
* 投資有風險,入市須謹慎。本課程不作為投資理財建議。
* 本課程由入駐Gate Learn的作者創作,觀點僅代表作者本人,絕不代表Gate Learn讚同其觀點或證實其描述。
目錄
第3課

Implementación del recuento de votos y anuncio de resultados

En esta lección, implementaremos las partes finales de nuestro sistema de votación descentralizado: contar los votos y anunciar el resultado. Esto implicará ampliar nuestro contrato de votantes por última vez y crear funciones para calcular la propuesta ganadora.

Ampliación del contrato de votantes

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;
    }
}

Comprender el código

Te explicamos las nuevas incorporaciones:

  1. 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.

  2. 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.

Compilación y prueba

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.

Cómo hacerlo:

  1. Implementación: Primero, haga clic en la pestaña "Implementar y ejecutar transacciones" en Remix IDE. Es el que está debajo del ícono del compilador Solidity. Asegúrate de estar en el entorno "JavaScript VM". Luego, haga clic en el botón "Implementar".
  2. Registro de votantes: una vez que se implemente el contrato, lo verá en la sección "Contratos implementados". Haga clic en la flecha para expandirla. Allí encontrará todas las funciones de nuestro contrato enumeradas.
  3. Para registrar votantes, busque la función registrarVoter. Dado que hemos programado nuestro contrato para registrar la cuenta que llama a esta función como votante, puede cambiar de cuenta en el menú desplegable "Cuenta" en la pestaña "Implementar y ejecutar transacciones". Una vez que haya seleccionado una cuenta, haga clic en la función registrarseVotante. Repita este paso para cada cuenta que desee registrar como votante.
  4. Agregar propuestas: para agregar propuestas, busque la función addProposal. Ingrese el nombre de la propuesta en el cuadro de entrada al lado de la función y haga clic en la función. Repita este paso para cada propuesta que desee agregar.
  5. Votación: para votar, cambie a una cuenta de votante y busque la función de votación. Ingrese el índice de la propuesta (el orden en que la agregó, comenzando desde 0) que desea votar en el cuadro de entrada al lado de la función y haga clic en la función. Repita este paso para cada votante.
  6. Verificar al ganador: después de que todos los votantes hayan emitido sus votos, puede verificar el ganador. Busque la función ganadorName y haga clic en ella. El nombre de la propuesta ganadora se mostrará en la consola en la parte inferior de la pantalla.
  7. Recuerde, todas las acciones en la cadena de bloques (incluidas las de prueba en Remix) son transacciones. Puede expandir los detalles de la transacción en la consola para ver más información, como el costo de la transacción y los datos. Es una buena práctica verificar esta información para comprender mejor cómo interactúa su contrato con la cadena de bloques.

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!

免責聲明
* 投資有風險,入市須謹慎。本課程不作為投資理財建議。
* 本課程由入駐Gate Learn的作者創作,觀點僅代表作者本人,絕不代表Gate Learn讚同其觀點或證實其描述。