Hoe een Waves RIDE dApp te bouwen, implementeren en testen

Hallo! In dit artikel laat ik je zien hoe je een gewone dApp schrijft en uitvoert op de Waves-node. We bekijken de benodigde tools, methoden en een ontwikkelingsvoorbeeld.

Hoe een Waves RIDE dApp te bouwen, implementeren en testen

Het ontwikkelingsschema voor dApps en gewone applicaties verschilt bijna niet:

  • Schrijf de code
  • Schrijf geautomatiseerde tests
  • Start de applicatie
  • Testen

Hulpmiddelen

1. docker voor het uitvoeren van de node en Waves Explorer

Als je de node niet wilt uitvoeren, kun je deze stap overslaan. Er zijn immers een testnetwerk en een experimenteel netwerk. Maar zonder je eigen node uit te voeren, kan het testproces langer duren.

  • Je hebt voortdurend nieuwe accounts nodig met testtokens. De faucet van het testnetwerk geeft elke 10 minuten 10 WAVES.
  • De gemiddelde bloktijd in het testnetwerk is 1 minuut, in de node 15 seconden. Dit is vooral merkbaar als een transactie meerdere bevestigingen vereist.
  • In openbare testnodes kan er agressieve caching plaatsvinden.
  • Daarnaast kunnen ze tijdelijk niet beschikbaar zijn door onderhoud.

Daarna ga ik ervan uit dat je met je eigen node werkt.

2. Commandoregeltool Surfboard

  • Download en installeer Node.js met behulp van ppa, homebrew of exe hier: https://nodejs.org/en/download/.
  • Installeer Surfboard – een tool die je in staat stelt om tests uit te voeren op een bestaande node.

npm install -g @waves/surfboard

3. Visual Studio Code-plugin

Deze stap is optioneel als je geen fan bent van IDE's en de voorkeur geeft aan teksteditors. Alle benodigde tools zijn commandoregeltools. Als je vim gebruikt, let dan op de plugin vim-ride.

Download en installeer Visual Studio Code: https://code.visualstudio.com/

Open VS Code en installeer de plugin waves-ride:

Hoe een Waves RIDE dApp te bouwen, implementeren en testen

Browseruitbreiding Waves Keeper: https://wavesplatform.com/products-keeper

Klaar!

Start de node en Waves Explorer

1. Start de node:

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

Zorg ervoor dat de node via de REST API draait op http://localhost:6869:

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Swagger REST API-interface voor de node

2. Start een instantie van Waves Explorer:

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

Open een browser en ga naar http://localhost:3000. Je zult zien hoe snel een lege keten van de lokale node wordt opgebouwd.

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Waves Explorer toont een instantie van de lokale node

De structuur van RIDE en de Surfboard-tool

Maak een lege directory aan en voer in deze directory het commando uit

surfboard init

Het commando initialiseert de directory met de projectstructuur, een 'hello world'-applicatie en tests. Als je deze map opent met VS Code, zul je zien:

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Surfboard.config.json

  • Onder de map ./ride/ vind je een enkel bestand wallet.ride – de map waar de code van de dApp is opgeslagen. We zullen de dApp kort analyseren in het volgende blok.
  • Onder de map .\/test\/ vindt u het bestand *.js. Hier worden de tests opgeslagen.
  • .\/surfboard.config.json – het configuratiebestand voor het uitvoeren van tests.

Envs – een belangrijke sectie. Elke omgeving wordt ingesteld als volgt:

  • De eindpunt van de REST API-node die gebruikt zal worden voor het starten van de dApp en de CHAIN_ID van het netwerk.
  • De geheime frase voor een account met tokens, die de bronnen van uw testtokens zullen zijn.

Zoals u ziet, ondersteunt surfboard.config.json standaard meerdere omgevingen. De lokale omgeving is standaard ingesteld (de sleutelwaarde defaultEnv is een wijzigbaar parameter).

De Wallet-demo applicatie

Deze sectie is geen handleiding voor de RIDE-taal. Het is eerder een blik op de applicatie die we uitrollen en testen om beter te begrijpen wat er in de blockchain gebeurt.

Laten we kijken naar de eenvoudige Wallet-demo applicatie. Iedereen kan tokens naar het dApp-adres sturen. U kunt alleen uw eigen WAVES opnemen. Twee @Callable functies zijn beschikbaar via InvokeScriptTransaction:

  • deposit(), die een bijgevoegde betaling in WAVES vereist.
  • withdraw(amount: Int), die tokens teruggeeft.

Gedurende de hele levenscyclus van de dApp zal de structuur (adres → bedrag) worden onderhouden:

Actie
Resultaatstaat

begin
leeg

Alice stort 5 WAVES
alice-address → 500000000

Bob stort 2 WAVES

alice-address → 500000000
bob-address → 200000000

Bob neemt 7 WAVES op
GEWEIGERD!

Alice neemt 4 WAVES op
alice-address → 100000000
bob-address → 200000000

Hier is de code voor een volledig begrip van de situatie:

# 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

Voorbeeldcode is ook te vinden op GitHub.

De VSCode-plugin ondersteunt continue compilatie tijdens het bewerken van het bestand. U kunt de fouten altijd volgen in het tabblad PROBLEMEN.

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Als u een andere teksteditor wilt gebruiken tijdens het compileren van het bestand, gebruik dan

surfboard compile ride\/wallet.ride

Dit zal een reeks base64-gecompileerde RIDE-code genereren.

Testscript voor 'wallet.ride'

Laten we kijken naar het testbestand. Dit werkt op het JavaScript Mocha-framework. Er is een 'Before' functie en drie tests:

  • 'Before' financiert meerdere rekeningen via MassTransferTransaction, compileert het script en zet het in de blockchain.
  • 'Kan depot' verzendt InvokeScriptTransaction naar het netwerk, waardoor de functie deposit() voor elk van de twee rekeningen wordt geactiveerd.
  • 'Kan niet meer opnemen dan wat is gestort' test of niemand de tokens van iemand anders kan stelen.
  • 'Kan depot' controleert of opnames correct worden verwerkt.

Voer tests uit met Surfboard en analyseer de resultaten in Waves Explorer.

Voer om de test uit:

surfboard test

Als u meerdere scenario's heeft (bijvoorbeeld als een apart implementatiescript nodig is), kunt u deze uitvoeren.

surfboard test my-scenario.js

Surfboard verzamelt testbestanden in de map ./test/ en voert het script uit op de node die is ingesteld in surfboard.config.json. Na een paar seconden zult u iets vergelijkbaars zien:

wallet test suite
Rekeningen aanmaken met nonce: ce8d86ee
Rekening aangemaakt: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Rekening aangemaakt: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Rekening aangemaakt: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Rekeningen succesvol gefinancierd
Script is ingesteld
   √ Kan storten (4385ms)
   √ Kan niet meer opnemen dan er is gestort
   √ Kan opnemen (108ms)
3 slagen (15s)

Hoera! De tests zijn geslaagd. Laten we kijken naar wat er gebeurt wanneer we Waves Explorer gebruiken: bekijken we blokken of voeren we een van de bovengenoemde adressen in de zoekbalk in (bijvoorbeeld de bijbehorende wallet#. Hier kunt u de transactiegeschiedenis, de status van de dApp en het gedemonteerde binaire bestand vinden.

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Waves Explorer. De applicatie die zojuist is gedeployed.

Enkele tips voor Surfboard:

1. Om te testen in een testnetomgeving, gebruik:

surfboard test --env=testnet

Ontvang testtokens

2. Als u de JSON-versies van de transacties en hoe ze door de node worden verwerkt wilt bekijken, start de test met -v (betekent 'verbose'):

surfboard test -v

Gebruik van applicaties met Waves Keeper

1. Stel Waves Keeper in om te werken: http://localhost:6869

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Instellen van Waves Keeper om te werken met een lokale node

2. Importeren van de geheime zin met tokens voor het netwerk? Gebruik voor eenvoud de beginseed van uw node: waves private node seed with waves tokens. Adres: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.

3. U kunt zelf een single-page serverless applicatie uitvoeren met npm. Of ga naar een bestaande: chrome-ext.wvservices.com/dapp-wallet.html

4. Voer het walletadres in van de teststart (onderstreept hierboven) in het tekstveld voor dApp-adressen

5. Vul een klein bedrag in het veld 'Deposit' in en klik op de knop:

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
Waves Keeper vraagt om toestemming om de InvokeScriptTransaction met een betaling van 10 WAVES te ondertekenen.

6. Bevestig de transactie:

Hoe een Waves RIDE dApp te bouwen, implementeren en testen
De transactie is aangemaakt en wordt naar het netwerk verzonden. Nu is de ID zichtbaar.

7. Volg de transactie met behulp van Waves Explorer. Voer de ID in het zoekveld in.

Hoe een Waves RIDE dApp te bouwen, implementeren en testen

Conclusies en aanvullende informatie

We hebben de tools voor ontwikkeling, testen, implementatie en gebruik van eenvoudige dApps op het Waves Platform bekeken:

  • RIDE-taal
  • VS Code-editor
  • Waves Explorer
  • Surfboard
  • Waves Keeper

Links voor degenen die verder willen leren over RIDE:

Meer voorbeelden
Online IDE met voorbeelden
Waves-documentatie
Ontwikkelaarschat in Telegram
Waves en RIDE op stackoverflow
NIEUW! Online cursussen voor het maken van dApps op het Waves Platform

Blijf dieper in het onderwerp RIDE duiken en maak je eerste dApp!

TL;DR: bit.ly/2YCFnwY

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster