Як будаваць, разгортваць і тэсціраваць Waves RIDE dApp
Добры дзень! У артыкуле я пакажу, як напісаць і запусціць на нодзе Waves звычайны dApp. Разгледзім неабходныя прылады, метады і прыклад распрацоўкі.
Схема распрацоўкі dApps і звычайных прыкладанняў амаль не адрозніваецца:
Пішам код
Пішам аўтаматызаванае тэсціраванне
Запускаем дадатак
Тэстуем
Інструменты
1. docker для запуску ноды і Waves Explorer
Калі не жадаеце запускаць наду, можаце прапусціць гэты крок. Бо ёсць тэставая і эксперыментальная сетка. Але без разгортвання сваёй ноды працэс тэсціравання можа зацягнуцца.
Вам увесь час будуць патрэбныя новыя акаўнты з тэставымі токенамі. Кран тэставай сеткі пераводзіць па 10 WAVES кожныя 10 хвілін.
Сярэдні час блокаў у тэставай сетцы - 1 хвіліна, у нодзе - 15 секунд. Гэта асабліва адчувальна, калі транзакцыя патрабуе некалькіх пацверджанняў.
У агульнадаступных тэставых нодах магчыма агрэсіўнае кэшаванне.
Яшчэ яны могуць быць часова недаступныя праз тэхнічнае абслугоўванне.
Далей буду лічыць, што вы працуеце са сваёй нодай.
Усталюйце Surfboard - інструмент, які дазволіць запусціць тэсты на існуючай нодзе.
npm install -g @waves/surfboard
3. Убудова Visual Studio Code
Крок неабавязковы, калі вы - не фанат IDE і аддаеце перавагу тэкставыя рэдактары. Усе неабходныя прылады - гэта ўтыліты каманднага радка. Калі карыстаецеся vim, звернеце ўвагу на плягін vim-ride.
Запампуйце і ўсталюйце Visual Studio Code: https://code.visualstudio.com/
Канчатковая кропка 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
Убудова 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
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 Explorer. Дадатак, якое толькі што разгарнулі.
Некалькі парад па Surfboard:
1. Каб тэставаць у асяроддзі testnet, выкарыстоўвайце: