Ahoj! V tomto článku vám ukážem, ako napísať a spustiť bežnú dApp na uzle Waves. Pozrime sa na potrebné nástroje, metódy a príklad vývoja.
Schéma vývoja pre dApps a bežné aplikácie je takmer rovnaká:
Písanie kódu
Písanie automatizovaného testovania
Spustenie aplikácie
Testovanie
Nástroje
1. docker na spustenie uzla a prieskumníka Waves
Ak nechcete spustiť uzol, môžete tento krok preskočiť. Koniec koncov, existuje testovacia a experimentálna sieť. Bez nasadenia vlastného uzla sa však proces testovania môže pretiahnuť.
Neustále budete potrebovať nové účty s testovacími tokenmi. Faucet testovacej siete prenesie 10 VLN každých 10 minút.
Priemerný čas blokovania v testovacej sieti je 1 minúta, v uzle – 15 sekúnd. Toto je obzvlášť viditeľné, keď transakcia vyžaduje viacero potvrdení.
Agresívne ukladanie do vyrovnávacej pamäte je možné na verejných testovacích uzloch.
Môžu byť tiež dočasne nedostupné z dôvodu údržby.
Odteraz budem predpokladať, že pracujete s vlastným uzlom.
Nainštalujte Surfboard, nástroj, ktorý vám umožní spustiť testy na existujúcom uzle.
npm install -g @waves/surfboard
3. Doplnok Visual Studio Code
Tento krok je voliteľný, ak nie ste fanúšikom IDE a dávate prednosť textovým editorom. Všetky potrebné nástroje sú nástroje príkazového riadku. Ak používate vim, venujte pozornosť pluginu vim-ride.
Stiahnite si a nainštalujte kód Visual Studio: https://code.visualstudio.com/
Otvorte VS Code a nainštalujte doplnok waves-ride:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Otvorte prehliadač a prejdite na http://localhost:3000. Uvidíte, ako rýchlo sa vybuduje prázdny okruh miestnych uzlov.
Waves Explorer zobrazuje inštanciu lokálneho uzla
Štruktúra RIDE a nástroj Surfboard
Vytvorte prázdny adresár a spustite príkaz v ňom
surfboard init
Príkaz inicializuje adresár so štruktúrou projektu, aplikáciami „hello world“ a testami. Ak otvoríte tento priečinok pomocou kódu VS, uvidíte:
Surfboard.config.json
Pod priečinkom ./ride/ nájdete jeden súbor wallet.ride - adresár, kde sa nachádza kód dApp. V nasledujúcom bloku stručne rozoberieme dApps.
V priečinku ./test/ nájdete súbor *.js. Tu sú uložené testy.
./surfboard.config.json – konfiguračný súbor pre spustenie testov.
Envs je dôležitá sekcia. Každé prostredie je nakonfigurované takto:
Koncový bod REST API uzla, ktorý sa použije na spustenie dApp a CHAIN_ID siete.
Tajná fráza pre účet s tokenmi, ktoré budú zdrojom vašich testovacích tokenov.
Ako môžete vidieť, surfboard.config.json štandardne podporuje viacero prostredí. Predvolené je lokálne prostredie (kľúč defaultEnv je meniteľný parameter).
Peňaženka-demo aplikácia
Táto časť nie je odkazom na jazyk RIDE. Skôr pohľad na aplikáciu, ktorú nasadzujeme a testujeme, aby sme lepšie pochopili, čo sa v blockchaine deje.
Pozrime sa na jednoduchú aplikáciu Wallet-demo. Ktokoľvek môže poslať tokeny na adresu dApp. Môžete len stiahnuť svoje VLNY. Cez InvokeScriptTransaction sú dostupné dve funkcie @Callable:
deposit()ktorá vyžaduje priloženú platbu vo WAVES
withdraw(amount: Int)ktorý vracia žetóny
Počas celého životného cyklu dApp sa zachová štruktúra (adresa → suma):
akčná
Výsledný stav
počiatočné
prázdny
Alice vloží 5 VLN
alice-adresa → 500000000
Bob vloží 2 VLNY
alice-adresa → 500000000
bob-adresa → 200000000
Bob stiahne 7 VLN
ZAMIETNUTÉ!
Alice stiahne 4 VLNY
alice-adresa → 100000000
bob-adresa → 200000000
Tu je kód na úplné pochopenie situácie:
# 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
Doplnok VSCode podporuje nepretržitú kompiláciu pri úprave súboru. Preto môžete vždy sledovať chyby na karte PROBLÉMY.
Ak chcete pri kompilácii súboru použiť iný textový editor, použite
surfboard compile ride/wallet.ride
Toto vytvorí sériu kódu RIDE skompilovaného v base64.
Testovací skript pre „wallet.ride“
Poďme sa pozrieť na testovací súbor. Poháňané rámcom Mocha JavaScriptu. K dispozícii je funkcia „Pred“ a tri testy:
„Pred“ financuje viacero účtov prostredníctvom MassTransferTransaction, skompiluje skript a nasadí ho do blockchainu.
„Can deposit“ odošle InvokeScriptTransaction do siete, čím sa aktivuje funkcia deposit() pre každý z dvoch účtov.
„Nedá sa vybrať viac, ako bolo vložené“ testuje, že nikto nemôže ukradnúť žetóny iných ľudí.
„Môže vložiť“ kontroluje, či sú výbery spracované správne.
Spustite testy zo Surfboardu a analyzujte výsledky vo Waves Explorer
Ak chcete spustiť test, spustite
surfboard test
Ak máte viacero skriptov (napríklad potrebujete samostatný skript nasadenia), môžete spustiť
surfboard test my-scenario.js
Surfboard zhromaždí testovacie súbory v priečinku ./test/ a spustí skript na uzle, ktorý je nakonfigurovaný v surfboard.config.json. Po niekoľkých sekundách uvidíte niečo takéto:
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)
Hurá! Testy prešli. Teraz sa pozrime na to, čo sa stane pri používaní Waves Explorer: pozrite sa na bloky alebo vložte jednu z vyššie uvedených adries do vyhľadávania (napríklad zodpovedajúcu wallet#. Nájdete tam históriu transakcií, stav dApp, dekompilovaný binárny súbor.
Waves Explorer. Aplikácia, ktorá bola práve nasadená.
Niekoľko tipov na surfovanie:
1. Na testovanie v prostredí testovacej siete použite:
2. Importovať tajnú frázu s tokenmi pre sieť? Pre jednoduchosť použite počiatočný zdroj vášho uzla: waves private node seed with waves tokens. Adresa: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.