Erstellen eines intelligenten Wahlvertrags – Dhruv T.

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining


Was wir von unserem Vertrag erwarten:

  • Registrieren Sie einen Wähler
  • Registrieren Sie einen Kandidaten
  • Wähler können Kandidatendetails anzeigen
  • Die Wähler wählen die Kandidaten
  • Die Wähler können ihre Details einsehen
  • Finden Sie den Gewinner

Daher erstellen wir eine Tabelle, mit der wir die Vertragsstruktur besser verstehen können. Ich ermutige Sie, dasselbe zu tun, da dies Ihnen ein besseres Bild davon gibt, wie Ihr Vertrag laufen und sich verhalten soll.

Um unseren Vertragscode zu schreiben, verwenden wir das Online Remix IDE. Wenn Sie Remix IDE nicht kennen, würde ich empfehlen, dass Sie meinen vorherigen Beitrag darüber lesen (Erkunden von Remix IDE für Anfänger), damit Sie sich beim Ausführen Ihres Vertrags damit auskennen. Es ist eine 5-minütige Lektüre, daher wird es nicht viel Zeit in Anspruch nehmen, aber sicherlich Zeit sparen, während Sie damit arbeiten.

Wir beginnen damit, eine neue Datei aus dem Datei-Explorer zu erstellen und sie dann im Code-Editor zu öffnen. Wir beginnen immer damit, die Soliditätsversion für dieses Projekt anzugeben. Also schreiben wir dasselbe wie folgt.

Jetzt beginnen wir mit dem Schreiben unseres Vertrags, und der Compiler weiß auch, welche Soliditätsversion verwendet werden soll.

Zunächst deklarieren wir die Statusvariablen, die während der Erstellung des Vertrags nützlich sein werden. Solidity ist eine statisch typisierte Sprache. Dies bedeutet, dass der Typ jeder Variablen (Status und lokal) angegeben werden muss. Solidity bietet mehrere Elementartypen, die zu komplexen Typen kombiniert werden können. Einige von ihnen sind:

  • uint – Ganzzahl ohne Vorzeichen
  • Adresse – speichert die 20-Byte-Kontoadresse,
  • Kartierung – speichert Schlüssel-Wert-Paare
  • Boolean – speichert wahre falsche Werte

Jetzt ist die von uns erstellte Tabelle hilfreich. Wir erstellen die erforderlichen Zustandsvariablen wie gezeigt, die ziemlich selbsterklärend sind, was sie bedeuten.

Ein bisschen mehr Erklärung für die struct Variable… Zum Speichern von Wähler- und Kandidatendetails benötigen wir wahrscheinlich eine Reihe von Variablen, die nur für den Wähler und die Kandidaten von Bedeutung sind. Daher definieren wir einen zusammengesetzten Typ mit einer Struktur, mit der Variablen gruppiert und die jeweiligen Details besser gespeichert werden können. Die neue Voter-Variable ist jetzt grundlegenden Variablentypen zugeordnet, die nur über die Voter-Variable aufgerufen werden können. Ähnlich verhält es sich mit der neuen Kandidatenvariablen.

Außerdem müssten wir die Informationen verschiedener Wähler und Kandidaten verwenden, um dynamische Arrays für sie zu erstellen (da wir nicht wissen, wie viele Personen anscheinend abstimmen werden), auf die anhand ihrer IDs verwiesen wird. Wir erstellen auch eine Zuordnung zu den Strukturen (Wert) durch die entsprechende Adresse (Schlüssel).

Aufzählungen werden verwendet, um einen benutzerdefinierten Typ zu erstellen. Sie erfordern mindestens ein Mitglied, und sein deklarierter Standardwert ist das erste Mitglied.

Ereignis speichert die in Transaktionsprotokollen übergebenen Argumente. Diese Protokolle werden auch in der Blockchain gespeichert.

Es wird einige Funktionen geben, die nur vom Vertragseigentümer und nicht von einem zufälligen Benutzer aufgerufen werden sollten. Also schreiben wir einen Modifikator, der die Funktionsweise von Funktionen ändert. Der Modifikator ist im Funktionsheader enthalten. Wenn wir einen Modifikator in einen Funktionsheader aufnehmen, werden die Anweisungen hinzugefügt, die wir zu Beginn der Funktionsanweisungen während des Aufrufs darin geschrieben haben. Die letzte Anweisung in einem Modifikator lautet immer "_;".

Hinweis: Nachricht ist eine in Solidity integrierte globale Variable, mit der wir auf einige wesentliche Eigenschaften einer Transaktion in Ethereum zugreifen können. Dazu gehören die msg.sender (Adresse, Absender der Nachricht), msg.value (uint, Anzahl der mit der Nachricht gesendeten Wei), msg.data (Bytes, vollständige Anrufdaten), msg.gas (uint, verbleibendes Gas).

Als nächstes ist die erste Funktion in jedem Vertrag die Konstrukteur, die immer den gleichen Namen wie der Vertrag hat. Es wird verwendet, um Befehle zu initialisieren oder auszuführen, die nur während der Vertragsinstanziierung ausgeführt werden müssen. Hier können wir die Anfangswerte der gewünschten Variablen festlegen, bevor Funktionen ausgeführt werden.

