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

Схемата за разработка на 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 поддържа непрекъсната компилация при редактиране на файла. Така че винаги можете да следите грешките в таба ПРОБЛЕМИ.

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

Waves Explorer. Приложение, което току-що развернахме.
Няколко съвета за Surfboard:
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. Напишете малка сума в полето "Deposit" и натиснете бутона:

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

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

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