Здравейте! В статията ще покажа как да напишете и стартирате обикновен dApp на нода Waves. Ще разгледаме необходимите инструменти, методи и пример за разработка.

Схемата за разработка на dApps и обикновени приложения почти не се различава:
- Пишем код
- Пишем автоматизирано тестване
- Стартираме приложението
- Тестваме
Инструменти
1. docker за стартиране на нода и Waves Explorer
Ако не искате да стартирате нода, можете да пропуснете тази стъпка. Има тестова и експериментална мрежа. Но без разгръщане на собствен нода, процесът на тестване може да отнеме повече време.
- Постоянно ще ви трябват нови акаунти с тестови токени. Кранът на тестовата мрежа превежда по 10 WAVES на всеки 10 минути.
- Средното време за блоковете в тестовата мрежа е 1 минута, а в нода – 15 секунди. Това е особено осезаемо, когато транзакцията изисква няколко потвърждения.
- В публичните тестови ноди е възможно агресивно кеширане.
- Още те могат временно да не са налични поради техническо обслужване.
Оттук нататък ще считам, че работите със собствен нода.
2. Инструмент за команден ред Surfboard
- Изтеглете и инсталирайте Node.js с помощта на ppa, homebrew или exe тук: .
- Инсталирайте Surfboard – инструмент, който ще ви позволи да стартирате тестове на съществуващ нода.
npm install -g @waves/surfboard
3. Плъгин за Visual Studio Code
Тази стъпка е незадължителна, ако не сте фен на IDE и предпочитате текстови редактори. Всички необходими инструменти са командни линии. Ако използвате vim, обърнете внимание на плъгина .
Изтеглете и инсталирайте Visual Studio Code:
Отворете VS Code и инсталирайте плъгина waves-ride:

Разширение на браузъра Waves Keeper:
Готово!
Стартирайте нода и Waves Explorer
1. Стартирайте нода:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Уверете се, че нода стартира чрез REST API в :

Интерфейс Swagger REST API за нода
2. Стартирайте екземпляр на Waves Explorer:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Отворете браузъра и преминете в . Ще видите как бързо се изгражда празна верига на локалния нода.

Waves Explorer показва екземпляр на локалния нода
Структура на RIDE и инструмент Surfboard
Създайте празна директория и изпълнете командата в нея
surfboard init
Командата инициализира директорията със структура на проекта, приложение тип "hello world" и тестове. Ако отворите тази папка с VS Code, ще видите:

Surfboard.config.json
- Под папката ./ride/ ще намерите единичен файл wallet.ride – директорията, където е разположен кода на dApp. Накратко ще анализираме dApp в следващия блок.
- Под папката ./test/ ще намерите файла *.js. Тук се съхраняват тестовете.
- ./surfboard.config.json – конфигурационен файл за стартиране на тестовете.
Envs – важна секция. Всяка среда се настройва по следния начин:
- Крайната точка на REST API модула, която ще се използва за пускане на dApp и CHAIN_ID на мрежата.
- Тайна фраза за акаунта с токени, които ще служат като източници на токените за вашия тест.
Както виждате, surfboard.config.json по подразбиране поддържа няколко среди. По подразбиране е зададена локалната среда (ключ defaultEnv – изменяем параметър).
Приложение Wallet-demo
Тази секция не е справочник по езика RIDE. По-скоро е поглед върху приложението, което развиваме и тестваме, за да разберем по-добре какво се случва в блокчейна.
Нека разгледаме простото приложение Wallet-demo. Всеки може да изпрати токени на адреса на dApp. Можете да изтеглите само свои WAVES. Две функции @Callable са достъпни чрез InvokeScriptTransaction:
deposit(), която изисква прикрепено плащане в WAVESwithdraw(amount: Int), която връща токените
През целия жизнен цикъл на dApp, структурата (адрес → количество) ще бъде поддържана:
Action
Резултирано състояние
начално
празно
Алис влага 5 WAVES
alice-address → 500000000
Боб влага 2 WAVES
alice-address → 500000000
bob-address → 200000000
Боб изтегля 7 WAVES
ОТХВЪЛЛЕН!
Алис изтегля 4 WAVES
alice-address → 100000000
bob-address → 200000000
Ето кода за пълно разбиране на ситуацията:
# 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Примерният код може да се намери и на .
Плъгинът VSCode поддържа непрекъсната компилация при редактиране на файла. Затова винаги можете да следите грешките в раздела PROBLEMS.

Ако искате да използвате друг текстов редактор при компилация на файла, използвайте
surfboard compile ride/wallet.ride
Това ще изведе набор от base64 компилиран код RIDE.
Тестов сценарий за ‘wallet.ride’
Нека погледнем на . Работи на фреймворка JavaScript’s Mocha. Има функция „Before“ и три теста:
- „Before“ финансира няколко акаунта чрез MassTransferTransaction, компилира скрипта и го разгръща в блокчейна.
- „Can deposit“ изпраща в мрежата InvokeScriptTransaction, активираща функцията deposit() за всеки от двата акаунта.
- „Can’t withdraw more than was deposited“ проверява, че никой не може да открадне чужди токени.
- „Can deposit“ проверява, че изтеглянията се обработват правилно.
Стартиране на тестовете с Surfboard и анализ на резултатите в Waves Explorer
За да стартирате теста, изпълнете
surfboard test
Ако имате няколко сценария (например, необходим е отделен скрипт за разгръщане), можете да стартирате
surfboard test my-scenario.js
Сърфбордът ще събере тестови файлове в папката ./test/ и ще стартира сценарий в нода, който е конфигуриран в surfboard.config.json. След няколко секунди ще наблюдавате нещо подобно:
wallet test suite
Генериране на акаунти с nonce: ce8d86ee
Акаунт генериран: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Акаунт генериран: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Акаунт генериран: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Акаунтите успешно финансирани
Скриптът е настроен
√ Може да се депозира (4385мс)
√ Не може да се изтегли повече отколкото е депозирано
√ Може да се изтегли (108мс)
3 преминаващи (15сек)
Ура! Тестовете преминаха. Сега да видим какво се случва при използването на Waves Explorer: да прегледаме блоковете или да въведем един от посочените по-горе адреси в търсенето (например, съответстващия wallet#. Там може да намерите история на транзакциите, състояние на dApp, декомпилиран двоичен файл.

Waves Explorer. Приложението, което току-що разгръщахме.
Няколко съвета за Сърфборд:
1. За да тествате в среда testnet, използвайте:
surfboard test --env=testnet
2. Ако искате да видите JSON-версии на транзакциите и как те се обработват от нода, стартирайте теста с -v (означава ‘verbose’):
surfboard test -v
Използване на приложения с Waves Keeper
1. Настройте Waves Keeper да работи:

Настройване на Waves Keeper за работа с локален нод
2. Импортирайте секретната фраза с токените за мрежата? За простота използвайте началния seed на вашия нод: waves private node seed with waves tokens. Адрес: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.
3. Можете да стартирате едностранично безсървърно приложение сами, използвайки npm. Или преминете към съществуващо:
4. Въведете адреса на портфейла от тестовия стартап (подчертан по-горе) в текстовото поле за адрес на dApp
5. Впишете малка сума в полето „Депозит“ и натиснете бутона:

Waves Keeper иска разрешение да подпише InvokeScriptTransaction с плащане от 10 WAVES.
6. Потвърдете транзакцията:

Транзакцията е създадена и се предава в мрежата. Сега можете да видите нейния ID
7. Наблюдавайте транзакцията с помощта на Waves Explorer. Въведете ID в полето за търсене

Изводи и допълнителна информация
Разгледахме инструментите за разработка, тестване, разгръщане и използване на прости dApps на Waves Platform:
- Език RIDE
- Редактор VS Code
- Waves Explorer
- Сърфборд
- Waves Keeper
Линкове за тези, които искат да продължат да изучават RIDE:
Продължавайте да се задълбочавате в темата RIDE и създайте своето първо dApp!
TL;DR:
Източник: habr.com
