Wie man Waves RIDE dApp baut, entfaltet und testet

Hallo! In diesem Artikel zeige ich Ihnen, wie Sie einen einfachen dApp auf der Waves-Node schreiben und ausführen können. Wir betrachten die erforderlichen Tools, Methoden und ein Entwicklungsbeispiel.

Wie man Waves RIDE dApp baut, entfaltet und testet

Das Schema für die Entwicklung von dApps und Standardanwendungen unterscheidet sich kaum:

  • Wir schreiben Code
  • Wir schreiben automatisierte Tests
  • Starten Sie die Anwendung
  • Wir testen

Werkzeuge

1. docker für die Ausführung der Node und Waves Explorer

Wenn Sie die Node nicht starten möchten, können Sie diesen Schritt überspringen. Es gibt schließlich ein Test- und ein Experimentennetzwerk. Aber ohne die Bereitstellung Ihrer eigenen Node kann der Testprozess sich in die Länge ziehen.

  • Sie werden ständig neue Konten mit Test-Token benötigen. Der Testnetz-Kran überweist alle 10 Minuten 10 WAVES.
  • Die durchschnittliche Blockzeit im Testnetz beträgt 1 Minute, in der Node 15 Sekunden. Dies ist besonders spürbar, wenn eine Transaktion mehrere Bestätigungen benötigt.
  • Öffentliche Testnodes können aggressives Caching betreiben.
  • Außerdem können sie aufgrund von Wartungsarbeiten vorübergehend nicht verfügbar sein.

Ich werde künftig davon ausgehen, dass Sie mit Ihrer eigenen Node arbeiten.

2. Surfboard-Befehlszeilentool

  • Laden Sie Node.js über ppa, homebrew oder exe hier herunter und installieren Sie es: https://nodejs.org/en/download/.
  • Installieren Sie Surfboard – ein Tool, mit dem Sie Tests auf einer vorhandenen Node ausführen können.

npm install -g @waves/surfboard

3. Visual Studio Code Plugin

Dieser Schritt ist nicht obligatorisch, wenn Sie kein Fan von IDEs sind und Texteditoren bevorzugen. Alle erforderlichen Tools sind Befehlszeilen-Utilities. Wenn Sie vim verwenden, achten Sie auf das Plugin vim-ride.

Laden Sie Visual Studio Code herunter und installieren Sie es: https://code.visualstudio.com/

Öffnen Sie VS Code und installieren Sie das Plugin waves-ride:

Wie man Waves RIDE dApp baut, entfaltet und testet

Browserergänzung Waves Keeper: https://wavesplatform.com/products-keeper

Fertig!

Starten Sie die Node und Waves Explorer

1. Starten Sie die Node:

docker run -d -p 6869:6869 wavesplatform/waves-private-node

Stellen Sie sicher, dass die Node über die REST API in http://localhost:6869:

Wie man Waves RIDE dApp baut, entfaltet und testet
Swagger REST API-Interface für die Node

2. Starten Sie eine Instanz von Waves Explorer:

docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer

Öffnen Sie einen Browser und gehen Sie zu http://localhost:3000. Sie werden sehen, wie schnell eine leere Kette der lokalen Node aufgebaut wird.

Wie man Waves RIDE dApp baut, entfaltet und testet
Waves Explorer zeigt die Instanz der lokalen Node an

Die Struktur von RIDE und das Werkzeug Surfboard

Erstellen Sie ein leeres Verzeichnis und führen Sie darin den Befehl aus

surfboard init

Der Befehl initialisiert das Verzeichnis mit der Projektstruktur, einer "Hello World"-Anwendung und Tests. Wenn Sie diesen Ordner mit VS Code öffnen, sehen Sie:

Wie man Waves RIDE dApp baut, entfaltet und testet
Surfboard.config.json

  • Im Verzeichnis ./ride/ finden Sie eine einzelne Datei wallet.ride – das Verzeichnis, in dem der dApp-Code gespeichert ist. Wir werden dApp im nächsten Abschnitt kurz analysieren.
  • Unter dem Ordner .\/test\/ finden Sie die Datei *.js. Hier werden die Tests gespeichert.
  • .\/surfboard.config.json – die Konfigurationsdatei zum Ausführen von Tests.

