Si të ndërtoni, vendosni dhe testoni valët RIDE dApp
Përshëndetje! Në këtë artikull do t'ju tregoj se si të shkruani dhe ekzekutoni një dApp të rregullt në një nyje Waves. Le të shohim mjetet, metodat e nevojshme dhe një shembull të zhvillimit.
Skema e zhvillimit për dApps dhe aplikacionet e rregullta është pothuajse e njëjtë:
Ne shkruajmë kodin
Shkrimi i testimit të automatizuar
Nisja e aplikacionit
Duke testuar
Mjete
1. docker për të ekzekutuar nyjen dhe Waves Explorer
Nëse nuk dëshironi të filloni një nyje, mund ta kaloni këtë hap. Në fund të fundit, ekziston një rrjet testues dhe eksperimental. Por pa vendosur nyjen tuaj, procesi i testimit mund të zvarritet.
Do t'ju duhet vazhdimisht llogari të reja me argumente testimi. Rubineti i rrjetit testues transferon 10 VALËT çdo 10 minuta.
Koha mesatare e bllokimit në rrjetin e testimit është 1 minutë, në nyje - 15 sekonda. Kjo është veçanërisht e dukshme kur një transaksion kërkon konfirmime të shumta.
Memoria agresive është e mundur në nyjet e testimit publik.
Ato gjithashtu mund të jenë përkohësisht të padisponueshme për shkak të mirëmbajtjes.
Që tani e tutje unë do të supozoj se ju jeni duke punuar me nyjen tuaj.
Instaloni Surfboard, një mjet që ju lejon të kryeni teste në një nyje ekzistuese.
npm install -g @waves/surfboard
3. Shtojca Visual Studio Code
Ky hap është opsional nëse nuk jeni adhurues i IDE-ve dhe preferoni redaktuesit e tekstit. Të gjitha mjetet e nevojshme janë shërbimet e linjës së komandës. Nëse përdorni vim, kushtojini vëmendje shtojcës vim-ride.
Shkarkoni dhe instaloni 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
Hapni një shfletues dhe shkoni te http://localhost:3000. Do të shihni se sa shpejt ndërtohet një zinxhir i zbrazët i nyjeve lokale.
Waves Explorer shfaq një shembull të nyjeve lokale
Struktura RIDE dhe mjeti i sërfit
Krijoni një drejtori të zbrazët dhe ekzekutoni komandën në të
surfboard init
Komanda inicializon një direktori me strukturën e projektit, aplikacionet dhe testet "hello world". Nëse e hapni këtë dosje me VS Code, do të shihni:
Surfboard.config.json
Nën dosjen ./ride/ do të gjeni një skedar të vetëm wallet.ride - drejtoria ku ndodhet kodi dApp. Ne do të analizojmë shkurtimisht dApps në bllokun e ardhshëm.
Nën dosjen ./test/ do të gjeni një skedar *.js. Testet ruhen këtu.
./surfboard.config.json – skedari i konfigurimit për ekzekutimin e testeve.
Envs është një seksion i rëndësishëm. Çdo mjedis është konfiguruar kështu:
REST API pikë fundore e nyjës që do të përdoret për të nisur dApp dhe CHAIN_ID të rrjetit.
Një frazë sekrete për një llogari me argumente që do të jenë burimet e argumenteve tuaja të testimit.
Siç mund ta shihni, surfboard.config.json mbështet mjedise të shumta si parazgjedhje. Parazgjedhja është mjedisi lokal (çelësi defaultEnv është një parametër i ndryshueshëm).
Aplikacioni demonstrues i portofolit
Ky seksion nuk është një referencë për gjuhën RIDE. Përkundrazi, një vështrim në aplikacionin që ne vendosim dhe testojmë për të kuptuar më mirë se çfarë po ndodh në blockchain.
Le të shohim një aplikacion të thjeshtë demonstrues të Portofolit. Çdokush mund të dërgojë token në një adresë dApp. Ju mund të tërhiqni vetëm VALËT tuaja. Dy funksione @Callable janë të disponueshme përmes InvokeScriptTransaction:
deposit()e cila kërkon një pagesë të bashkangjitur në WAVES
withdraw(amount: Int)e cila kthen argumentet
Gjatë gjithë ciklit të jetës së dApp, struktura (adresa → shuma) do të ruhet:
veprim
Gjendja që rezulton
fillestar
bosh
Alice depoziton 5 VALËT
Alice-adresa → 500000000
Depozitat e Bobit 2 VALËT
Alice-adresa → 500000000
adresa bob → 200000000
Bob tërheq 7 VALËT
MOHOHET!
Alice tërheq 4 VALËT
Alice-adresa → 100000000
adresa bob → 200000000
Këtu është kodi për të kuptuar plotësisht situatën:
# 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
Shembulli i kodit mund të gjendet gjithashtu në GitHub.
Shtojca VSCode mbështet përpilimin e vazhdueshëm gjatë redaktimit të një skedari. Prandaj, gjithmonë mund të monitoroni gabimet në skedën PROBLEM.
Nëse dëshironi të përdorni një redaktues tjetër teksti gjatë përpilimit të skedarit, përdorni
surfboard compile ride/wallet.ride
Kjo do të nxjerrë një seri kodesh RIDE të përpiluar nga base64.
Skript testimi për "wallet.ride"
Le të shohim skedar testimi. Mundësuar nga korniza Mocha e JavaScript. Ekziston një funksion "Para" dhe tre teste:
"Para" financon llogari të shumta përmes MassTransferTransaction, përpilon skriptin dhe e vendos atë në blockchain.
"Mund të depozitoj" dërgon një Transaksion InvokeScript në rrjet, duke aktivizuar funksionin e depozitës() për secilën nga dy llogaritë.
Testet "Nuk mund të tërhiqni më shumë se sa është depozituar" që askush nuk mund të vjedhë tokenat e njerëzve të tjerë.
"Mund të depozitojë" kontrolle që tërheqjet janë përpunuar në mënyrë korrekte.
Kryeni teste nga Surfboard dhe analizoni rezultatet në Waves Explorer
Për të kryer testin, vraponi
surfboard test
Nëse keni shumë skripta (për shembull, keni nevojë për një skript të veçantë vendosjeje), mund të ekzekutoni
surfboard test my-scenario.js
Surfboard do të mbledhë skedarët e testimit në dosjen ./test/ dhe do të ekzekutojë skriptin në nyjen që është konfiguruar në surfboard.config.json. Pas disa sekondash do të shihni diçka të tillë:
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)
Hora! Testet e kaluara. Tani le të hedhim një vështrim se çfarë ndodh kur përdorni Waves Explorer: shikoni blloqet ose ngjisni një nga adresat e mësipërme në kërkim (për shembull, adresën përkatëse wallet#. Aty mund të gjeni historinë e transaksioneve, statusin dApp, skedarin binar të dekompiluar.
Eksploruesi i valëve. Një aplikacion që sapo është vendosur.
2. Nëse dëshironi të shihni versionet JSON të transaksioneve dhe mënyrën se si ato përpunohen nga nyja, ekzekutoni testin me -v (do të thotë 'me fjalë'):
Vendosja e Waves Keeper për të punuar me një nyje lokale
2. Importoni frazë sekrete me argumente për rrjetin? Për thjeshtësi, përdorni farën fillestare të nyjës suaj: waves private node seed with waves tokens. Adresë: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.