Wir weisen dem Vorsitzenden die Adresse des Erstellers des Vertrags zu (derjenige, der ihn im Netzwerk bereitgestellt hat oder der im Grunde die Instanz dieses Vertrags erstellt hat). Wir ändern auch die Wahlphase auf Stage.Reg um anzuzeigen, dass die Registrierungszeit begonnen hat. jetzt Das Schlüsselwort gibt den Zeitstempel der Blockerstellung zurück.

Im nächsten Schritt erstellen wir eine registerVoter Funktion, die beim Aufrufen den Benutzer zur Wählerliste hinzufügt. Nach der Erstellung des Smart-Vertrags werden wir 10 Minuten für die Registrierung neuer Wähler einplanen. Wir überprüfen den aktuellen Zeitstempel (tatsächlich jetzt gibt uns keine aktuelle Zeit an, aber für dieses Beispiel reicht es aus) und prüfen Sie, ob die verstrichene Zeit weniger als 10 Minuten beträgt. Andernfalls ändern wir den Wahlstatus in Stage.View. Wir erhalten die Adresse des Wählers über msg.sender, das uns die Adresse des Benutzers mitteilt, der diese Funktion aufgerufen hat. Wir verwenden diese Adresse als Schlüssel, um die Voter-Struktur über das zuvor erstellte Mapping zu verwenden.

Hinweis: Hier stoßen wir auf ein neues Schlüsselwort: Lager. Für diejenigen, die etwas Programmierhintergrund und Erfahrung haben, hat Solidity zwei Schlüsselwörter: Erinnerung und Lager, was im Grunde bedeutet Aufruf nach Wert und Anruf durch Referenz, beziehungsweise. Für diejenigen, die noch nie davon gehört haben, bezieht sich jede Variable, die wir mit dem Schlüsselwort storage erstellen, direkt auf die Originaldaten (hier Wähler[voterAddr]). Jede Änderung, die wir an unserer neuen Speichervariablen vornehmen, ändert auch den entsprechenden Wert der ursprünglichen Variablen. Wenn wir dagegen Speicher verwendet hätten, hätte die neue Variable eine Kopie der Originaldaten im Speicher erstellt und diese unserer neuen Variablen zugewiesen. Wie Sie vielleicht vermutet haben, hätte jede Änderung an der neuen Speichervariablen keinen Unterschied zu unseren ursprünglichen Wählerdaten verursacht. Wenn Sie also Daten anzeigen möchten, verwenden Sie Speicher, und wenn Sie Daten ändern möchten, verwenden Sie Speicher.

Überprüfen Sie nach dem Erstellen einer Speicherinstanz des neuen Wählers, ob ein Benutzer einige Bedingungen erfüllen muss (in diesem Fall sollte er noch nicht registriert sein), um als Wähler registriert zu werden. Das gleiche wird durch die Verwendung von require-Anweisungen erreicht. Wenn der Benutzer die erforderlichen Bedingungen erfüllt, weisen wir der Speicherinstanz des gerade erstellten Wählers die Anfangswerte zu. Jetzt fügen wir diesen neuen Wähler mit dem Push-Befehl zur Liste der Wähler hinzu und aktualisieren dann die Anzahl der Wähler um eins.

Wir folgen dem gleichen Verfahren, um die nächste Funktion zu erstellen. registorCandidate.

Der Wähler sollte in der Lage sein, seine Daten während der Wahl einzusehen. Möglich wird dies mit dem viewVoter Funktion. Beachten Sie, dass wir hier eine Speicherinstanz des neuen Wählers erstellen, da wir nur Informationen des Wählers abrufen und keine Änderungen vornehmen möchten (für die eine Speicherinstanz erforderlich wäre). Der Zugriff auf die Informationen erfolgt mit der Zuordnung über die Adresse des Wählers, der seine Daten anzeigen möchte. Auf diese Weise kann der Wähler nur seine / ihre Details anzeigen und nicht jeden, den er möchte.

Hinweis: Im Gegensatz zu den meisten anderen Programmiersprachen kann Solidity während der Funktionsausführung mehrere Werte zurückgeben.

Die Wähler sollten in der Lage sein, Informationen über jeden Kandidaten anzuzeigen, den sie möchten. Dies wird mit einem ähnlichen ermöglicht viewCandidate Funktion. Der Wähler kann über die Kandidaten-ID auf die Details zugreifen.

Um faire Wahlen abzuhalten, wollen wir mindestens zwei Kandidaten und einen Wähler. Wenn wir also eine erstellen stimmenFür Funktion sollten wir Anweisungen einschließen, die prüfen, ob das Array unserer Kandidaten eine Mindestlänge von zwei und das Array der Wähler eine Mindestlänge von eins hat. Wir können die Array-Länge mit den Befehlen Wähler.Länge und Kandidaten.Länge erhalten. Wenn ein Wähler diese Funktion aufruft, möchten wir, dass er registriert ist und noch nicht abgestimmt hat. Nachdem wir für den Kandidaten mit der im Funktionsparameter angegebenen ID gestimmt haben, sollten wir seine / ihre Details aktualisieren und die Stimmenzahl des angegebenen Kandidaten um eins erhöhen.

