Ahoj! V tomto článku vám ukážu, jak napsat a spustit běžný dApp na uzlu Waves. Podívejme se na potřebné nástroje, metody a příklad vývoje.
Schéma vývoje pro dApps a běžné aplikace je téměř stejné:
Napíšeme kód
Psaní automatizovaného testování
Spusťte aplikaci
Testování
Nástroje
1. docker spustit uzel a Waves Explorer
Pokud nechcete spustit uzel, můžete tento krok přeskočit. Koneckonců existuje testovací a experimentální síť. Ale bez nasazení vlastního uzlu se proces testování může protáhnout.
Neustále budete potřebovat nové účty s testovacími tokeny. Faucet testovací sítě přenáší 10 VLN každých 10 minut.
Průměrná doba blokování v testovací síti je 1 minuta, v uzlu – 15 sekund. To je zvláště patrné, když transakce vyžaduje více potvrzení.
Agresivní ukládání do mezipaměti je možné na veřejných testovacích uzlech.
Mohou být také dočasně nedostupné z důvodu údržby.
Od této chvíle budu předpokládat, že pracujete se svým vlastním uzlem.
Nainstalujte Surfboard, nástroj, který vám umožní spouštět testy na existujícím uzlu.
npm install -g @waves/surfboard
3. Zásuvný modul Visual Studio Code
Tento krok je volitelný, pokud nejste fanouškem IDE a dáváte přednost textovým editorům. Všechny potřebné nástroje jsou nástroje příkazového řádku. Pokud používáte vim, věnujte pozornost pluginu vim-ride.
Stáhněte a nainstalujte Visual Studio Code: https://code.visualstudio.com/
Otevřete VS Code a nainstalujte plugin waves-ride:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Otevřete prohlížeč a přejděte na http://localhost:3000. Uvidíte, jak rychle se vybuduje prázdný okruh místního uzlu.
Waves Explorer zobrazuje instanci místního uzlu
Struktura RIDE a nástroj Surfboard
Vytvořte prázdný adresář a spusťte v něm příkaz
surfboard init
Příkaz inicializuje adresář se strukturou projektu, aplikacemi „hello world“ a testy. Pokud tuto složku otevřete pomocí kódu VS, uvidíte:
Surfboard.config.json
Pod složkou ./ride/ najdete jeden soubor wallet.ride - adresář, kde je umístěn kód dApp. V dalším bloku stručně analyzujeme dApps.
Ve složce ./test/ najdete soubor *.js. Zde jsou uloženy testy.
./surfboard.config.json – konfigurační soubor pro spouštění testů.
Envs je důležitá sekce. Každé prostředí je nakonfigurováno takto:
Koncový bod REST API uzlu, který bude použit ke spuštění dApp a CHAIN_ID sítě.
Tajná fráze pro účet s tokeny, které budou zdrojem vašich testovacích tokenů.
Jak můžete vidět, surfboard.config.json ve výchozím nastavení podporuje více prostředí. Výchozí je místní prostředí (klíč defaultEnv je měnitelný parametr).
Peněženka-demo aplikace
Tato část není odkazem na jazyk RIDE. Spíše pohled na aplikaci, kterou nasazujeme a testujeme, abychom lépe porozuměli tomu, co se v blockchainu děje.
Podívejme se na jednoduchou aplikaci Wallet-demo. Kdokoli může poslat tokeny na adresu dApp. Můžete stáhnout pouze své VLNY. Dvě funkce @Callable jsou dostupné prostřednictvím InvokeScriptTransaction:
deposit()která vyžaduje připojenou platbu ve WAVES
withdraw(amount: Int)který vrací tokeny
Během životního cyklu dApp bude zachována struktura (adresa → částka):
Akce
Výsledný stav
počáteční
prázdný
Alice vloží 5 VLN
alice-adresa → 500000000
Bob vloží 2 VLNY
alice-adresa → 500000000
bob-adresa → 200000000
Bob stáhne 7 VLN
ZAMÍTNUTO!
Alice stáhne 4 VLNY
alice-adresa → 100000000
bob-adresa → 200000000
Zde je kód pro úplné pochopení situace:
# 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
Plugin VSCode podporuje průběžnou kompilaci při úpravě souboru. Proto můžete vždy sledovat chyby v záložce PROBLÉMY.
Pokud chcete při kompilaci souboru použít jiný textový editor, použijte
surfboard compile ride/wallet.ride
Tím se vytiskne série RIDE kódu zkompilovaného base64.
Testovací skript pro 'wallet.ride'
Pojďme se podívat testovací soubor. Poháněno JavaScriptovým rámcem Mocha. K dispozici je funkce „Před“ a tři testy:
„Před“ zafinancuje více účtů prostřednictvím MassTransferTransaction, zkompiluje skript a nasadí jej do blockchainu.
„Can deposit“ odešle InvokeScriptTransaction do sítě a aktivuje funkci deposit() pro každý ze dvou účtů.
„Nelze vybrat více, než bylo uloženo“, testuje, že nikdo nemůže ukrást žetony jiných lidí.
„Může vložit“ kontroluje, zda jsou výběry zpracovány správně.
Spusťte testy ze Surfboardu a analyzujte výsledky ve Waves Explorer
Chcete-li spustit test, spusťte
surfboard test
Pokud máte více skriptů (například potřebujete samostatný skript nasazení), můžete spustit
surfboard test my-scenario.js
Surfboard shromáždí testovací soubory ve složce ./test/ a spustí skript na uzlu, který je nakonfigurován v surfboard.config.json. Po několika sekundách uvidíte něco takového:
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 prošly. Nyní se podívejme, co se stane při použití Waves Explorer: podívejte se na bloky nebo vložte jednu z výše uvedených adres do vyhledávání (například odpovídající wallet#. Najdete tam historii transakcí, stav dApp, dekompilovaný binární soubor.
Waves Explorer. Aplikace, která byla právě nasazena.
Nastavení aplikace Waves Keeper pro práci s místním uzlem
2. Importovat tajnou frázi s tokeny pro síť? Pro zjednodušení použijte počáteční zdroj vašeho uzlu: waves private node seed with waves tokens. Adresa: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.