Hvordan bygge, distribuere og teste Waves RIDE dApp
Hallo! I denne artikkelen vil jeg vise deg hvordan du skriver og kjører en vanlig dApp på en Waves-node. La oss se på nødvendige verktøy, metoder og et eksempel på utvikling.
Utviklingsskjemaet for dApps og vanlige applikasjoner er nesten det samme:
Vi skriver koden
Skrive automatisert testing
Å starte programmet
Testing
Verktøy
1. docker for å kjøre noden og Waves Explorer
Hvis du ikke vil starte en node, kan du hoppe over dette trinnet. Tross alt er det et test- og eksperimentelt nettverk. Men uten å distribuere din egen node, kan testprosessen trekke ut.
Du vil stadig trenge nye kontoer med testtokens. Testnettverkskranen overfører 10 BØLGER hvert 10. minutt.
Gjennomsnittlig blokkeringstid i testnettverket er 1 minutt, i noden – 15 sekunder. Dette er spesielt merkbart når en transaksjon krever flere bekreftelser.
Aggressiv caching er mulig på offentlige testnoder.
De kan også være midlertidig utilgjengelige på grunn av vedlikehold.
Fra nå av vil jeg anta at du jobber med din egen node.
Installer Surfboard, et verktøy som lar deg kjøre tester på en eksisterende node.
npm install -g @waves/surfboard
3. Visual Studio Code-plugin
Dette trinnet er valgfritt hvis du ikke er en fan av IDE-er og foretrekker tekstredigerere. Alle nødvendige verktøy er kommandolinjeverktøy. Hvis du bruker vim, vær oppmerksom på plugin vim-ride.
Last ned 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
Åpne en nettleser og gå til http://localhost:3000. Du vil se hvor raskt en tom lokal nodekrets bygges.
Waves Explorer viser en lokal nodeforekomst
RIDE-struktur og surfebrettverktøy
Opprett en tom katalog og kjør kommandoen i den
surfboard init
Kommandoen initialiserer en katalog med prosjektstrukturen, "hallo verden"-applikasjoner og tester. Hvis du åpner denne mappen med VS-kode, vil du se:
Surfboard.config.json
Under ./ride/-mappen finner du en enkelt fil wallet.ride - katalogen der dApp-koden er plassert. Vi vil kort analysere dApps i neste blokk.
Under ./test/-mappen finner du en *.js-fil. Tester lagres her.
./surfboard.config.json – konfigurasjonsfil for å kjøre tester.
Envs er en viktig del. Hvert miljø er konfigurert slik:
REST API-endepunkt for noden som skal brukes til å starte nettverkets dApp og CHAIN_ID.
En hemmelig setning for en konto med tokens som vil være kildene til testtokenene dine.
Som du kan se, støtter surfboard.config.json flere miljøer som standard. Standard er det lokale miljøet (standardEnv-nøkkelen er en parameter som kan endres).
Lommebok-demo-applikasjon
Denne delen er ikke en referanse til RIDE-språket. Snarere en titt på applikasjonen som vi distribuerer og tester for bedre å forstå hva som skjer i blokkjeden.
La oss se på en enkel Wallet-demo-applikasjon. Alle kan sende tokens til en dApp-adresse. Du kan bare ta ut dine WAVES. To @Callable-funksjoner er tilgjengelige via InvokeScriptTransaction:
deposit()som krever en vedlagt betaling i WAVES
withdraw(amount: Int)som returnerer tokens
Gjennom hele dApps livssyklus vil strukturen (adresse → beløp) opprettholdes:
Handling
Resulterende tilstand
innledende
tom
Alice legger inn 5 BØLGER
alice-adresse → 500000000
Bob setter inn 2 BØLGER
alice-adresse → 500000000
bob-adresse → 200000000
Bob trekker tilbake 7 BØLGER
NEKTE!
Alice trekker seg tilbake 4 BØLGER
alice-adresse → 100000000
bob-adresse → 200000000
Her er koden for å forstå situasjonen fullt ut:
# 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-pluginen støtter kontinuerlig kompilering mens du redigerer en fil. Derfor kan du alltid overvåke feil i PROBLEMER-fanen.
Hvis du vil bruke et annet tekstredigeringsprogram når du kompilerer filen, bruk
surfboard compile ride/wallet.ride
Dette vil sende ut en serie med base64-kompilert RIDE-kode.
Testskript for 'wallet.ride'
La oss se på testfil. Drevet av JavaScripts Mocha-rammeverk. Det er en "Før"-funksjon og tre tester:
"Før" finansierer flere kontoer via MassTransferTransaction, kompilerer skriptet og distribuerer det til blokkjeden.
"Can deposit" sender en InvokeScriptTransaction til nettverket, og aktiverer deposit()-funksjonen for hver av de to kontoene.
"Kan ikke ta ut mer enn det ble satt inn" tester som ingen kan stjele andres tokens.
"Kan sette inn" sjekker at uttak behandles riktig.
Kjør tester fra Surfboard og analyser resultater i Waves Explorer
For å kjøre testen, kjør
surfboard test
Hvis du har flere skript (du trenger for eksempel et separat distribusjonsskript), kan du kjøre
surfboard test my-scenario.js
Surfboard vil samle testfilene i ./test/-mappen og kjøre skriptet på noden som er konfigurert i surfboard.config.json. Etter noen sekunder vil du se noe slikt:
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! Tester bestått. La oss nå ta en titt på hva som skjer når du bruker Waves Explorer: se på blokkene eller lim inn en av adressene ovenfor i søket (for eksempel den tilsvarende wallet#. Der kan du finne transaksjonshistorikk, dApp-status, dekompilert binær fil.
Waves Explorer. En applikasjon som nettopp har blitt distribuert.
Sette opp Waves Keeper for å jobbe med en lokal node
2. Importere hemmelig frase med tokens for nettverket? For enkelhets skyld, bruk det første frøet til noden din: waves private node seed with waves tokens. Adresse: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.