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

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

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

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

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

Няколко съвета за Surfboard:

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. Напишете малка сума в полето "Deposit" и натиснете бутона:

Как да изграждаме, разгръщаме и тестваме 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
  • Surfboard
  • Waves Keeper

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

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

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

TL;DR: bit.ly/2YCFnwY

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

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