Modul #4 Web 3.0 mit Waves

Marc Jansen
Web3 mit Waves Platform
8 min readJul 14, 2019

Modul #4 Umgang mit RIDE für dApps

Hey! Herzlich Willkommen zurück zum Online-Kurs “Mastering Web3 with Waves”. Modul 4.

In diesem Modul üben wir den Umgang und die Implementierung von Smart Contracts und lernen auch, wie man mit Waves APIs arbeitet.

4.0 Smart Contracts und dApps

4.1 Coupon Bazaar Web3.0 dApp

4.2 Commit-Reveal-Abstimmung

4.3 Praxis

Ein Smart Contract ist ein Computer-Quellcode oder -Programm, das in einer verteilten Umgebung wie einem Blockchain-Netzwerk ausgeführt werden kann. Alle Operationen und Ausführungsergebnisse werden in der Blockchain gespeichert.

In dieser Definition ist ein Smart Contract kein Vertrag zwischen den Parteien, sondern ein Protokoll über die Zusammenarbeit zwischen den Nutzern, aber auch zwischen Nutzer und Computer oder sogar Computer und Computer gemäß den im Smart Contract Source Code beschriebenen Regeln.

Waves Smart Contracts werden durch zwei verschiedene Typen dargestellt: Smart Accounts und Smart Assets. Jedes Waves-Konto kann mit einem speziellen Konto-Skript in einen Smart-Account umgewandelt werden. Das Kontoskript ist ein Programm in der Sprache RIDE, welches eine Reihe von Bedingungen enthält, um verschiedene Arten von ausgehenden Transaktionen zuzulassen und / oder zu verweigern.

Um Entwicklern den dApp-Entwicklungsprozess zu erleichtern, bietet RIDE, die Waves Smart Contract Language, zwei Arten von Funktionen: @Verifier und @Callable.

@Callable-Funktionen können von Benutzern von außerhalb aufgerufen werden. Als Ergebnis der Ausführung können neue Informationen in den dApp-Key-Value Datenspeicher eingefügt oder aktualisiert werden oder (und) Mittel können je nach dApp-Logik vom dApp-Guthaben an den Aufrufer oder andere Adressen übertragen werden. In unserem Fall sind dApp und Smart Account die gleiche Einheit.

@Callable-Funktionen arbeiten mit zwei Arten von Eingabeargumenten: Argumenten und Payments. Waves API hat eine spezielle Funktion, um mit @Callable-Funktionen zu arbeiten — invokeScript.

Schauen Sie sich das folgende Beispiel an: “Hier sehen Sie WriteSet im RIDE Smart Contract Code. Das bedeutet, dass das Ergebnis dieses Aufrufs in den Key-Value Speicher der dApp geschrieben wird.”

Betrachten Sie das zweite Beispiel unten: “Hier sehen Sie TransferSet und ScriptResult im RIDE Smart Contract Code. Das bedeutet, dass das Ergebnis dieses Aufrufs in den Key-Value-Speicher der dApp geschrieben wird und auch einige Werte gleichzeitig an eine bestimmte Adresse überwiesen werden”.

Wir können alle Kombinationen von WriteSet, TransferSet oder beide mit Hilfe der ScriptResult Methode verwenden.

Alle Operationen sind atomar!

Denken Sie daran: Wir bauen einen dezentralen Web3-Couponmarktplatz — “Coupon Bazaar”.

Die Nutzer suchen nach Rabatten für Waren und Dienstleistungen und können diese zu einem kleinen Preis auf dem Marktplatz kaufen.

Jeder Coupon ist ein digitales Asset, welches einen speziellen Rabatt des Lieferanten darstellt.

“Coupon Bazaar” ist ein Marktplatz. Er bietet Matching, Zahlungsvorgänge und Lieferservice zwischen Lieferanten und Kunden.

1. Lieferanten haben folgende Use-Cases:

  • Hinzufügen eines Elements
  • Abhebung von Geldern