Envs – ein wichtiger Abschnitt. Jede Umgebung wird so konfiguriert:

  • Die REST API-Endpunktadresse, die verwendet wird, um dApp und das CHAIN_ID des Netzwerks zu starten.
  • Der geheimen Satz für das Konto mit den Token, die die Quellen für Ihre Tests sein werden.

Wie Sie sehen können, unterstützt surfboard.config.json standardmäßig mehrere Umgebungen. Die lokale Umgebung ist standardmäßig eingestellt (Schlüssel defaultEnv – änderbarer Parameter).

Die Wallet-demo-Anwendung

Dieser Abschnitt ist kein Handbuch zur RIDE-Sprache. Vielmehr ist es ein Blick auf die Anwendung, die wir bereitstellen und testen, um besser zu verstehen, was in der Blockchain passiert.

Betrachten wir die einfache Anwendung Wallet-demo. Jeder kann Token an die dApp-Adresse senden. Nur eigene WAVES können ausgezahlt werden. Zwei @Callable-Funktionen sind über InvokeScriptTransaction verfügbar:

  • deposit(), die eine angehängte Zahlung in WAVES erfordert
  • withdraw(amount: Int), die Tokens zurückgibt

Während des gesamten Lebenszyklus der dApp wird die Struktur (address → amount) beibehalten:

Aktionen
Resultierender Zustand

anfänglich
leer

Alice hinterlegt 5 WAVES
alice-address → 500000000

Bob hinterlegt 2 WAVES

alice-address → 500000000
bob-address → 200000000

Bob zieht 7 WAVES ab
ABGELEHNT!

Alice zieht 4 WAVES ab
alice-address → 100000000
bob-address → 200000000

Hier ist der Code für ein vollständiges Verständnis der Situation:

# In this example multiple accounts can deposit their funds and safely take them back. No one can interfere with this.
# An inner state is maintained as mapping `address=>waves`.
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func deposit() = {
 let pmt = extract(i.payment)
 if (isDefined(pmt.assetId))
    then throw("works with waves only")
    else {
     let currentKey = toBase58String(i.caller.bytes)
     let currentAmount = match getInteger(this, currentKey) {
       case a:Int => a
       case _ => 0
     }
     let newAmount = currentAmount + pmt.amount
     WriteSet([DataEntry(currentKey, newAmount)]) 
   }
 }
@Callable(i)
func withdraw(amount: Int) = {
 let currentKey = toBase58String(i.caller.bytes)
 let currentAmount = match getInteger(this, currentKey) {
   case a:Int => a
   case _ => 0
 }
 let newAmount = currentAmount - amount
 if (amount < 0)
   then throw("Can't withdraw negative amount")
   else if (newAmount < 0)
     then throw("Not enough balance")
     else ScriptResult(
       WriteSet([DataEntry(currentKey, newAmount)]),
       TransferSet([ScriptTransfer(i.caller, amount, unit)])
      )
 }
@Verifier(tx)
func verify() = false

Beispielcode kann auch auf der GitHub.

Der VSCode-Plugin unterstützt die kontinuierliche Kompilierung beim Bearbeiten der Datei. Daher können Sie Fehler jederzeit im Tab PROBLEMS verfolgen.

Wie man Waves RIDE dApp baut, entfaltet und testet
Wenn Sie einen anderen Texteditor zum Kompilieren der Datei verwenden möchten, verwenden Sie

surfboard compile ride\/wallet.ride

Das gibt eine Reihe von base64 kompiliertem RIDE-Code aus.

Test-Szenario für ‚wallet.ride‘

Schauen wir uns die Testdatei an. Es basiert auf dem JavaScript-Mocha-Framework. Es gibt eine „Before“-Funktion und drei Tests:„Before“ finanzierte mehrere Konten durch MassTransferTransaction, kompilierte das Skript und stellte es in der Blockchain bereit.

  • „Kann einzahlen“ sendet InvokeScriptTransaction ins Netzwerk und aktiviert die Funktion deposit() für jedes der beiden Konten.
  • „Kann nicht mehr abheben als eingezahlt wurde“ testet, dass niemand die Tokens anderer stehlen kann.
  • „Kann einzahlen“ überprüft, dass Auszahlungen korrekt verarbeitet werden.
  • Tests mit Surfboard ausführen und Ergebnisse im Waves Explorer analysieren.

Um den Test auszuführen, führen Sie aus

surfboard test

