Як будаваць, разгортваць і тэсціраваць 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, структура (address → amount) будзе падтрымлівацца:

дзеянне
Resulting state

пачатковая
пусты

Alice deposits 5 WAVES
alice-address → 500000000

Bob deposits 2 WAVES

alice-address → 500000000
bob-address → 200000000

Bob withdraws 7 WAVES
DENIED!

Alice withdraws 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

Surfboard збярэ тэставыя файлы ў тэчцы ./test/ і запусціць сцэнар у нодзе, якая наладжана ў surfboard.config.json. Праз некалькі секунд вы будзеце назіраць нешта падобнае:

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)

Ура! Тэсты пройдзены. Зараз зірнем на тое, што адбываецца пры выкарыстанні 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
  • Дошка для серфінгу
  • Waves Keeper

Спасылкі для тых, хто хоча працягнуць вывучаць RIDE:

больш прыкладаў
Анлайн IDE з прыкладамі
Дакументацыя Waves
Чат распрацоўшчыкаў у Тэлеграме
Waves і RIDE на stackoverflow
NEW! Анлайн-курсы па стварэнні dApps на Waves Platform

Працягвайце паглыбляцца ў тэму RIDE і стварыце свой першы dApp!

TL; DR: bit.ly/2YCFnwY

Крыніца: habr.com

Дадаць каментар