Hur man bygger, distribuerar och testar Waves RIDE dApp
Hallå! I den här artikeln kommer jag att visa dig hur du skriver och kör en vanlig dApp på en Waves-nod. Låt oss titta på nödvändiga verktyg, metoder och ett exempel på utveckling.
Utvecklingsschemat för dApps och vanliga applikationer är nästan detsamma:
Vi skriver koden
Skriver automatiserade tester
Starta applikationen
Testning
Verktyg
1. docker för att köra noden och Waves Explorer
Om du inte vill starta en nod kan du hoppa över det här steget. Det finns trots allt ett test- och experimentnätverk. Men utan att distribuera din egen nod kan testprocessen dra ut på tiden.
Du kommer ständigt att behöva nya konton med testtokens. Testnätverkskranen överför 10 VÅGOR var 10:e minut.
Den genomsnittliga blockeringstiden i testnätverket är 1 minut, i noden – 15 sekunder. Detta är särskilt märkbart när en transaktion kräver flera bekräftelser.
Aggressiv cachning är möjlig på offentliga testnoder.
De kan också vara tillfälligt otillgängliga på grund av underhåll.
Från och med nu kommer jag att anta att du arbetar med din egen nod.
Installera Surfboard, ett verktyg som låter dig köra tester på en befintlig nod.
npm install -g @waves/surfboard
3. Visual Studio Code-plugin
Det här steget är valfritt om du inte är ett fan av IDE och föredrar textredigerare. Alla nödvändiga verktyg är kommandoradsverktyg. Om du använder vim, var uppmärksam på plugin vim-ride.
Ladda ner och installera 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
Öppna en webbläsare och gå till http://localhost:3000. Du kommer att se hur snabbt en tom lokal nodkrets byggs.
Waves Explorer visar en lokal nodinstans
RIDE struktur och surfbräda verktyg
Skapa en tom katalog och kör kommandot i den
surfboard init
Kommandot initierar en katalog med projektstrukturen, "hej världen"-applikationer och tester. Om du öppnar den här mappen med VS-kod ser du:
Surfboard.config.json
Under mappen ./ride/ hittar du en enda fil wallet.ride - katalogen där dApp-koden finns. Vi kommer kort att analysera dApps i nästa block.
Under mappen ./test/ hittar du en *.js-fil. Tester lagras här.
./surfboard.config.json – konfigurationsfil för att köra tester.
Envs är ett viktigt avsnitt. Varje miljö är konfigurerad så här:
REST API-slutpunkt för noden som kommer att användas för att starta nätverkets dApp och CHAIN_ID.
En hemlig fras för ett konto med tokens som kommer att vara källorna till dina testtokens.
Som du kan se stöder surfboard.config.json flera miljöer som standard. Standard är den lokala miljön (defaultEnv-nyckeln är en parameter som kan ändras).
Plånbok-demo-applikation
Det här avsnittet är inte en referens till RIDE-språket. Snarare en titt på applikationen som vi distribuerar och testar för att bättre förstå vad som händer i blockkedjan.
Låt oss titta på en enkel Wallet-demoapplikation. Vem som helst kan skicka tokens till en dApp-adress. Du kan bara ta ut dina WAVES. Två @Callable-funktioner är tillgängliga via InvokeScriptTransaction:
deposit()vilket kräver en bifogad betalning i WAVES
withdraw(amount: Int)som returnerar tokens
Under hela dApps livscykel kommer strukturen (adress → mängd) att bibehållas:
Handling
Resulterande tillstånd
inledande
tom
Alice sätter in 5 VÅGOR
alice-adress → 500000000
Bob sätter in 2 VÅGOR
alice-adress → 500000000
bob-adress → 200000000
Bob drar tillbaka 7 VÅGOR
NEKAD!
Alice drar tillbaka 4 VÅGOR
alice-adress → 100000000
bob-adress → 200000000
Här är koden för att helt förstå 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-pluginet stöder kontinuerlig kompilering medan du redigerar en fil. Därför kan du alltid övervaka fel på fliken PROBLEM.
Om du vill använda en annan textredigerare när du kompilerar filen, använd
surfboard compile ride/wallet.ride
Detta kommer att mata ut en serie av base64-kompilerad RIDE-kod.
Testskript för 'wallet.ride'
Låt oss titta på testfil. Drivs av JavaScripts Mocha-ramverk. Det finns en "Före"-funktion och tre tester:
"Before" finansierar flera konton via MassTransferTransaction, kompilerar skriptet och distribuerar det till blockkedjan.
"Kan sätta in" skickar en InvokeScriptTransaction till nätverket och aktiverar funktionen deposit() för vart och ett av de två kontona.
"Kan inte ta ut mer än vad som sattes in" tester att ingen kan stjäla andras tokens.
"Kan sätta in" kontrollerar att uttag behandlas korrekt.
Kör tester från Surfboard och analysera resultat i Waves Explorer
För att köra testet, kör
surfboard test
Om du har flera skript (du behöver till exempel ett separat distributionsskript) kan du köra
surfboard test my-scenario.js
Surfboard samlar in testfilerna i mappen ./test/ och kör skriptet på noden som är konfigurerad i surfboard.config.json. Efter några sekunder ser du något i stil med detta:
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! Godkända prov. Låt oss nu ta en titt på vad som händer när du använder Waves Explorer: titta på blocken eller klistra in en av adresserna ovan i sökningen (till exempel motsvarande wallet#. Där kan du hitta transaktionshistorik, dApp-status, dekompilerad binär fil.
Waves Explorer. En applikation som precis har distribuerats.
Ställa in Waves Keeper för att arbeta med en lokal nod
2. Importera hemlig fras med tokens för nätverket? För enkelhetens skull, använd det initiala fröet för din nod: waves private node seed with waves tokens. Adress: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.