Како да се изгради, распореди и тестира Waves RIDE dApp
Здраво! Во оваа статија, ќе ви покажам како да пишувате и стартувате обична dApp на јазол Waves. Размислете за потребните алатки, методи и пример за развој.
Шемата за развој на dApps и обичните апликации е речиси иста:
Го пишуваме кодот
Пишување автоматизирано тестирање
Стартување на апликацијата
Тестирање
Алатки
1. docker за да го извршите јазолот и Waves Explorer
Ако не сакате да извршите јазол, можете да го прескокнете овој чекор. На крајот на краиштата, постои тест и експериментална мрежа. Но, без распоредување на сопствен јазол, процесот на тестирање може да се одложи.
Постојано ќе ви требаат нови сметки со тест токени. Пробната мрежна славина пренесува 10 БРАНОВИ на секои 10 минути.
Просечното време на блокирање во мрежата за тестирање е 1 минута, во јазолот - 15 секунди. Ова е особено забележливо кога трансакцијата бара повеќекратни потврди.
Во јавните тест јазли е можно агресивно кеширање.
Тие исто така може да бидат привремено недостапни поради одржување.
Понатаму, ќе претпоставам дека работите со вашиот јазол.
Инсталирајте Surfboard, алатка која ќе ви овозможи да извршите тестови на постоечки јазол.
npm install -g @waves/surfboard
3. Приклучок за код на Visual Studio
Овој чекор е изборен ако не сте обожавател на IDE и претпочитате уредувачи на текст. Сите потребни алатки се комунални услуги на командната линија. Ако користите vim, проверете го приклучокот vim-возење.
Преземете и инсталирајте Visual Studio Code: https://code.visualstudio.com/
Отворете го VS Code и инсталирајте го додатокот waves-ride:
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 Explorer го прикажува примерот на локалниот јазол
RIDE структура и алатка за сурфање
Направете празен директориум и извршете ја командата во него
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 е параметар на променлива).
Демо апликација за паричник
Овој дел не е референца за јазикот RIDE. Наместо тоа, погледнете ја апликацијата што ја распоредуваме и тестираме со цел подобро да разбереме што се случува во блокчејнот.
Размислете за едноставна апликација за демо паричник. Секој може да испраќа токени на адресата dApp. Можете да ги повлечете само вашите сопствени БРАНОВИ. Две @Callable функции се достапни преку InvokeScriptTransaction:
deposit(), што бара приложено плаќање во WAVES
withdraw(amount: Int), кој враќа токени
Во текот на животниот циклус на dApp, структурата (адреса → износ) ќе се одржува:
# 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“
Ајде да погледнеме тест датотека. Овозможено од рамката Мока на JavaScript. Има функција „Пред“ и три теста:
„Before“ финансира повеќе сметки преку MassTransferTransaction, ја составува скриптата и ја распоредува во блокчејнот.
„Може да се депонира“ испраќа InvokeScriptTransaction на мрежата, активирајќи ја функцијата депозит() за секоја од двете сметки.
„Не може да се повлече повеќе од депонираниот“ тестови дека никој не може да украде туѓи токени.
„Може да депонира“ проверува дали повлекувањата се обработени правилно.
Извршување тестови од даска за сурфање и анализа на резултати во 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, декомпилирана бинарна.
истражувач на бранови. Апликација која штотуку е распоредена.
Неколку совети за даска за сурфање:
1. За тестирање во околината на тестнет, користете:
Поставување на Waves Keeper да работи со локален јазол
2. Увезете ја лозинката за вашиот мрежен токен? За едноставност, користете го првичното семе на вашиот јазол: waves private node seed with waves tokens. Адреса: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.