Hvordan man bygger, implementerer og tester Waves RIDE dApp
Hej! I denne artikel vil jeg vise dig, hvordan du skriver og kører en almindelig dApp på en Waves-node. Lad os se på de nødvendige værktøjer, metoder og et eksempel på udvikling.
Udviklingsskemaet for dApps og almindelige applikationer er næsten det samme:
Vi skriver koden
Skrivning af automatiseret test
Start applikationen
Afprøvning
Værktøj
1. docker for at køre noden og Waves Explorer
Hvis du ikke vil starte en node, kan du springe dette trin over. Der er jo et test- og eksperimentelt netværk. Men uden at implementere din egen node, kan testprocessen trække ud.
Du får konstant brug for nye konti med testtokens. Testnetværkshanen overfører 10 WAVES hvert 10. minut.
Den gennemsnitlige blokeringstid i testnetværket er 1 minut, i noden – 15 sekunder. Dette er især bemærkelsesværdigt, når en transaktion kræver flere bekræftelser.
Aggressiv caching er mulig på offentlige testknudepunkter.
De kan også være midlertidigt utilgængelige på grund af vedligeholdelse.
Fra nu af vil jeg antage, at du arbejder med din egen node.
Installer Surfboard, et værktøj, der giver dig mulighed for at køre test på en eksisterende node.
npm install -g @waves/surfboard
3. Visual Studio Code plugin
Dette trin er valgfrit, hvis du ikke er fan af IDE'er og foretrækker teksteditorer. Alle de nødvendige værktøjer er kommandolinjeværktøjer. Hvis du bruger vim, skal du være opmærksom på plugin'et vim-ride.
Download og installer Visual Studio Code: https://code.visualstudio.com/
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Åbn en browser og gå til http://localhost:3000. Du vil se, hvor hurtigt et tomt lokalt nodekredsløb bygges.
Waves Explorer viser en lokal nodeinstans
RIDE struktur og Surfboard værktøj
Opret en tom mappe og kør kommandoen i den
surfboard init
Kommandoen initialiserer en mappe med projektstrukturen, "hello world"-applikationer og tests. Hvis du åbner denne mappe med VS-kode, vil du se:
Surfboard.config.json
Under mappen ./ride/ finder du en enkelt fil wallet.ride - det bibliotek, hvor dApp-koden er placeret. Vi vil kort analysere dApps i næste blok.
Under mappen ./test/ finder du en *.js-fil. Tests gemmes her.
./surfboard.config.json – konfigurationsfil til at køre test.
Envs er et vigtigt afsnit. Hvert miljø er konfigureret således:
REST API-endepunkt for den node, der vil blive brugt til at starte netværkets dApp og CHAIN_ID.
En hemmelig sætning for en konto med tokens, der vil være kilderne til dine test-tokens.
Som du kan se, understøtter surfboard.config.json flere miljøer som standard. Standarden er det lokale miljø (standardEnv-nøglen er en parameter, der kan ændres).
Tegnebog-demo-applikation
Dette afsnit er ikke en reference til RIDE-sproget. Snarere et kig på den applikation, som vi implementerer og tester for bedre at forstå, hvad der sker i blockchain.
Lad os se på en simpel Wallet-demo-applikation. Alle kan sende tokens til en dApp-adresse. Du kan kun trække dine WAVES tilbage. To @Callable-funktioner er tilgængelige via InvokeScriptTransaction:
deposit()som kræver en vedhæftet betaling i WAVES
withdraw(amount: Int)som returnerer tokens
Gennem hele dApps livscyklus vil strukturen (adresse → beløb) blive vedligeholdt:
Handling
Resulterende tilstand
initial
tom
Alice afsætter 5 BØLGER
alice-adresse → 500000000
Bob indsætter 2 BØGER
alice-adresse → 500000000
bob-adresse → 200000000
Bob trækker 7 BØGER tilbage
NÆGTET!
Alice trækker 4 BØGER tilbage
alice-adresse → 100000000
bob-adresse → 200000000
Her er koden til fuldt ud at forstå situationen:
# 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
VSCode-plugin'et understøtter kontinuerlig kompilering, mens du redigerer en fil. Derfor kan du altid overvåge fejl i fanen PROBLEMER.
Hvis du vil bruge en anden teksteditor, når du kompilerer filen, skal du bruge
surfboard compile ride/wallet.ride
Dette vil udsende en række base64-kompileret RIDE-kode.
Testscript til 'wallet.ride'
Lad os se på testfil. Drevet af JavaScripts Mocha-ramme. Der er en "Før"-funktion og tre tests:
"Før" finansierer flere konti via MassTransferTransaction, kompilerer scriptet og implementerer det til blockchain.
"Can deposit" sender en InvokeScriptTransaction til netværket, og aktiverer deposit()-funktionen for hver af de to konti.
“Kan ikke hæve mere end der blev indbetalt” tester, at ingen kan stjæle andres tokens.
"Kan indbetale" kontrollerer, at udbetalinger behandles korrekt.
Kør test fra Surfboard og analyser resultater i Waves Explorer
For at køre testen, kør
surfboard test
Hvis du har flere scripts (du har f.eks. brug for et separat implementeringsscript), kan du køre
surfboard test my-scenario.js
Surfboard samler testfilerne i mappen ./test/ og kører scriptet på den node, der er konfigureret i surfboard.config.json. Efter et par sekunder vil du se noget som dette:
wallet test suite
Generating accounts with nonce: ce8d86ee
Account generated: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Account generated: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Account generated: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Accounts successfully funded
Script has been set
√ Can deposit (4385ms)
√ Cannot withdraw more than was deposited
√ Can withdraw (108ms)
3 passing (15s)
Hurra! Beståede prøver. Lad os nu tage et kig på, hvad der sker, når du bruger Waves Explorer: se på blokkene eller indsæt en af adresserne ovenfor i søgningen (f.eks. den tilsvarende wallet#. Der kan du finde transaktionshistorik, dApp-status, dekompileret binær fil.
Waves Explorer. En applikation, der netop er blevet implementeret.
Opsætning af Waves Keeper til at arbejde med en lokal node
2. Importer hemmelig sætning med tokens til netværket? For nemheds skyld skal du bruge det indledende frø af din node: waves private node seed with waves tokens. Adresse: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.