Lektion 3

Implementierung der Stimmauszählung und Ergebnisbekanntgabe

In dieser Lektion werden wir die letzten Teile unseres dezentralen Abstimmungssystems implementieren: Stimmenauszählung und Bekanntgabe des Ergebnisses. Dazu müssen wir unseren Voter-Vertrag ein letztes Mal erweitern und Funktionen zur Berechnung des Gewinnervorschlags erstellen.

Erweiterung des Wählervertrags

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

Den Kodex verstehen

Lassen Sie uns die neuen Ergänzungen erklären:

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

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

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.

Wie es geht:

  1. Bereitstellung: Klicken Sie zunächst in der Remix-IDE auf die Registerkarte „Transaktionen bereitstellen und ausführen“. Es ist das Symbol unter dem Solidity-Compiler-Symbol. Stellen Sie sicher, dass Sie sich in der „JavaScript VM“-Umgebung befinden. Klicken Sie dann auf die Schaltfläche „Bereitstellen“.
  2. Wähler registrieren: Sobald der Vertrag bereitgestellt wurde, wird er im Abschnitt „Bereitgestellte Verträge“ angezeigt. Klicken Sie auf den Pfeil, um ihn zu erweitern. Dort finden Sie alle Funktionen unseres Vertrags aufgelistet.
  3. Um Wähler zu registrieren, suchen Sie die Funktion „registerVoter“. Da wir unseren Vertrag so programmiert haben, dass das Konto, das diese Funktion aufruft, als Wähler registriert wird, können Sie im Dropdown-Menü „Konto“ auf der Registerkarte „Transaktionen bereitstellen und ausführen“ zwischen Konten wechseln. Nachdem Sie ein Konto ausgewählt haben, klicken Sie auf die Funktion „RegisterVoter“. Wiederholen Sie diesen Schritt für jedes Konto, das Sie als Wähler registrieren möchten.
  4. Vorschläge hinzufügen: Um Vorschläge hinzuzufügen, suchen Sie die Funktion addProposal. Geben Sie den Vorschlagsnamen in das Eingabefeld neben der Funktion ein und klicken Sie auf die Funktion. Wiederholen Sie diesen Schritt für jeden Vorschlag, den Sie hinzufügen möchten.
  5. Abstimmung: Um abzustimmen, wechseln Sie zu einem Wählerkonto und suchen Sie die Abstimmungsfunktion. Geben Sie den Index des Vorschlags (die Reihenfolge, in der Sie ihn hinzugefügt haben, beginnend bei 0), für den Sie stimmen möchten, in das Eingabefeld neben der Funktion ein und klicken Sie auf die Funktion. Wiederholen Sie diesen Schritt für jeden Wähler.
  6. Überprüfung des Gewinners: Nachdem alle Wähler ihre Stimme abgegeben haben, können Sie den Gewinner überprüfen. Suchen Sie die Funktion „winnerName“ und klicken Sie darauf. Der Name des Gewinnervorschlags wird in der Konsole am unteren Bildschirmrand angezeigt.
  7. Denken Sie daran, dass alle Aktionen in der Blockchain (einschließlich der Testaktionen in Remix) Transaktionen sind. Sie können die Transaktionsdetails in der Konsole erweitern, um weitere Informationen wie die Transaktionskosten und die Daten anzuzeigen. Es empfiehlt sich, diese Informationen zu überprüfen, um besser zu verstehen, wie Ihr Vertrag mit der Blockchain interagiert.

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!

Haftungsausschluss
* Kryptoinvestitionen sind mit erheblichen Risiken verbunden. Bitte lassen Sie Vorsicht walten. Der Kurs ist nicht als Anlageberatung gedacht.
* Der Kurs wird von dem Autor erstellt, der Gate Learn beigetreten ist. Vom Autor geteilte Meinungen spiegeln nicht zwangsläufig die Meinung von Gate Learn wider.
Katalog
Lektion 3

