Kako napraviti, 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.
Šema razvoja za dApps i obične aplikacije je skoro ista:
Pisanje koda
Pisanje automatskog testiranja
Pokretanje aplikacije
Testiranje
Alati
1. docker da pokrenete čvor i Waves Explorer
Ako ne želite da pokrenete čvor, možete preskočiti ovaj korak. Na kraju krajeva, postoji testna i eksperimentalna mreža. Ali bez postavljanja vlastitog čvora, proces testiranja može se povući.
Stalno će vam trebati novi računi sa probnim tokenima. Probna mrežna slavina prenosi 10 TALASOVA svakih 10 minuta.
Prosečno vreme blokade u test mreži je 1 minut, u čvoru 15 sekundi. Ovo je posebno uočljivo kada je za transakciju potrebno više potvrda.
Agresivno keširanje je moguće na javnim test č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ćava da pokrenete testove na postojećem čvoru.
npm install -g @waves/surfboard
3. Dodatak Visual Studio Code
Ovaj korak je neobavezan ako niste ljubitelj IDE-a i preferirate uređivače teksta. Svi potrebni alati su uslužni programi komandne linije. Ako koristite vim, obratite pažnju na dodatak vim-ride.
Preuzmite i instalirajte Visual Studio Code: https://code.visualstudio.com/
Otvorite VS Code i instalirajte waves-ride plugin:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Otvorite pretraživač i idite na http://localhost:3000. Vidjet ćete koliko brzo se gradi prazan lokalni čvor.
Waves Explorer prikazuje instancu lokalnog čvora
RIDE struktura i alat za surfovanje
Kreirajte prazan direktorij i pokrenite naredbu u njemu
surfboard init
Naredba inicijalizira direktorij sa strukturom projekta, "hello world" aplikacijama i testovima. Ako otvorite ovaj folder sa VS kodom, vidjet ćete:
Surfboard.config.json
U folderu ./ride/ pronaći ćete jednu datoteku wallet.ride - direktorij u kojem se nalazi dApp kod. Ukratko ćemo analizirati dApps u sljedećem bloku.
U folderu ./test/ pronaći ćete *.js datoteku. Ovdje su pohranjeni testovi.
./surfboard.config.json – konfiguraciona datoteka za pokretanje testova.
Envs je važan odjeljak. Svako okruženje je ovako konfigurisano:
REST API krajnja tačka čvora koja će se koristiti za pokretanje dApp i CHAIN_ID mreže.
Tajna fraza za račun sa tokenima koji će biti izvori vaših testnih tokena.
Kao što vidite, surfboard.config.json podrazumevano podržava više okruženja. Podrazumevano je lokalno okruženje (defaultEnv ključ je promenljivi parametar).
Wallet-demo aplikacija
Ovaj odjeljak nije referenca na RIDE jezik. Umjesto toga, pogledajte aplikaciju koju implementiramo i testiramo kako bismo bolje razumjeli što se događa u blockchainu.
Pogledajmo jednostavnu Wallet-demo aplikaciju. Svako može slati tokene na dApp adresu. Možete povući samo svoje WAVES. Dvije @Callable funkcije su dostupne putem InvokeScriptTransaction:
deposit()što zahtijeva priloženu uplatu u WAVES
withdraw(amount: Int)koji vraća tokene
Kroz životni ciklus dApp, struktura (adresa → iznos) će se održavati:
akcija
Rezultirajuće stanje
početni
prazno
Alisa polaže 5 TALASA
alice-adresa → 500000000
Bob polaže 2 TALASA
alice-adresa → 500000000
bob-adresa → 200000000
Bob povlači 7 TALASA
DENIED!
Alice povlači 4 TALASA
alice-adresa → 100000000
bob-adresa → 200000000
Evo koda za potpuno razumijevanje situacije:
# 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 tokom uređivanja datoteke. Stoga uvijek možete pratiti greške u kartici PROBLEMI.
Ako želite da koristite drugi uređivač teksta prilikom kompajliranja datoteke, koristite
surfboard compile ride/wallet.ride
Ovo će dati niz base64 kompajliranih RIDE koda.
Test skripta za 'wallet.ride'
Hajde da pogledamo test fajl. Pokreće JavaScript-ov Mocha framework. Postoji funkcija "prije" i tri testa:
“Prije” financira više računa putem MassTransferTransaction, kompajlira skriptu i implementira je u blockchain.
“Može uplatiti” šalje InvokeScriptTransaction mreži, aktivirajući funkciju depozit() za svaki od dva računa.
“Ne mogu povući više nego što je deponovano” testira da niko ne može ukrasti tuđe tokene.
“Može uplatiti” provjerava da li su isplate ispravno obrađene.
Pokrenite testove sa Surfboard-a i analizirajte rezultate u Waves Exploreru
Da pokrenete test, pokrenite
surfboard test
Ako imate više skripti (na primjer, potrebna vam je posebna skripta za implementaciju), možete pokrenuti
surfboard test my-scenario.js
Surfboard će prikupiti test fajlove u fascikli ./test/ i pokrenuti skriptu na čvoru koji je konfigurisan 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)
Ura! Testovi su prošli. Sada pogledajmo šta se dešava kada koristite Waves Explorer: pogledajte blokove ili zalijepite jednu od gore navedenih adresa u pretragu (na primjer, odgovarajuću wallet#. Tamo možete pronaći povijest transakcija, status dApp, dekompilirani binarni fajl.
Waves Explorer. Aplikacija koja je upravo postavljena.