Am Ende möchten wir herausfinden, wer gewonnen hat, richtig! Wir schreiben eine findWinner Funktion, die nur vom Vorsitzenden aufgerufen und von der überprüft wird nur Vorsitzender Modifikator. Wir erstellen eine Speicherinstanz eines Kandidaten mit dem Namen Gewinner, da wir nur Informationen abrufen und darauf zugreifen möchten, insbesondere die Stimmenzahl, und diese nicht ändern möchten. Wir verwenden eine for-Schleife, um das Array der Kandidaten zu durchlaufen und den Kandidaten mit den maximalen Stimmen zu finden.

Puh!!! Du hast es endlich so weit geschafft. Dies war jedoch nur der Codierungsteil. Jetzt werden wir endlich unseren neu kodierten Wahl-Smart-Vertrag testen.

Wechseln Sie zur Registerkarte Solidity-Compiler. Wählen Sie dort die Compilerversion aus, die Sie oben in Ihrem Vertrag angegeben haben. Lass alles andere so sein wie es ist. Klicken Sie anschließend auf Compile Election.sol Taste. Der Name kann je nach Dateiname unterschiedlich sein. Wenn Sie darauf klicken, sollten Sie wahrscheinlich keine Warnungen oder Fehler erhalten. Auf dem Logo sollte ein grünes Häkchen erscheinen.

Hinweis: Beachten Sie, dass Sie auf derselben Compiler-Registerkarte unten die beiden Kompilierungsartefakte sehen können. ABI und Bytecode. Wenn Sie darauf klicken, können Sie den ABI und den Bytecode Ihres kompilierten Vertrags anzeigen. Das ABI und der Bytecode enthalten nützliche Informationen zu Ihrem Vertrag.

Gehen Sie jetzt zum Registerkarte "Transaktionen bereitstellen und ausführen". Wählen Sie dort die Umgebung aus JavaScipt VM. Auf diese Weise können Sie eine virtuelle Maschine auf Ihrem System hosten. Auf diese Weise haben Sie Zugriff auf gefälschte Ethereum-Konten mit jeweils 100 Ether. Stellen Sie sicher, dass der Wahlvertrag ausgewählt ist. Klicken Sie anschließend auf die Schaltfläche Bereitstellen, um Ihren Vertrag in einem Testnetzwerk bereitzustellen, das ausschließlich zu Testzwecken erstellt wurde. Daraufhin sollten verschiedene neue Schaltflächen angezeigt werden, die denselben Namen wie Ihre Funktionen und Variablen für den öffentlichen Status haben. Jetzt können wir beginnen, unsere Funktionen zu verwenden und sehen, ob sie so laufen, wie wir es erwarten.

Zuerst sehen wir die registorVoter. Wenn wir darauf klicken, wird der Wählerliste ein neuer Wähler mit derselben Kontoadresse hinzugefügt, mit der die Funktion aufgerufen wurde. Ein grünes Häkchen auf der Konsole zeigt an, dass die Transaktion ausgeführt und erfolgreich abgebaut wurde. Wenn wir nun versuchen, uns erneut mit derselben Kontoadresse zu registrieren, wird ein Fehler angezeigt, und die Transaktion wird in den Ausgangszustand zurückgesetzt. Die Funktion "registorVoter" wird also erfolgreich ausgeführt. Registrieren Sie 2 weitere Wähler aus der angegebenen Adressliste, um eine gute Wahl zu haben.

Wählen Sie als Nächstes das vierte Konto aus, und wir werden nun versuchen, das Konto zu testen registerCandidate Funktion. Wir geben die Eingabeparameter ein und klicken auf die Schaltfläche. Machen Sie dasselbe für das fünfte Konto.

Jetzt haben wir drei Wähler und zwei Kandidaten registriert. Wenn Sie möchten, können Sie die Details des Wählers oder Kandidaten mithilfe der anzeigen viewVoter und viewCandidate.

Wechseln Sie als Nächstes in die Wähleradresse und geben Sie die Kandidaten-ID ein. Dies ist die Reihenfolge, in der Sie sie hinzugefügt haben. Machen Sie dasselbe für alle drei Wähler. Um das Ergebnis zu sehen, führen wir es aus findWinner Funktion. Achten Sie darauf, dass diese Funktion nur als Vorsitzender bezeichnet werden kann, der der Benutzer ist, der den Vertrag bereitgestellt hat. Ändern Sie also diese Kontoadresse und klicken Sie auf die Schaltfläche "findWinner". Gehen Sie dann zur Konsole und klicken Sie auf die Transaktion, um deren Details anzuzeigen. Dort sehen Sie auf dem dekodierten Ausgabeetikett das Wahlergebnis als ID des siegreichen Kandidaten.

Voila !!! Sie haben gerade erfolgreich eine Mini-Wahl durchgeführt, indem Sie Ihren eigenen intelligenten Vertrag umgesetzt haben.

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close