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;
}
}
Expliquons les nouveaux ajouts :
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.
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.
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.
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 !
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;
}
}
Expliquons les nouveaux ajouts :
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.
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.
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.
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 !