Lesson 3

Mise en œuvre du décompte des voix et de l'annonce des résultats

Dans cette leçon, nous mettrons en œuvre les dernières parties de notre système de vote décentralisé : le décompte des votes et l'annonce du résultat. Il s'agira d'étendre une dernière fois notre contrat Voter et de créer des fonctions permettant de calculer la proposition gagnante.

Élargir le contrat de l'électeur

Commençons par ajouter la fonction winningProposal à notre contrat. Cette fonction passe en revue toutes les propositions et renvoie celle qui a obtenu le plus grand nombre de votes. En outre, nous créerons une fonction winnerName qui renverra le nom de la proposition gagnante. Voici la version finale de notre contrat :

Solidity
// SPDX-License-Identifier : GPL-3.0
pragma solidity >=0.7.0 <0.9.0 ;

contract Voter {
 struct Person {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] public proposals ;
 mapping(address => Person) public voters ;

 function registerVoter() public {
        voters[msg.sender].voted = false;
    }

    function addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    function vote(uint _proposal) public { 
     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; 
    }

    function winningProposal() public view returns (uint winningProposal_) {
 uint winningVoteCount = 0 ;
 for (uint p = 0 ; p < proposals.length ; p++) {
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    function winnerName() public view returns (string memory winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Comprendre le code

Expliquons les nouveaux ajouts :

  1. Fonction de la proposition gagnante : Cette fonction passe en revue toutes les propositions et trouve celle qui a obtenu le plus grand nombre de voix. Elle renvoie l'index de cette proposition dans le tableau des propositions. Il s'agit d'une fonction de vue, ce qui signifie qu'elle ne modifie pas l'état du contrat et ne fait que lire les données.

  2. Fonction "Nom du gagnant" : Cette fonction appelle la fonction winningProposal pour obtenir l'index de la proposition gagnante et renvoie ensuite le nom de cette proposition.

Compilation et tests

Compilez votre contrat en cliquant sur l'icône du compilateur Solidity dans la barre latérale de gauche, puis en cliquant sur le bouton "Compiler".

Déployez votre contrat dans l'onglet "Déployer & Exécuter les transactions" et interagissez avec lui. Inscrivez quelques électeurs, ajoutez quelques propositions, votez, et enfin, vérifiez le gagnant.

Comment procéder :

  1. Déploiement : Tout d'abord, cliquez sur l'onglet "Deploy & Run Transactions" dans l'IDE Remix. C'est celui qui se trouve sous l'icône du compilateur Solidity. Assurez-vous que vous êtes dans l'environnement "JavaScript VM". Cliquez ensuite sur le bouton "Déployer".
  2. Enregistrement des électeurs : Une fois le contrat déployé, vous le verrez dans la section "Contrats déployés". Cliquez sur la flèche pour la développer. Vous y trouverez toutes les fonctions de notre contrat.
  3. Pour inscrire les électeurs, recherchez la fonction registerVoter. Puisque nous avons programmé notre contrat pour que le compte qui appelle cette fonction soit enregistré comme électeur, vous pouvez changer de compte dans le menu déroulant "Compte" de l'onglet "Déployer & Exécuter des transactions". Une fois que vous avez sélectionné un compte, cliquez sur la fonction d'inscription d'un électeur. Répétez cette étape pour chaque compte que vous souhaitez inscrire comme électeur.
  4. Ajouter des propositions : Pour ajouter des propositions, recherchez la fonction addProposal. Saisissez le nom de la proposition dans la zone de saisie située à côté de la fonction et cliquez sur la fonction. Répétez cette étape pour chaque proposition que vous souhaitez ajouter.
  5. Voter : Pour voter, connectez-vous à un compte d'électeur et trouvez la fonction de vote. Saisissez l'indice de la proposition (l'ordre dans lequel vous l'avez ajoutée, en commençant par 0) pour laquelle vous souhaitez voter dans le champ de saisie situé à côté de la fonction et cliquez sur la fonction. Répétez cette étape pour chaque électeur.
  6. Vérification du gagnant : Une fois que tous les électeurs ont voté, vous pouvez vérifier le nom du gagnant. Recherchez la fonction winnerName et cliquez dessus. Le nom de la proposition gagnante sera affiché dans la console en bas de l'écran.
  7. Rappelez-vous que toutes les actions dans la blockchain (y compris les actions de test dans Remix) sont des transactions. Vous pouvez développer les détails de la transaction dans la console pour voir plus d'informations, comme le coût de la transaction et les données. C'est une bonne pratique de vérifier ces informations pour mieux comprendre comment votre contrat interagit avec la blockchain.

Dans la prochaine leçon, nous aborderons les interactions contractuelles et l'enregistrement des événements. Nous apprendrons comment les contrats peuvent interagir entre eux et comment enregistrer et contrôler les activités sur la blockchain. Félicitations pour avoir construit votre premier système de vote décentralisé sur Ethereum !

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.
Catalog
Lesson 3

Mise en œuvre du décompte des voix et de l'annonce des résultats

Dans cette leçon, nous mettrons en œuvre les dernières parties de notre système de vote décentralisé : le décompte des votes et l'annonce du résultat. Il s'agira d'étendre une dernière fois notre contrat Voter et de créer des fonctions permettant de calculer la proposition gagnante.

Élargir le contrat de l'électeur

Commençons par ajouter la fonction winningProposal à notre contrat. Cette fonction passe en revue toutes les propositions et renvoie celle qui a obtenu le plus grand nombre de votes. En outre, nous créerons une fonction winnerName qui renverra le nom de la proposition gagnante. Voici la version finale de notre contrat :

Solidity
// SPDX-License-Identifier : GPL-3.0
pragma solidity >=0.7.0 <0.9.0 ;

contract Voter {
 struct Person {
        bool voted;  
        uint vote;   
    }

    struct Proposal {
        string name;   
        uint voteCount; 
    }

    Proposal[] public proposals ;
 mapping(address => Person) public voters ;

 function registerVoter() public {
        voters[msg.sender].voted = false;
    }

    function addProposal(string memory _name) public {
        proposals.push(Proposal(_name, 0));
    }

    function vote(uint _proposal) public { 
     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; 
    }

    function winningProposal() public view returns (uint winningProposal_) {
 uint winningVoteCount = 0 ;
 for (uint p = 0 ; p < proposals.length ; p++) {
 if (proposals[p].voteCount > winningVoteCount) {
                winningVoteCount = proposals[p].voteCount;
                winningProposal_ = p;
            }
        }
    }

    function winnerName() public view returns (string memory winnerName_) {
        winnerName_ = proposals[winningProposal()].name;
    }
}

Comprendre le code

Expliquons les nouveaux ajouts :

  1. Fonction de la proposition gagnante : Cette fonction passe en revue toutes les propositions et trouve celle qui a obtenu le plus grand nombre de voix. Elle renvoie l'index de cette proposition dans le tableau des propositions. Il s'agit d'une fonction de vue, ce qui signifie qu'elle ne modifie pas l'état du contrat et ne fait que lire les données.

  2. Fonction "Nom du gagnant" : Cette fonction appelle la fonction winningProposal pour obtenir l'index de la proposition gagnante et renvoie ensuite le nom de cette proposition.

Compilation et tests

Compilez votre contrat en cliquant sur l'icône du compilateur Solidity dans la barre latérale de gauche, puis en cliquant sur le bouton "Compiler".

Déployez votre contrat dans l'onglet "Déployer & Exécuter les transactions" et interagissez avec lui. Inscrivez quelques électeurs, ajoutez quelques propositions, votez, et enfin, vérifiez le gagnant.

Comment procéder :

  1. Déploiement : Tout d'abord, cliquez sur l'onglet "Deploy & Run Transactions" dans l'IDE Remix. C'est celui qui se trouve sous l'icône du compilateur Solidity. Assurez-vous que vous êtes dans l'environnement "JavaScript VM". Cliquez ensuite sur le bouton "Déployer".
  2. Enregistrement des électeurs : Une fois le contrat déployé, vous le verrez dans la section "Contrats déployés". Cliquez sur la flèche pour la développer. Vous y trouverez toutes les fonctions de notre contrat.
  3. Pour inscrire les électeurs, recherchez la fonction registerVoter. Puisque nous avons programmé notre contrat pour que le compte qui appelle cette fonction soit enregistré comme électeur, vous pouvez changer de compte dans le menu déroulant "Compte" de l'onglet "Déployer & Exécuter des transactions". Une fois que vous avez sélectionné un compte, cliquez sur la fonction d'inscription d'un électeur. Répétez cette étape pour chaque compte que vous souhaitez inscrire comme électeur.
  4. Ajouter des propositions : Pour ajouter des propositions, recherchez la fonction addProposal. Saisissez le nom de la proposition dans la zone de saisie située à côté de la fonction et cliquez sur la fonction. Répétez cette étape pour chaque proposition que vous souhaitez ajouter.
  5. Voter : Pour voter, connectez-vous à un compte d'électeur et trouvez la fonction de vote. Saisissez l'indice de la proposition (l'ordre dans lequel vous l'avez ajoutée, en commençant par 0) pour laquelle vous souhaitez voter dans le champ de saisie situé à côté de la fonction et cliquez sur la fonction. Répétez cette étape pour chaque électeur.
  6. Vérification du gagnant : Une fois que tous les électeurs ont voté, vous pouvez vérifier le nom du gagnant. Recherchez la fonction winnerName et cliquez dessus. Le nom de la proposition gagnante sera affiché dans la console en bas de l'écran.
  7. Rappelez-vous que toutes les actions dans la blockchain (y compris les actions de test dans Remix) sont des transactions. Vous pouvez développer les détails de la transaction dans la console pour voir plus d'informations, comme le coût de la transaction et les données. C'est une bonne pratique de vérifier ces informations pour mieux comprendre comment votre contrat interagit avec la blockchain.

Dans la prochaine leçon, nous aborderons les interactions contractuelles et l'enregistrement des événements. Nous apprendrons comment les contrats peuvent interagir entre eux et comment enregistrer et contrôler les activités sur la blockchain. Félicitations pour avoir construit votre premier système de vote décentralisé sur Ethereum !

Disclaimer
* Crypto investment involves significant risks. Please proceed with caution. The course is not intended as investment advice.
* The course is created by the author who has joined Gate Learn. Any opinion shared by the author does not represent Gate Learn.