ProHoster > Blog > uprava > Kako izgraditi, implementirati i testirati Waves RIDE dApp
Kako izgraditi, implementirati i testirati Waves RIDE dApp
Zdravo! U ovom članku ću vam pokazati kako napisati i pokrenuti običnu dApp na Waves čvoru. Pogledajmo potrebne alate, metode i primjer razvoja.
Razvojna shema za dApps i obične aplikacije gotovo je ista:
Mi pišemo kod
Pisanje automatiziranog testiranja
Pokretanje aplikacije
Testiranje
Alat
1. docker za pokretanje čvora i Waves Explorera
Ako ne želite pokrenuti čvor, možete preskočiti ovaj korak. Uostalom, postoji testna i eksperimentalna mreža. Ali bez postavljanja vlastitog čvora, proces testiranja može se odužiti.
Stalno ćete trebati nove račune s testnim tokenima. Testna mrežna slavina prenosi 10 VALOVA svakih 10 minuta.
Prosječno vrijeme bloka u testnoj mreži je 1 minuta, u čvoru – 15 sekundi. To je posebno vidljivo kada transakcija zahtijeva više potvrda.
Agresivno predmemoriranje moguće je na javnim testnim čvorovima.
Također mogu biti privremeno nedostupni zbog održavanja.
Od sada ću pretpostaviti da radite sa svojim vlastitim čvorom.
Instalirajte Surfboard, alat koji vam omogućuje pokretanje testova na postojećem čvoru.
npm install -g @waves/surfboard
3. Visual Studio Code dodatak
Ovaj korak nije obavezan ako niste ljubitelj IDE-a i preferirate uređivače teksta. Svi potrebni alati su pomoćni programi naredbenog retka. Ako koristite vim, obratite pozornost na dodatak vim-vožnja.
Preuzmite i instalirajte Visual Studio Code: https://code.visualstudio.com/
Otvorite VS Code i instalirajte dodatak za vožnju valovima:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Otvorite preglednik i idite na http://localhost:3000. Vidjet ćete kako se brzo gradi krug praznog lokalnog čvora.
Waves Explorer prikazuje lokalnu instancu čvora
RIDE struktura i alat za surfanje
Napravite prazan direktorij i pokrenite naredbu u njemu
surfboard init
Naredba inicijalizira direktorij sa strukturom projekta, "hello world" aplikacijama i testovima. Ako otvorite ovu mapu s VS kodom, vidjet ćete:
Daska za surfanje.config.json
U mapi ./ride/ pronaći ćete jednu datoteku wallet.ride - direktorij u kojem se nalazi dApp kod. U sljedećem bloku ćemo ukratko analizirati dApps.
U mapi ./test/ pronaći ćete *.js datoteku. Ovdje se pohranjuju testovi.
./surfboard.config.json – konfiguracijska datoteka za pokretanje testova.
Envs je važan odjeljak. Svako okruženje konfigurirano je ovako:
REST API krajnja točka čvora koja će se koristiti za pokretanje dApp i CHAIN_ID mreže.
Tajna fraza za račun s tokenima koji će biti izvori vaših testnih tokena.
Kao što vidite, surfboard.config.json prema zadanim postavkama podržava više okruženja. Zadano je lokalno okruženje (defaultEnv ključ je promjenjivi parametar).
Wallet-demo aplikacija
Ovaj odjeljak nije referenca na jezik RIDE. Umjesto toga, pogledajte aplikaciju koju postavljamo i testiramo kako bismo bolje razumjeli što se događa u blockchainu.
Pogledajmo jednostavnu aplikaciju Wallet-demo. Svatko može poslati tokene na dApp adresu. Možete povući samo svoje VALOVE. Dvije funkcije @Callable dostupne su putem InvokeScriptTransaction:
deposit()što zahtijeva priloženo plaćanje u WAVES-u
withdraw(amount: Int)koji vraća žetone
Tijekom životnog ciklusa dApp-a, struktura (adresa → iznos) će se održavati:
# 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
Dodatak VSCode podržava kontinuiranu kompilaciju tijekom uređivanja datoteke. Stoga uvijek možete pratiti pogreške u kartici PROBLEMI.
Ako želite koristiti drugi uređivač teksta prilikom sastavljanja datoteke, koristite
surfboard compile ride/wallet.ride
Ovo će ispisati niz base64 kompajliranog RIDE koda.
Testna skripta za 'wallet.ride'
Pogledajmo testna datoteka. Pokreće JavaScriptov okvir Mocha. Postoji funkcija "Prije" i tri testa:
"Before" financira više računa putem MassTransferTransaction, kompilira skriptu i implementira je u blockchain.
“Can deposit” šalje InvokeScriptTransaction mreži, aktivirajući funkciju deposit() za svaki od dva računa.
"Ne može povući više nego što je položeno" testovi da nitko ne može ukrasti tuđe tokene.
“Može uplatiti” provjerava jesu li isplate ispravno obrađene.
Pokrenite testove iz Surfboarda i analizirajte rezultate u Waves Exploreru
Da biste pokrenuli test, pokrenite
surfboard test
Ako imate više skripti (na primjer, potrebna vam je zasebna skripta za implementaciju), možete pokrenuti
surfboard test my-scenario.js
Surfboard će prikupiti testne datoteke u mapu ./test/ i pokrenuti skriptu na čvoru koji je konfiguriran u surfboard.config.json. Nakon nekoliko sekundi vidjet ćete nešto poput ovoga:
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)
hura! Testovi su prošli. Sada pogledajmo što se događa kada koristite Waves Explorer: pogledajte blokove ili zalijepite jednu od gornjih adresa u pretraživanje (na primjer, odgovarajuću wallet#. Tamo možete pronaći povijest transakcija, status dApp-a, dekompiliranu binarnu datoteku.
Waves Explorer. Aplikacija koja je upravo postavljena.