Implementierung der Stimmauszählung und Ergebnisbekanntgabe

In dieser Lektion werden wir die letzten Teile unseres dezentralen Abstimmungssystems implementieren: Stimmenauszählung und Bekanntgabe des Ergebnisses. Dazu müssen wir unseren Voter-Vertrag ein letztes Mal erweitern und Funktionen zur Berechnung des Gewinnervorschlags erstellen.

Erweiterung des Wählervertrags

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

Den Kodex verstehen

Lassen Sie uns die neuen Ergänzungen erklären:

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

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

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.

Wie es geht:

  1. Bereitstellung: Klicken Sie zunächst in der Remix-IDE auf die Registerkarte „Transaktionen bereitstellen und ausführen“. Es ist das Symbol unter dem Solidity-Compiler-Symbol. Stellen Sie sicher, dass Sie sich in der „JavaScript VM“-Umgebung befinden. Klicken Sie dann auf die Schaltfläche „Bereitstellen“.
  2. Wähler registrieren: Sobald der Vertrag bereitgestellt wurde, wird er im Abschnitt „Bereitgestellte Verträge“ angezeigt. Klicken Sie auf den Pfeil, um ihn zu erweitern. Dort finden Sie alle Funktionen unseres Vertrags aufgelistet.
  3. Um Wähler zu registrieren, suchen Sie die Funktion „registerVoter“. Da wir unseren Vertrag so programmiert haben, dass das Konto, das diese Funktion aufruft, als Wähler registriert wird, können Sie im Dropdown-Menü „Konto“ auf der Registerkarte „Transaktionen bereitstellen und ausführen“ zwischen Konten wechseln. Nachdem Sie ein Konto ausgewählt haben, klicken Sie auf die Funktion „RegisterVoter“. Wiederholen Sie diesen Schritt für jedes Konto, das Sie als Wähler registrieren möchten.
  4. Vorschläge hinzufügen: Um Vorschläge hinzuzufügen, suchen Sie die Funktion addProposal. Geben Sie den Vorschlagsnamen in das Eingabefeld neben der Funktion ein und klicken Sie auf die Funktion. Wiederholen Sie diesen Schritt für jeden Vorschlag, den Sie hinzufügen möchten.
  5. Abstimmung: Um abzustimmen, wechseln Sie zu einem Wählerkonto und suchen Sie die Abstimmungsfunktion. Geben Sie den Index des Vorschlags (die Reihenfolge, in der Sie ihn hinzugefügt haben, beginnend bei 0), für den Sie stimmen möchten, in das Eingabefeld neben der Funktion ein und klicken Sie auf die Funktion. Wiederholen Sie diesen Schritt für jeden Wähler.
  6. Überprüfung des Gewinners: Nachdem alle Wähler ihre Stimme abgegeben haben, können Sie den Gewinner überprüfen. Suchen Sie die Funktion „winnerName“ und klicken Sie darauf. Der Name des Gewinnervorschlags wird in der Konsole am unteren Bildschirmrand angezeigt.
  7. Denken Sie daran, dass alle Aktionen in der Blockchain (einschließlich der Testaktionen in Remix) Transaktionen sind. Sie können die Transaktionsdetails in der Konsole erweitern, um weitere Informationen wie die Transaktionskosten und die Daten anzuzeigen. Es empfiehlt sich, diese Informationen zu überprüfen, um besser zu verstehen, wie Ihr Vertrag mit der Blockchain interagiert.

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!

Haftungsausschluss
* Kryptoinvestitionen sind mit erheblichen Risiken verbunden. Bitte lassen Sie Vorsicht walten. Der Kurs ist nicht als Anlageberatung gedacht.
* Der Kurs wird von dem Autor erstellt, der Gate Learn beigetreten ist. Vom Autor geteilte Meinungen spiegeln nicht zwangsläufig die Meinung von Gate Learn wider.