Cześć! W tym artykule pokażę, jak napisać i uruchomić zwykłą aplikację dApp na węźle Waves. Przyjrzyjmy się niezbędnym narzędziom, metodom i przykładowi rozwoju.
Schemat rozwoju dApps i zwykłych aplikacji jest prawie taki sam:
Piszemy kod
Pisanie testów automatycznych
Uruchomienie aplikacji
Testowanie
Narzędzia
1. docker aby uruchomić węzeł i Eksploratora Waves
Jeśli nie chcesz uruchamiać węzła, możesz pominąć ten krok. W końcu istnieje sieć testowa i eksperymentalna. Jednak bez wdrożenia własnego węzła proces testowania może się przeciągnąć.
Będziesz stale potrzebował nowych kont z tokenami testowymi. Kran sieci testowej przesyła 10 FALI co 10 minut.
Średni czas blokady w sieci testowej wynosi 1 minutę, w węźle – 15 sekund. Jest to szczególnie zauważalne, gdy transakcja wymaga wielokrotnych potwierdzeń.
Agresywne buforowanie jest możliwe w publicznych węzłach testowych.
Mogą być również chwilowo niedostępne ze względu na prace konserwacyjne.
Od teraz będę zakładał, że pracujesz z własnym węzłem.
Zainstaluj Surfboard, narzędzie umożliwiające przeprowadzenie testów na istniejącym węźle.
npm install -g @waves/surfboard
3. Wtyczka Visual Studio Code
Ten krok jest opcjonalny, jeśli nie jesteś fanem IDE i wolisz edytory tekstu. Wszystkie niezbędne narzędzia to narzędzia wiersza poleceń. Jeśli używasz vima, zwróć uwagę na wtyczkę jazda vimem.
Pobierz i zainstaluj kod Visual Studio: https://code.visualstudio.com/
Komenda inicjuje katalog ze strukturą projektu, aplikacjami i testami „hello world”. Jeśli otworzysz ten folder za pomocą VS Code, zobaczysz:
Surfboard.config.json
W folderze ./ride/ znajdziesz pojedynczy plik portfel.ride - katalog, w którym znajduje się kod dApp. W następnym bloku krótko przeanalizujemy dApps.
W folderze ./test/ znajdziesz plik *.js. Tutaj przechowywane są testy.
./surfboard.config.json – plik konfiguracyjny do uruchamiania testów.
Envs to ważna sekcja. Każde środowisko jest skonfigurowane w następujący sposób:
Punkt końcowy API REST węzła, który będzie używany do uruchamiania dApp i CHAIN_ID sieci.
Tajna fraza dla konta z tokenami, która będzie źródłem Twoich tokenów testowych.
Jak widać, surfboard.config.json domyślnie obsługuje wiele środowisk. Wartość domyślna to środowisko lokalne (klucz defaultEnv jest parametrem, który można zmieniać).
Aplikacja demonstracyjna portfela
Ta sekcja nie jest odniesieniem do języka RIDE. Raczej spójrz na aplikację, którą wdrażamy i testujemy, aby lepiej zrozumieć, co dzieje się w blockchainie.
Przyjrzyjmy się prostej aplikacji demonstracyjnej Portfela. Każdy może wysłać tokeny na adres dApp. Możesz wypłacić jedynie swoje FALE. Dwie funkcje @Callable są dostępne poprzez InvokeScriptTransaction:
deposit()co wymaga załączonej płatności w WAVES
withdraw(amount: Int)który zwraca tokeny
Przez cały cykl życia dApp struktura (adres → kwota) zostanie zachowana:
# 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
Przykładowy kod można również znaleźć pod adresem GitHub.
Wtyczka VSCode obsługuje ciągłą kompilację podczas edycji pliku. Dlatego zawsze możesz monitorować błędy w zakładce PROBLEMY.
Jeśli chcesz użyć innego edytora tekstu podczas kompilacji pliku, użyj
surfboard compile ride/wallet.ride
Spowoduje to wyświetlenie serii kodu RIDE skompilowanego w base64.
Skrypt testowy dla „wallet.ride”
Spójrzmy na plik testowy. Obsługiwane przez framework Mocha JavaScript. Dostępna jest funkcja „Przed” i trzy testy:
„Przed” finansuje wiele kont za pośrednictwem MassTransferTransaction, kompiluje skrypt i wdraża go w łańcuchu bloków.
„Może wpłacić” wysyła do sieci InvokeScriptTransaction, aktywując funkcję depozytu() dla każdego z dwóch kont.
Testy „Nie można wypłacić więcej niż wpłacono” potwierdzają, że nikt nie może ukraść tokenów innych osób.
„Może wpłacić” sprawdza, czy wypłaty są przetwarzane prawidłowo.
Uruchom testy z Surfboard i przeanalizuj wyniki w Waves Explorer
Aby uruchomić test, uruchom
surfboard test
Jeśli masz wiele skryptów (na przykład potrzebujesz osobnego skryptu wdrażania), możesz je uruchomić
surfboard test my-scenario.js
Surfboard zbierze pliki testowe w folderze ./test/ i uruchomi skrypt na węźle skonfigurowanym w surfboard.config.json. Po kilku sekundach zobaczysz coś takiego:
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)
Brawo! Testy zaliczone. Przyjrzyjmy się teraz, co dzieje się podczas korzystania z Eksploratora Waves: spójrz na bloki lub wklej jeden z powyższych adresów do wyszukiwania (na przykład odpowiedni wallet#. Znajdziesz tam historię transakcji, status dApp, zdekompilowany plik binarny.
Eksplorator fal. Aplikacja, która właśnie została wdrożona.
Kilka wskazówek dotyczących deski surfingowej:
1. Aby przetestować w środowisku testnetowym, użyj:
Konfigurowanie Waves Keeper do pracy z węzłem lokalnym
2. Zaimportować tajną frazę z tokenami dla sieci? Dla uproszczenia użyj początkowego materiału siewnego swojego węzła: waves private node seed with waves tokens. Adres: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.