Beginnen wir damit, die Funktion winningProposal
zu unserem Vertrag hinzuzufügen. Diese Funktion durchläuft alle Vorschläge und gibt denjenigen mit den meisten Stimmen zurück. Darüber hinaus erstellen wir eine Funktion winnerName
, um den Namen des Gewinnervorschlags zurückzugeben. Hier ist die endgültige Fassung unseres Vertrages:
Solidity
// SPDX-License-Identifier: GPL-3.0
Pragma Solidity >=0.7.0 <0.9.0;
Vertrag Wähler {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] öffentliche Vorschläge;
Mapping(Adresse => Person) öffentliche Wähler;
Funktion registerVoter() öffentlich {
voters[msg.sender].voted = false;
}
Funktion addProposal(string Memory _name) öffentlich {
proposals.push(Proposal(_name, 0));
}
Funktion vote(uint _proposal) öffentlich {
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;
}
Funktion WinningProposal() Public View gibt (uint WinningProposal_) {
uint WinningVoteCount = 0;
for (uint p = 0; p < Proposals.length; p++) {
if (proposals[p].voteCount > WinningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
Funktion WinnerName() öffentliche Ansicht gibt (String Memory WinnerName_) zurück {
winnerName_ = proposals[winningProposal()].name;
}
}
Lassen Sie uns die neuen Ergänzungen erklären:
Funktion „Gewinnvorschlag“: Diese Funktion durchläuft alle Vorschläge und findet den Vorschlag mit der höchsten Stimmenzahl. Es gibt den Index dieses Vorschlags im proposals
Array zurück. Es handelt sich um eine view
, das heißt, sie ändert den Status des Vertrags nicht und liest nur die Daten.
Funktion „Gewinnername“: Diese Funktion ruft die Funktion winningProposal
auf, um den Index des Gewinnervorschlags abzurufen, und gibt dann den Namen dieses Vorschlags zurück.
Kompilieren Sie Ihren Vertrag, indem Sie auf das Solidity-Compiler-Symbol in der linken Seitenleiste und dann auf die Schaltfläche „Kompilieren“ klicken.
Stellen Sie Ihren Vertrag auf der Registerkarte „Transaktionen bereitstellen und ausführen“ bereit und interagieren Sie mit ihm. Registrieren Sie einige Wähler, fügen Sie einige Vorschläge hinzu, geben Sie Ihre Stimmen ab und überprüfen Sie schließlich den Gewinner.
In der nächsten Lektion besprechen wir Vertragsinteraktionen und Ereignisprotokollierung. Wir erfahren, wie Verträge miteinander interagieren können und wie man Aktivitäten auf der Blockchain protokolliert und überwacht. Herzlichen Glückwunsch zum Aufbau Ihres ersten dezentralen Abstimmungssystems auf Ethereum!
Beginnen wir damit, die Funktion winningProposal
zu unserem Vertrag hinzuzufügen. Diese Funktion durchläuft alle Vorschläge und gibt denjenigen mit den meisten Stimmen zurück. Darüber hinaus erstellen wir eine Funktion winnerName
, um den Namen des Gewinnervorschlags zurückzugeben. Hier ist die endgültige Fassung unseres Vertrages:
Solidity
// SPDX-License-Identifier: GPL-3.0
Pragma Solidity >=0.7.0 <0.9.0;
Vertrag Wähler {
struct Person {
bool voted;
uint vote;
}
struct Proposal {
string name;
uint voteCount;
}
Proposal[] öffentliche Vorschläge;
Mapping(Adresse => Person) öffentliche Wähler;
Funktion registerVoter() öffentlich {
voters[msg.sender].voted = false;
}
Funktion addProposal(string Memory _name) öffentlich {
proposals.push(Proposal(_name, 0));
}
Funktion vote(uint _proposal) öffentlich {
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;
}
Funktion WinningProposal() Public View gibt (uint WinningProposal_) {
uint WinningVoteCount = 0;
for (uint p = 0; p < Proposals.length; p++) {
if (proposals[p].voteCount > WinningVoteCount) {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
Funktion WinnerName() öffentliche Ansicht gibt (String Memory WinnerName_) zurück {
winnerName_ = proposals[winningProposal()].name;
}
}
Lassen Sie uns die neuen Ergänzungen erklären:
Funktion „Gewinnvorschlag“: Diese Funktion durchläuft alle Vorschläge und findet den Vorschlag mit der höchsten Stimmenzahl. Es gibt den Index dieses Vorschlags im proposals
Array zurück. Es handelt sich um eine view
, das heißt, sie ändert den Status des Vertrags nicht und liest nur die Daten.
Funktion „Gewinnername“: Diese Funktion ruft die Funktion winningProposal
auf, um den Index des Gewinnervorschlags abzurufen, und gibt dann den Namen dieses Vorschlags zurück.
Kompilieren Sie Ihren Vertrag, indem Sie auf das Solidity-Compiler-Symbol in der linken Seitenleiste und dann auf die Schaltfläche „Kompilieren“ klicken.
Stellen Sie Ihren Vertrag auf der Registerkarte „Transaktionen bereitstellen und ausführen“ bereit und interagieren Sie mit ihm. Registrieren Sie einige Wähler, fügen Sie einige Vorschläge hinzu, geben Sie Ihre Stimmen ab und überprüfen Sie schließlich den Gewinner.
In der nächsten Lektion besprechen wir Vertragsinteraktionen und Ereignisprotokollierung. Wir erfahren, wie Verträge miteinander interagieren können und wie man Aktivitäten auf der Blockchain protokolliert und überwacht. Herzlichen Glückwunsch zum Aufbau Ihres ersten dezentralen Abstimmungssystems auf Ethereum!