2. Kunden haben folgenden Use-Cases:

  • Kaufen

Verwenden wir @Callable-Funktionen um die dApp für alle beschriebenen Funktionen zu implementieren! Aber zuerst schauen Sie sich den untenstehenden Code an: “Sie sehen, dass wir in der Lage sind, alle benutzerdefinierten Funktionen in RIDE zu deklarieren. Wir arbeiten hauptsächlich mit dem dApp Key-Value-Speicher, also lassen Sie uns einige Funktionen dafür implementieren.”

Jetzt sind wir bereit, die Funktionalität “Element hinzufügen” für Lieferanten zu implementieren.

Bitte öffnen Sie die IDE und fügen Sie diese Funktionalität hinzu. Stellen Sie das dApp-Skript aus dem vorherigen Schritt bereit und rufen Sie die “addItem” Funktion aus der JavaScript-Testdatei auf.

Öffnen Sie den Datenspeicher der dApp im Explorer und das Ergebnis sollte in etwa wie folgt aussehen:

Die Nutzer suchen nach Rabatten für Waren und Dienstleistungen und können diese zu einem kleinen Preis auf dem Marktplatz kaufen.

Lassen Sie uns die Funktionen für den “Einkauf” durch den Kunden implementieren.

Wie Sie sehen können, hat unser dApp einen speziellen Schlüssel für die Lieferantenbilanzierung. Außerdem kann der Kunde den gleichen Coupon mehrmals kaufen.

Alle Einkäufe werden im dApp-Speicher aufgezeichnet.

Implementieren Sie die Kauffunktionalität und stellen Sie hier den Zustandswechsel können sie im Blockexplorer unter dem angegebenen Punkt nachvollziehen:

Die “Coupon Bazaar” dApp verfügt über einen speziellen Schlüssel für die Lieferantenbilanzierung. Um Geld auf das persönliche Konto des Lieferanten zu überweisen, sollten wir die Auszahlungsfunktion einführen:

Implementieren Sie nun die Rückzahlungsfunktionalität und der entsprechende Zustandswechsel kann wieder im Blockexplorer nachvollzogen werden:

Mit Blick auf die Zukunft stellen wir uns vor, dass die Mitglieder der Community “Coupon Bazaar” für die Promotion oder Entfernung bestimmter Produkte stimmen möchten. Das können sie durch ein privates Abstimmungsverfahren erreichen.

Hier laufen wir auf das folgende Problem: Alles im öffentlichen Blockchain-Netzwerk ist transparent. Also, alle Abstimmungen werden für andere offen sein während der Wahl, und die Abstimmung eines Mitglieds kann die Entscheidungen anderer beeinflussen.

Hierbei kann uns das “Commit-Reveal”-Schema helfen.

Hierzu müssen wir zwei Schritte implementieren:

  • Commit-Schritt — hier sammeln wir verschlüsselte Stimmen mit Hilfe der Hash-Funktion und einer zufälligen Zeichenkette (Salt) ein.
  • Reveal-Schritt — hier sammeln wir entschlüsselte Stimmen und vergleichen ihre Hashes mit den aufgezeichneten Hashes.

Wie Sie sehen können, gibt es keine Möglichkeit, die Abstimmung nach Abschluss des Commit-Schritts zu ändern und niemand kennt die Stimmen vor dem Reveal-Schritt.

Lassen Sie uns das umsetzen! Aber zuerst müssen wir Variablen und Funktionen deklarieren:

Commit-Schritt — hier sammeln wir verschlüsselte Stimmen mit Hilfe der Hash-Funktion und einer zufälligen Zeichenkette (Salt) ein:

Zunächst setzen wir:

let commits = [“G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq”,“Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi”,“ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ”]let reveals = [“delisted”, “featured”, “featured”]let salts = [“random1”, “random2”, “random3”]

Implementieren Sie die folgende Funktionalität (mit Hashes und Votes aus dem obigen Code) in unserer dApp, die Änderungen des Status kann wieder im Blockexplorer nachvollzogen werden:

Versuchen Sie, drei Commits von verschiedenen Konten durchzuführen (mit Daten aus dem vorherigen Schritt). Der Key-Value-Store der dApp sieht dann in etwa wie folgt aus:

Reveal-Schritt — hier sammeln wir entschlüsselte Stimmen und vergleichen ihre Hashes mit den aufgezeichneten Hashes.

Wie Sie sehen können, gibt es somit keine Möglichkeit, die Abstimmung nach Abschluss des Commit-Schritts zu ändern.

Niemand kennt die Stimmen vor dem Reveal-Schritt. Nachdem der Reveal-Schritt abgeschlossen ist, sehen wir das Abstimmungsergebnis als Statusänderung.

Versuchen Sie, drei RevealIterationen aus verschiedenen Konten durchzuführen (mit Daten aus den vorherigen Schritten) und die “State Changes” aus der dritten “voteReveal”-InvokeTransaktion sieht in etwa wie folgt aus:

Denken Sie daran: Wir bauen einen dezentralen Web3-Couponmarktplatz — “Coupon Bazaar”.

Die Nutzer suchen nach Rabatten für Waren und Dienstleistungen und können diese zu einem kleinen Preis auf dem Marktplatz kaufen.

Jeder Coupon — ist ein digitales Asset, das einen speziellen Rabatt des Lieferanten darstellt.

In diesem Schritt werden wir unsere Boilerplate App aus “Modul 1” zu verbessern. Öffnen Sie hierzu github und forken Sie das mweb3waves Repository (https://github.com/AlekseiPupyshev/mweb3waves) mit Ihrem github-Konto.

Klonen Sie es auf Ihren lokalen Computer und wechseln Sie in den bchintegrations-Zweig.

git clone https://github.com/**your*account**/mweb3waves.gitgit checkout bchintegrationnpm installnpm run buildnpm run server

Führen Sie danach die npm-Befehle aus und öffnen Sie http://localhost:5000/ in Ihrem Browser. Dies ist ein neues Boilerplate Projekt für “Coupon Bazaar”. Betrachten wir den Quellcode (package.json und index.jsx):

git checkout bchintegrationnpm installnpm run buildnpm run server

Führen Sie danach die npm-Befehle aus und öffnen Sie http://localhost:5000/ in Ihrem Browser. Dies ist ein neues Boilerplate Projekt für “Coupon Bazaar”. Betrachten wir den Quellcode (package.json und index.jsx):

Hier sehen Sie einige Änderungen:

  1. Neue wichtige Bibliotheken wurden in das Projekt aufgenommen — Waves-Transactions und
  2. Waves-Crypto.

Die wichtigsten Funktionen wurden in die React Anwendung importiert.

Sie sind damit vertraut: { invokeScript, broadcast, waitForTx-}-Funktionen aus IDE-Java-Script-Testfällen.

nodeInteraction — wird es uns ermöglichen, Daten aus dem dApp Key-Value-Speicher zu erhalten.

Lassen sie uns ein paar Übungen machen!

Öffnen Sie die Entwicklerkonsole unter http://localhost:5000/ und geben Sie das ausgegebenen Ergebnis von console.log(JSON.stringify(v)) sieht wie folgt aus:

Wie erhält man Hashes für die Implementierung von Commit-Schritten?

let commits = [“G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq”, “Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi”, “ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ”]let reveals = [“delisted”, “featured”, “featured”]let salts = [“random1”, “random2”, “random3”]

Öffnen Sie die Entwicklerkonsole unter http://localhost:5000/ und versuchen Sie, die Funktionen “crypto” aufzurufen:

Vesuchen Sie einmal den Hash für:

“delisted” + “random4”

zu berechnen.

Erstellen Sie den Code um mit Hilfe des nodeInteraction-Objekts die Nummer des aktuellen Blocks der Blockchain (Höhe) zu erhalten:

Hinweis:

https://wavesplatform.github.io/waves-transactions/globals.html

--

--