Bună! În acest articol, vă voi arăta cum să scrieți și să rulați un dApp obișnuit pe nodul Waves. Vom analiza instrumentele necesare, metodele și un exemplu de dezvoltare.

Schema de dezvoltare a dApps și aplicațiilor obișnuite nu diferă aproape deloc:
- Scriem cod
- Scriem teste automate
- Lansăm aplicația
- Testăm
Instrumente
1. docker pentru lansarea nodului și Waves Explorer
Dacă nu doriți să lansați nodul, puteți sări peste acest pas. Există rețele de testare și experimentale. Dar fără a desfășura propriul nod, procesul de testare se poate prelungi.
- Veți avea constant nevoie de conturi noi cu tokenuri de testare. Robinetul rețelei de testare transferă câte 10 WAVES la fiecare 10 minute.
- Timpul mediu de blocare în rețeaua de testare este de 1 minut, în nod de 15 secunde. Acest lucru este deosebit de evident când o tranzacție necesită mai multe confirmări.
- În nodurile de testare publice poate exista o memorie cache agresivă.
- De asemenea, acestea pot fi temporar indisponibile din cauza întreținerii tehnice.
În continuare, voi considera că lucrați cu propriul nod.
2. Instrumentul de linie de comandă Surfboard
- Descărcați și instalați Node.js folosind ppa, homebrew sau exe aici: .
- Instalați Surfboard – instrumentul care va permite rularea testelor pe un nod existent.
npm install -g @waves/surfboard
3. Plugin pentru Visual Studio Code
Pasul nu este obligatoriu, dacă nu sunteți fan al IDE-urilor și preferați editori de text. Toate instrumentele necesare sunt utilități de linie de comandă. Dacă folosiți vim, aveți în vedere pluginul .
Descărcați și instalați Visual Studio Code:
Deschideți VS Code și instalați pluginul waves-ride:

Extensia de browser Waves Keeper:
Gata!
Rulați nodul și Waves Explorer
1. Rulați nodul:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Asigurați-vă că nodul pornește prin REST API în :

Interfața Swagger REST API pentru nod
2. Rulați instanța Waves Explorer:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Deschideți browserul și mergeți la . Veți vedea cât de repede se construiește un lanț gol al nodului local.

Waves Explorer afișează instanța nodului local
Structura RIDE și instrumentul Surfboard
Creați un director gol și rulați comanda
surfboard init
Comanda inițiază directorul cu structura proiectului, aplicația de tip "hello world" și teste. Dacă deschideți această folder cu VS Code, veți vedea:

Surfboard.config.json
- Sub folder .\/ride\/ veți găsi un singur fișier wallet.ride – directorul unde este plasat codul dApp. Vom analiza pe scurt dApp în următorul bloc.
- Sub folder .\/test\/ veți găsi fișierul *.js. Aici sunt stocate testele.
- .\/surfboard.config.json – fișierul de configurare pentru rularea testelor.
Envs – o secțiune importantă. Fiecare mediu este configurat astfel:
- Punctul final REST API al nodului, care va fi folosit pentru a lansa dApp și CHAIN_ID-ul rețelei.
- Fraza secretă pentru contul cu tokenurile care vor fi sursa tokenurilor testului dvs.
După cum observați, surfboard.config.json suportă în mod implicit mai multe medii. Mediu implicit este setat (cheia defaultEnv – parametru modificabil).
Aplicația Wallet-demo
Această secțiune nu este un ghid pentru limbajul RIDE. Ci mai degrabă, o privire asupra aplicației pe care o desfășurăm și testăm, pentru a înțelege mai bine ce se întâmplă în blockchain.
Să examinăm o aplicație simplă Wallet-demo. Oricine poate trimite tokenuri către adresa dApp. Numai WAVES proprii pot fi retrase. Două funcții @Callable sunt disponibile prin InvokeScriptTransaction:
deposit(), care necesită un plată atașată în WAVESwithdraw(amount: Int), care returnează tokenuri
Pe parcursul întregului ciclu de viață al dApp, structura (address → amount) va fi menținută:
Acțiune
Starea rezultantă
inițial
gol
Alice depune 5 WAVES
alice-address → 500000000
Bob depune 2 WAVES
alice-address → 500000000
bob-address → 200000000
Bob retrage 7 WAVES
REFUZAT!
Alice retrage 4 WAVES
alice-address → 100000000
bob-address → 200000000
Iată codul pentru a înțelege pe deplin situația:
# 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() = falseExemplul de cod se găsește și pe .
Pluginul VSCode suportă compilarea continuă în timpul editării fișierului. Deci, puteți urmări constant erorile în tab-ul PROBLEMS.

