ProHoster > Blog > Uprava > Kako zgraditi, namestiti in preizkusiti Waves RIDE dApp
Kako zgraditi, namestiti in preizkusiti Waves RIDE dApp
Zdravo! V tem članku vam bom pokazal, kako napisati in zagnati običajno dApp na vozlišču Waves. Oglejmo si potrebna orodja, metode in primer razvoja.
Razvojna shema za dApps in običajne aplikacije je skoraj enaka:
Napišemo kodo
Pisanje avtomatiziranega testiranja
Zaženite aplikacijo
Testiranje
Orodja
1. docker za zagon vozlišča in Waves Explorerja
Če ne želite zagnati vozlišča, lahko ta korak preskočite. Navsezadnje obstaja testna in eksperimentalna mreža. Toda brez uvedbe lastnega vozlišča se lahko postopek testiranja zavleče.
Nenehno boste potrebovali nove račune s testnimi žetoni. Testna omrežna pipa prenese 10 VALOV vsakih 10 minut.
Povprečni čas bloka v testnem omrežju je 1 minuta, v vozlišču pa 15 sekund. To je še posebej opazno, ko transakcija zahteva več potrditev.
Agresivno predpomnjenje je možno na javnih testnih vozliščih.
Lahko so tudi začasno nedosegljivi zaradi vzdrževanja.
Od zdaj naprej bom predvideval, da delate s svojim vozliščem.
Namestite Surfboard, orodje, ki vam omogoča izvajanje testov na obstoječem vozlišču.
npm install -g @waves/surfboard
3. Vtičnik Visual Studio Code
Ta korak ni obvezen, če niste ljubitelj IDE in imate raje urejevalnike besedil. Vsa potrebna orodja so pripomočki ukazne vrstice. Če uporabljate vim, bodite pozorni na vtičnik vim-vožnja.
Prenesite in namestite Visual Studio Code: https://code.visualstudio.com/
Odprite kodo VS in namestite vtičnik za vožnjo po valovih:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Odprite brskalnik in pojdite na http://localhost:3000. Videli boste, kako hitro se zgradi prazno vezje lokalnega vozlišča.
Waves Explorer prikaže primerek lokalnega vozlišča
Struktura RIDE in orodje za surfanje
Ustvarite prazen imenik in v njem zaženite ukaz
surfboard init
Ukaz inicializira imenik s strukturo projekta, aplikacijami »zdravo, svet« in testi. Če odprete to mapo s kodo VS, boste videli:
Surfboard.config.json
Pod mapo ./ride/ boste našli eno datoteko wallet.ride – imenik, kjer se nahaja koda dApp. V naslednjem bloku bomo na kratko analizirali dApps.
V mapi ./test/ boste našli datoteko *.js. Tukaj so shranjeni testi.
./surfboard.config.json – konfiguracijska datoteka za izvajanje testov.
Envs je pomemben razdelek. Vsako okolje je konfigurirano takole:
Končna točka REST API vozlišča, ki bo uporabljeno za zagon dApp in CHAIN_ID omrežja.
Skrivna fraza za račun z žetoni, ki bodo viri vaših testnih žetonov.
Kot lahko vidite, surfboard.config.json privzeto podpira več okolij. Privzeto je lokalno okolje (ključ defaultEnv je spremenljiv parameter).
Denarnica-demo aplikacija
Ta razdelek se ne nanaša na jezik RIDE. Namesto tega si oglejte aplikacijo, ki jo uvajamo in testiramo, da bi bolje razumeli, kaj se dogaja v verigi blokov.
Oglejmo si preprosto demo aplikacijo Wallet. Vsakdo lahko pošlje žetone na naslov dApp. Dvignete lahko le svoje WAVES. Prek InvokeScriptTransaction sta na voljo dve funkciji @Callable:
deposit()ki zahteva priloženo plačilo v WAVES
withdraw(amount: Int)ki vrne žetone
V celotnem življenjskem ciklu aplikacije dApp bo ohranjena struktura (naslov → količina):
Ukrep
Posledično stanje
začetna
prazen
Alice položi 5 VALOV
alice-naslov → 500000000
Bob položi 2 VALOVA
alice-naslov → 500000000
bob-naslov → 200000000
Bob umakne 7 VALOV
ZAVRNJENO!
Alice umakne 4 VALOVE
alice-naslov → 100000000
bob-naslov → 200000000
Tukaj je koda za popolno razumevanje 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
Vtičnik VSCode podpira neprekinjeno prevajanje med urejanjem datoteke. Zato lahko vedno spremljate napake v zavihku TEŽAVE.
Če želite pri prevajanju datoteke uporabiti drug urejevalnik besedil, uporabite
surfboard compile ride/wallet.ride
To bo izpisalo niz base64 prevedene kode RIDE.
Testni skript za 'wallet.ride'
Poglejmo si testna datoteka. Poganja JavaScriptovo ogrodje Mocha. Obstaja funkcija "Pred" in trije testi:
»Before« financira več računov prek MassTransferTransaction, sestavi skript in ga namesti v verigo blokov.
»Can deposit« pošlje InvokeScriptTransaction v omrežje in aktivira funkcijo deposit() za vsakega od obeh računov.
Preizkusi »ni mogoče dvigniti več, kot je bilo položeno«, da nihče ne more ukrasti žetonov drugih ljudi.
»Can deposit« preverja, ali so dvigi pravilno obdelani.
Zaženite teste iz Surfboarda in analizirajte rezultate v Waves Explorerju
Če želite izvesti test, zaženite
surfboard test
Če imate več skriptov (potrebujete na primer ločen skript za uvajanje), lahko zaženete
surfboard test my-scenario.js
Surfboard bo zbral preskusne datoteke v mapi ./test/ in zagnal skript na vozlišču, ki je konfigurirano v surfboard.config.json. Po nekaj sekundah boste videli nekaj takega:
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! Testi opravljeni. Zdaj pa poglejmo, kaj se zgodi, ko uporabljate Waves Explorer: poglejte bloke ali prilepite enega od zgornjih naslovov v iskanje (na primer ustrezen wallet#. Tam lahko najdete zgodovino transakcij, status dApp, dekompilirano binarno datoteko.
Raziskovalec valov. Aplikacija, ki je bila pravkar nameščena.
Nastavitev Waves Keeper za delo z lokalnim vozliščem
2. Uvoz skrivne fraze z žetoni za omrežje? Za poenostavitev uporabite začetno seme vašega vozlišča: waves private node seed with waves tokens. Naslov: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.