Hoe om die Waves RIDE dApp te bou, te ontplooi en te toets
Hallo! In hierdie artikel sal ek jou wys hoe om 'n gewone dApp op 'n Waves-knoop te skryf en uit te voer. Kom ons kyk na die nodige gereedskap, metodes en 'n voorbeeld van ontwikkeling.
Die ontwikkelingskema vir dApps en gereelde toepassings is amper dieselfde:
Skryf kode
Skryf outomatiese toetsing
Die bekendstelling van die toepassing
Toets
Tools
1. docker om die node en Waves Explorer te laat loop
As jy nie 'n nodus wil begin nie, kan jy hierdie stap oorslaan. Daar is immers 'n toets- en eksperimentele netwerk. Maar sonder om jou eie nodus te ontplooi, kan die toetsproses voortduur.
Jy sal voortdurend nuwe rekeninge met toetstokens nodig hê. Die toetsnetwerkkraan dra elke 10 minute 10 GOLWE oor.
Die gemiddelde bloktyd in die toetsnetwerk is 1 minuut, in die nodus – 15 sekondes. Dit is veral opvallend wanneer 'n transaksie veelvuldige bevestigings vereis.
Aggressiewe caching is moontlik op publieke toetsnodes.
Hulle kan ook tydelik onbeskikbaar wees weens onderhoud.
Van nou af sal ek aanvaar dat jy met jou eie nodus werk.
Installeer Surfboard, 'n instrument waarmee u toetse op 'n bestaande nodus kan uitvoer.
npm install -g @waves/surfboard
3. Visual Studio Code-inprop
Hierdie stap is opsioneel as jy nie 'n aanhanger van IDE's is nie en teksredigeerders verkies. Al die nodige gereedskap is opdragreëlhulpmiddels. As jy vim gebruik, let op die inprop vim-rit.
Laai Visual Studio Code af en installeer: https://code.visualstudio.com/
Maak VS-kode oop en installeer die waves-ride-inprop:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Maak 'n blaaier oop en gaan na http://localhost:3000. Jy sal sien hoe vinnig 'n leë plaaslike nodusbaan gebou word.
Waves Explorer vertoon 'n plaaslike nodus-instansie
RIDE-struktuur en branderplank-instrument
Skep 'n leë gids en voer die opdrag daarin uit
surfboard init
Die opdrag inisialiseer 'n gids met die projekstruktuur, "hallo wêreld" toepassings en toetse. As jy hierdie gids oopmaak met VS-kode, sal jy sien:
Surfboard.config.json
Onder die ./ride/-lêergids sal jy 'n enkele lêer wallet.ride vind - die gids waar die dApp-kode geleë is. Ons sal dApps in die volgende blok kortliks ontleed.
Onder die ./test/-lêergids sal jy 'n *.js-lêer vind. Toetse word hier gestoor.
./surfboard.config.json – konfigurasielêer vir die uitvoer van toetse.
Envs is 'n belangrike afdeling. Elke omgewing is soos volg gekonfigureer:
REST API eindpunt van die nodus wat gebruik sal word om die dApp en CHAIN_ID van die netwerk te begin.
'n Geheime frase vir 'n rekening met tokens wat die bronne van jou toetstokens sal wees.
Soos jy kan sien, ondersteun surfboard.config.json by verstek verskeie omgewings. Die verstek is die plaaslike omgewing (die defaultEnv-sleutel is 'n veranderlike parameter).
Wallet-demo-toepassing
Hierdie afdeling is nie 'n verwysing na die RIDE-taal nie. Kyk eerder na die toepassing wat ons ontplooi en toets om beter te verstaan wat in die blokketting gebeur.
Kom ons kyk na 'n eenvoudige Wallet-demo-toepassing. Enigeen kan tokens na 'n dApp-adres stuur. Jy kan net jou GOLWE onttrek. Twee @Callable-funksies is beskikbaar via InvokeScriptTransaction:
deposit()wat 'n aangehegte betaling in GOLWE vereis
withdraw(amount: Int)wat tokens teruggee
Gedurende die dApp-lewensiklus sal die struktuur (adres → bedrag) gehandhaaf word:
Aksie
Resulterende toestand
aanvanklike
leeg
Alice deponeer 5 GOLWE
alice-adres → 500000000
Bob deponeer 2 GOLWE
alice-adres → 500000000
bob-adres → 200000000
Bob onttrek 7 GOLWE
GEWEEK!
Alice onttrek 4 GOLWE
alice-adres → 100000000
bob-adres → 200000000
Hier is die kode om die situasie ten volle te verstaan:
# 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
Die VSCode-inprop ondersteun deurlopende samestelling terwyl 'n lêer gewysig word. Daarom kan u altyd foute in die PROBLEME-oortjie monitor.
As jy 'n ander teksredigeerder wil gebruik wanneer jy die lêer saamstel, gebruik
surfboard compile ride/wallet.ride
Dit sal 'n reeks van base64 saamgestelde RIDE-kode uitvoer.
Toetsskrif vir 'wallet.ride'
Kom ons kyk na toets lêer. Aangedryf deur JavaScript se Mocha-raamwerk. Daar is 'n "Voor"-funksie en drie toetse:
"Voordat" finansier verskeie rekeninge via MassTransferTransaction, stel die skrif saam en ontplooi dit na die blokketting.
"Can deposit" stuur 'n InvokeScriptTransaction na die netwerk, wat die deposit()-funksie vir elk van die twee rekeninge aktiveer.
“Kan nie meer onttrek as wat gedeponeer is nie” toetse dat niemand ander mense se tokens kan steel nie.
“Kan deponeer” kontroleer dat onttrekkings korrek verwerk word.
Doen toetse vanaf Surfboard en ontleed resultate in Waves Explorer
Om die toets uit te voer, hardloop
surfboard test
As jy veelvuldige skrifte het (jy het byvoorbeeld 'n aparte ontplooiingskrip nodig), kan jy hardloop
surfboard test my-scenario.js
Surfboard sal die toetslêers in die ./test/-lêergids versamel en die skrip op die nodus laat loop wat in surfboard.config.json opgestel is. Na 'n paar sekondes sal jy iets soos hierdie sien:
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)
Hoera! Toetse geslaag. Kom ons kyk nou na wat gebeur wanneer jy Waves Explorer gebruik: kyk na die blokke of plak een van die adresse hierbo in die soektog (byvoorbeeld die ooreenstemmende wallet#. Daar kan jy transaksiegeskiedenis, dApp-status, gedekompileerde binêre lêer vind.
Waves Explorer. 'n Toepassing wat pas ontplooi is.
Stel Waves Keeper op om met 'n plaaslike nodus te werk
2. Voer geheime frase met tekens vir die netwerk in? Vir eenvoud, gebruik die aanvanklike saad van jou nodus: waves private node seed with waves tokens. Adres: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.