Dacă doriți să folosiți un alt editor de text în timpul compilării fișierului, utilizați
surfboard compile ride\/wallet.ride
Aceasta va genera o serie de cod RIDE compilat în base64.
Scenariul de test pentru ‘wallet.ride’
Să ne uităm la . Funcționează pe framework-ul Mocha de JavaScript. Există o funcție „Before” și trei teste:
- „Before” finanțează mai multe conturi prin MassTransferTransaction, compilează scriptul și îl desfășoară în blockchain.
- „Can deposit” trimite în rețea InvokeScriptTransaction, activând funcția deposit() pentru fiecare dintre cele două conturi.
- „Can’t withdraw more than was deposited” testează că nimeni nu poate fura tokenurile altora.
- „Can deposit” verifică că retragerile sunt procesate corect.
Rularea testelor cu Surfboard și analiza rezultatelor în Waves Explorer
Pentru a rula testul, executați
surfboard test
Dacă aveți mai multe scenarii (de exemplu, aveți nevoie de un script de desfășurare separat), puteți rula
surfboard test my-scenario.js
Surfboard va aduna fișierele de test în folderul ./test/ și va rula scriptul pe nodul configurat în surfboard.config.json. După câteva secunde, veți observa ceva similar:
wallet test suite
Generând conturi cu nonce: ce8d86ee
Cont generat: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Cont generat: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Cont generat: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Conturile au fost finanțate cu succes
Scriptul a fost setat
√ Poate depune (4385ms)
√ Nu poate retrage mai mult decât a fost depus
√ Poate retrage (108ms)
3 teste acceptate (15s)
Ura! Testele au fost trecute. Acum să vedem ce se întâmplă când folosim Waves Explorer: să vizualizăm blocuri sau să introducem una dintre adresele menționate mai sus în căutare (de exemplu, cea corespunzătoare wallet#. Acolo puteți găsi istoricul tranzacțiilor, starea dApp-ului, fișierul binar decompilat.

Waves Explorer. Aplicația pe care tocmai ați desfășurat-o.
Câteva sugestii pentru Surfboard:
1. Pentru a testa în mediu testnet, folosiți:
surfboard test --env=testnet
2. Dacă doriți să vizualizați versiunile JSON ale tranzacțiilor și cum sunt procesate de nod, rulați testul cu -v (înseamnă ‘verbose’):
surfboard test -v
Folosirea aplicațiilor cu Waves Keeper
1. Configurați Waves Keeper pentru a funcționa:

Configurarea Waves Keeper pentru a lucra cu nodul local
2. Importați fraza secretă cu tokenuri pentru rețea? Pentru simplitate, folosiți seed-ul inițial al nodului dvs.: waves private node seed with waves tokens. Adresa: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.
3. Puteți rula o aplicație fără server pe pagină unică, folosind npm. Sau mergeți la una existentă:
4. Introduceți adresa portofelului din rularea de test (evidențiată mai sus) în câmpul de adresă dApp
5. Introduceți o sumă mică în câmpul ‚Depunere’ și apăsați butonul:

Waves Keeper solicită permisiunea de a semna InvokeScriptTransaction cu o plată de 10 WAVES.
6. Confirmați tranzacția:

Tranzacția a fost creată și este transmisă în rețea. Acum se poate vedea ID-ul acesteia
7. Monitorizați tranzacția folosind Waves Explorer. Introduceți ID-ul în câmpul de căutare

Concluzii și informații suplimentare
Am analizat instrumentele de dezvoltare, testare, desfășurare și utilizare a dApp-urilor simple pe platforma Waves:
- Limba RIDE
- Editor VS Code
- Waves Explorer
- Surfboard
- Waves Keeper
Linkuri pentru cei care doresc să continue studiul RIDE:
Continuați să vă aprofundați în RIDE și creați primul vostru dApp!
TL;DR:
Sursa: habr.com
