Как да изградите, внедрите и тествате Waves RIDE dApp
Здравейте! В тази статия ще ви покажа как да напишете и стартирате обикновено dApp на Waves възел. Нека да разгледаме необходимите инструменти, методи и пример за развитие.
Схемата за разработка на dApps и обикновените приложения е почти същата:
Ние пишем кода
Писане на автоматизирано тестване
Стартирайте приложението
Тестване
Инструменти
1. docker за да стартирате възела и Waves Explorer
Ако не искате да стартирате възел, можете да пропуснете тази стъпка. В крайна сметка има тестова и експериментална мрежа. Но без внедряване на собствен възел, процесът на тестване може да се проточи.
Постоянно ще имате нужда от нови акаунти с тестови жетони. Тестовият мрежов кран прехвърля 10 ВЪЛНИ на всеки 10 минути.
Средното време на блокиране в тестовата мрежа е 1 минута, във възела – 15 секунди. Това е особено забележимо, когато транзакцията изисква множество потвърждения.
Агресивното кеширане е възможно на публични тестови възли.
Те също така могат да бъдат временно недостъпни поради поддръжка.
Отсега нататък ще приема, че работите със собствен възел.
Инсталирайте Surfboard, инструмент, който ви позволява да изпълнявате тестове на съществуващ възел.
npm install -g @waves/surfboard
3. Visual Studio Code плъгин
Тази стъпка не е задължителна, ако не сте фен на IDE и предпочитате текстови редактори. Всички необходими инструменти са помощни програми за командния ред. Ако използвате vim, обърнете внимание на приставката vim-ride.
Изтеглете и инсталирайте Visual Studio Code: https://code.visualstudio.com/
Отворете VS Code и инсталирайте приставката за каране на вълни:
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. Ще анализираме накратко dApps в следващия блок.
Под папката ./test/ ще намерите *.js файл. Тестовете се съхраняват тук.
./surfboard.config.json – конфигурационен файл за изпълнение на тестове.
Envs е важен раздел. Всяка среда е конфигурирана по следния начин:
Крайна точка на REST API на възела, който ще се използва за стартиране на dApp и CHAIN_ID на мрежата.
Тайна фраза за акаунт с токени, които ще бъдат източниците на вашите тестови токени.
Както можете да видите, surfboard.config.json поддържа множество среди по подразбиране. По подразбиране е локалната среда (ключът defaultEnv е променлив параметър).
Wallet-демо приложение
Този раздел не е препратка към езика RIDE. По-скоро поглед към приложението, което внедряваме и тестваме, за да разберем по-добре какво се случва в блокчейна.
Нека да разгледаме едно просто демо приложение Wallet. Всеки може да изпраща токени до адрес на dApp. Можете да изтеглите само вашите WAVES. Две функции @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“
Нека да разгледаме тестов файл. Осъществено от рамката Mocha на JavaScript. Има функция „Преди“ и три теста:
„Before“ финансира множество акаунти чрез MassTransferTransaction, компилира скрипта и го внедрява в блокчейна.
„Може да депозира“ изпраща InvokeScriptTransaction към мрежата, активирайки функцията 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. Приложение, което току-що е внедрено.
Настройване на Waves Keeper за работа с локален възел
2. Импортиране на секретна фраза с токени за мрежата? За простота използвайте първоначалното начално число на вашия възел: waves private node seed with waves tokens. адрес: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.