Wenn Sie mehrere Szenarien haben (z.B. benötigen Sie ein separates Bereitstellungsskript), können Sie ausführen

Wenn Sie mehrere Szenarien haben (z. B. ein separates Bereitstellungsskript benötigen), können Sie es ausführen

surfboard test my-scenario.js

Surfboard wird Testdateien im Ordner ./test/ sammeln und das Skript in dem Knoten ausführen, der in surfboard.config.json konfiguriert ist. Nach einigen Sekunden werden Sie etwas Ähnliches sehen:

wallet-Test-Suite
Generiere Konten mit Nonce: ce8d86ee
Konto erstellt: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Konto erstellt: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Konto erstellt: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Konten erfolgreich finanziert
Skript wurde festgelegt
   √ Kann einzahlen (4385ms)
   √ Kann nicht mehr abheben, als eingezahlt wurde
   √ Kann abheben (108ms)
3 bestehen (15s)

Hurra! Die Tests sind bestanden. Lassen Sie uns ansehen, was bei der Verwendung von Waves Explorer passiert: Sehen wir uns die Blöcke an oder geben wir eine der oben genannten Adressen in die Suche ein (zum Beispiel die entsprechende wallet#. Dort finden Sie die Transaktionshistorie, den Status der dApp, die dekompilierte Binärdatei.

Wie man Waves RIDE dApp baut, entfaltet und testet
Waves Explorer. Eine Anwendung, die gerade bereitgestellt wurde.

Einige Tipps zu Surfboard:

1. Um im Testnetz zu testen, verwenden Sie:

surfboard test --env=testnet

Erhalten Sie Testtoken

2. Wenn Sie die JSON-Versionen von Transaktionen sehen möchten und wie sie vom Knoten verarbeitet werden, führen Sie den Test mit -v (bedeutet 'verbose') aus:

surfboard test -v

Verwendung von Anwendungen mit Waves Keeper

1. Konfigurieren Sie Waves Keeper für den Betrieb: http://localhost:6869

Wie man Waves RIDE dApp baut, entfaltet und testet
Einrichtung von Waves Keeper für die Arbeit mit einem lokalen Knoten

2. Importieren Sie den geheimen Satz mit Tokens für das Netzwerk? Zur Vereinfachung verwenden Sie den ursprünglichen Seed Ihres Knotens: waves private node seed with waves tokens. Adresse: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.

3. Sie können eine serverlose Einzelanwendungsanwendung selbst starten, indem Sie npm verwenden. Oder gehen Sie zu einem bestehenden: chrome-ext.wvservices.com/dapp-wallet.html

4. Geben Sie die Wallet-Adresse aus dem Testlauf (oben hervorgehoben) in das Textfeld für die dApp-Adresse ein.

5. Geben Sie einen kleinen Betrag in das Feld 'Einzahlung' ein und klicken Sie auf die Schaltfläche:

Wie man Waves RIDE dApp baut, entfaltet und testet
Waves Keeper fragt nach Erlaubnis, um die InvokeScriptTransaction mit einer Zahlung von 10 WAVES zu signieren.

6. Bestätigen Sie die Transaktion:

Wie man Waves RIDE dApp baut, entfaltet und testet
Die Transaktion wurde erstellt und wird ins Netzwerk übertragen. Jetzt ist ihre ID sichtbar.

7. Überwachen Sie die Transaktion mit Waves Explorer. Geben Sie die ID in das Suchfeld ein.

Wie man Waves RIDE dApp baut, entfaltet und testet

Schlussfolgerungen und zusätzliche Informationen

Wir haben die Entwicklungs-, Test-, Bereitstellungs- und Nutzungstools für einfache dApps auf der Waves-Plattform betrachtet:

  • Die RIDE-Sprache
  • VS Code-Editor
  • Waves Explorer
  • Surfboard
  • Waves Keeper

Links für diejenigen, die RIDE weiter lernen möchten:

Mehr Beispiele
Online-IDE mit Beispielen
Waves-Dokumentation
Entwickler-Chat auf Telegram
Waves und RIDE auf Stackoverflow
NEU! Online-Kurse zur Erstellung von dApps auf der Waves-Plattform

Vertiefen Sie sich in das Thema RIDE und erstellen Sie Ihre erste dApp!

TL;DR: bit.ly/2YCFnwY

Quelle: habr.com

60GB SSD 8Gb DDR4