Как да изградим, развъртим и тестваме Waves RIDE dApp

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

Как да изградим, развъртим и тестваме Waves RIDE dApp

Схемата за разработка на dApps и обикновени приложения почти не се различава:

  • Пишем код
  • Пишем автоматизирано тестване
  • Стартираме приложението
  • Тестваме

Инструменти

1. docker за стартиране на нода и Waves Explorer

Ако не искате да стартирате нода, можете да пропуснете тази стъпка. Има тестова и експериментална мрежа. Но без разгръщане на собствен нода, процесът на тестване може да отнеме повече време.

  • Постоянно ще ви трябват нови акаунти с тестови токени. Кранът на тестовата мрежа превежда по 10 WAVES на всеки 10 минути.
  • Средното време за блоковете в тестовата мрежа е 1 минута, а в нода – 15 секунди. Това е особено осезаемо, когато транзакцията изисква няколко потвърждения.
  • В публичните тестови ноди е възможно агресивно кеширане.
  • Още те могат временно да не са налични поради техническо обслужване.

Оттук нататък ще считам, че работите със собствен нода.

2. Инструмент за команден ред Surfboard

  • Изтеглете и инсталирайте Node.js с помощта на ppa, homebrew или exe тук: https://nodejs.org/en/download/.
  • Инсталирайте Surfboard – инструмент, който ще ви позволи да стартирате тестове на съществуващ нода.

npm install -g @waves/surfboard

3. Плъгин за Visual Studio Code

Тази стъпка е незадължителна, ако не сте фен на IDE и предпочитате текстови редактори. Всички необходими инструменти са командни линии. Ако използвате vim, обърнете внимание на плъгина vim-ride.

Изтеглете и инсталирайте Visual Studio Code: https://code.visualstudio.com/

Отворете VS Code и инсталирайте плъгина waves-ride:

Как да изградим, развъртим и тестваме Waves RIDE dApp

Разширение на браузъра Waves Keeper: https://wavesplatform.com/products-keeper

Готово!

Стартирайте нода и Waves Explorer

1. Стартирайте нода:

docker run -d -p 6869:6869 wavesplatform/waves-private-node

Уверете се, че нода стартира чрез REST API в http://localhost:6869:

Как да изградим, развъртим и тестваме Waves RIDE dApp
Интерфейс 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

Отворете браузъра и преминете в http://localhost:3000. Ще видите как бързо се изгражда празна верига на локалния нода.

Как да изградим, развъртим и тестваме Waves RIDE dApp
Waves Explorer показва екземпляр на локалния нода

Структура на RIDE и инструмент Surfboard

Създайте празна директория и изпълнете командата в нея

surfboard init

Командата инициализира директорията със структура на проекта, приложение тип "hello world" и тестове. Ако отворите тази папка с VS Code, ще видите:

Как да изградим, развъртим и тестваме Waves RIDE dApp
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(), която изисква прикрепено плащане в WAVES
  • withdraw(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

Примерният код може да се намери и на GitHub.

Плъгинът VSCode поддържа непрекъсната компилация при редактиране на файла. Затова винаги можете да следите грешките в раздела PROBLEMS.

Как да изградим, развъртим и тестваме Waves RIDE dApp
Ако искате да използвате друг текстов редактор при компилация на файла, използвайте

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 RIDE dApp
Waves Explorer. Приложението, което току-що разгръщахме.

Няколко съвета за Сърфборд:

1. За да тествате в среда testnet, използвайте:

surfboard test --env=testnet

Получаване на тестови токени

2. Ако искате да видите JSON-версии на транзакциите и как те се обработват от нода, стартирайте теста с -v (означава ‘verbose’):

surfboard test -v

Използване на приложения с Waves Keeper

1. Настройте Waves Keeper да работи: http://localhost:6869

Как да изградим, развъртим и тестваме Waves RIDE dApp
Настройване на Waves Keeper за работа с локален нод

2. Импортирайте секретната фраза с токените за мрежата? За простота използвайте началния seed на вашия нод: waves private node seed with waves tokens. Адрес: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.

3. Можете да стартирате едностранично безсървърно приложение сами, използвайки npm. Или преминете към съществуващо: chrome-ext.wvservices.com/dapp-wallet.html

4. Въведете адреса на портфейла от тестовия стартап (подчертан по-горе) в текстовото поле за адрес на dApp

5. Впишете малка сума в полето „Депозит“ и натиснете бутона:

Как да изградим, развъртим и тестваме Waves RIDE dApp
Waves Keeper иска разрешение да подпише InvokeScriptTransaction с плащане от 10 WAVES.

6. Потвърдете транзакцията:

Как да изградим, развъртим и тестваме Waves RIDE dApp
Транзакцията е създадена и се предава в мрежата. Сега можете да видите нейния ID

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

Как да изградим, развъртим и тестваме Waves RIDE dApp

Изводи и допълнителна информация

Разгледахме инструментите за разработка, тестване, разгръщане и използване на прости dApps на Waves Platform:

  • Език RIDE
  • Редактор VS Code
  • Waves Explorer
  • Сърфборд
  • Waves Keeper

Линкове за тези, които искат да продължат да изучават RIDE:

Повече примери
Онлайн IDE с примери
Документация Waves
Чат за разработчици в Телеграм
Waves и RIDE на stackoverflow
НОВО! Онлайн курсове за създаване на dApps на Waves Platform

Продължавайте да се задълбочавате в темата RIDE и създайте своето първо dApp!

TL;DR: bit.ly/2YCFnwY

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster