Bongu! F'dan l-artikolu ser nuruk kif tikteb u tmexxi dApp regolari fuq node Waves. Ejja nħarsu lejn l-għodda meħtieġa, il-metodi u eżempju ta 'żvilupp.
L-iskema ta' żvilupp għal dApps u applikazzjonijiet regolari hija kważi l-istess:
Aħna niktbu l-kodiċi
Kitba ta 'ttestjar awtomatizzat
Tnedija tal-applikazzjoni
Ittestjar
Għodod
1. docker biex tmexxi n-node u Waves Explorer
Jekk ma tridx tibda node, tista' taqbeż dan il-pass. Wara kollox, hemm test u netwerk sperimentali. Iżda mingħajr ma tuża n-nodu tiegħek stess, il-proċess tal-ittestjar jista 'jkaxkar.
Int ser ikollok bżonn kontinwament kontijiet ġodda b'tokens tat-test. Il-faucet tan-netwerk tat-test jittrasferixxi 10 WAVES kull 10 minuti.
Il-ħin medju tal-blokk fin-netwerk tat-test huwa ta 'minuta 1, fin-nodu - 15-il sekonda. Dan huwa speċjalment notevoli meta tranżazzjoni teħtieġ konfermi multipli.
Caching aggressiv huwa possibbli fuq nodi tat-test pubbliċi.
Jistgħu jkunu wkoll temporanjament mhux disponibbli minħabba manutenzjoni.
Minn issa 'l quddiem ser nassumi li qed taħdem man-node tiegħek stess.
Installa Surfboard, għodda li tippermettilek tmexxi testijiet fuq node eżistenti.
npm install -g @waves/surfboard
3. plugin Visual Studio Code
Dan il-pass huwa fakultattiv jekk m'intix fan tal-IDEs u tippreferi edituri tat-test. L-għodda kollha meħtieġa huma utilitajiet tal-linja tal-kmand. Jekk tuża vim, oqgħod attent għall-plugin vim-ride.
Niżżel u installa Visual Studio Code: https://code.visualstudio.com/
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Iftaħ browser u mur fuq http://localhost:3000. Se tara kemm jinbena malajr ċirkwit vojt ta 'nodi lokali.
Waves Explorer juri istanza ta' nodu lokali
Struttura RIDE u għodda tas-Surfboard
Oħloq direttorju vojt u mexxi l-kmand fih
surfboard init
Il-kmand jinizjalizza direttorju bl-istruttura tal-proġett, applikazzjonijiet u testijiet "hello world". Jekk tiftaħ dan il-folder bil-VS Code, se tara:
Surfboard.config.json
Taħt il-folder ./ride/ issib fajl wieħed wallet.ride - id-direttorju fejn jinsab il-kodiċi dApp. Aħna se nanalizzaw fil-qosor dApps fil-blokk li jmiss.
Taħt il-folder ./test/ issib fajl *.js. It-testijiet huma maħżuna hawn.
Envs hija taqsima importanti. Kull ambjent huwa kkonfigurat hekk:
REST API endpoint tan-node li se jintuża biex iniedi d-dApp u CHAIN_ID tan-netwerk.
Frażi sigrieta għal kont b'tokens li se jkunu s-sorsi tat-tokens tat-test tiegħek.
Kif tistgħu taraw, surfboard.config.json jappoġġja ambjenti multipli awtomatikament. Il-default huwa l-ambjent lokali (iċ-ċavetta defaultEnv hija parametru li jista 'jinbidel).
Wallet-demo applikazzjoni
Din it-taqsima mhix referenza għal-lingwa RIDE. Pjuttost, ħarsa lejn l-applikazzjoni li niskjeraw u nittestjaw biex nifhmu aħjar dak li qed jiġri fil-blockchain.
Ejja nħarsu lejn applikazzjoni sempliċi Wallet-demo. Kulħadd jista' jibgħat tokens f'indirizz dApp. Tista' biss tirtira l-WAVES tiegħek. Żewġ funzjonijiet @Callable huma disponibbli permezz ta' InvokeScriptTransaction:
deposit()li teħtieġ ħlas anness f’WAVES
withdraw(amount: Int)li jirritorna tokens
Matul iċ-ċiklu tal-ħajja tad-dApp, l-istruttura (indirizz → ammont) se tinżamm:
azzjoni
Stat li jirriżulta
inizjali
vojta
Alice tiddepożita 5 WAVES
alice-indirizz → 500000000
Alice tirtira 4 WAVES
alice-indirizz → 100000000
bob-indirizz → 200000000
Hawn hu l-kodiċi biex tifhem bis-sħiħ is-sitwazzjoni:
# 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
Kodiċi tal-kampjun jista 'jinstab ukoll fuq GitHub.
Il-plugin VSCode jappoġġja kumpilazzjoni kontinwa waqt li jeditja fajl. Għalhekk, tista' dejjem tissorvelja l-iżbalji fit-tab PROBLEMI.
Jekk trid tuża editur tat-test differenti meta tikkumpila l-fajl, uża
surfboard compile ride/wallet.ride
Dan se joħroġ serje ta 'base64 kompilati RIDE kodiċi.
Iskript tat-test għal 'wallet.ride'
Ejja nħarsu lejn fajl tat-test. Mħaddma mill-qafas Mocha ta' JavaScript. Hemm funzjoni "Qabel" u tliet testijiet:
"Qabel" tiffinanzja kontijiet multipli permezz ta 'MassTransferTransaction, tikkompila l-iskript u tiskjeraha fil-blockchain.
"Jista jiddepożita" jibgħat InvokeScriptTransaction lin-netwerk, billi tattiva l-funzjoni ta' depożitu () għal kull wieħed miż-żewġ kontijiet.
“Ma tistax tirtira aktar milli kien iddepożitat” testijiet li ħadd ma jista’ jisraq it-tokens ta’ ħaddieħor.
“Jista’ jiddepożita” jiċċekkja li l-irtirar jiġi pproċessat b’mod korrett.
Mexxi testijiet minn Surfboard u analizza r-riżultati fil-Waves Explorer
Biex tmexxi t-test, run
surfboard test
Jekk għandek skripts multipli (per eżempju, għandek bżonn skript ta 'skjerament separat), tista' taħdem
surfboard test my-scenario.js
Surfboard se jiġbor il-fajls tat-test fil-folder ./test/ u jmexxi l-iskript fuq in-node li huwa kkonfigurat f'surfboard.config.json. Wara ftit sekondi tara xi ħaġa bħal din:
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)
Ħura! It-testijiet għaddew. Issa ejja nagħtu ħarsa lejn x'jiġri meta tuża Waves Explorer: ħares lejn il-blokki jew waħħal wieħed mill-indirizzi hawn fuq fit-tfittxija (per eżempju, il-korrispondenti wallet#. Hemmhekk tista 'ssib l-istorja tat-tranżazzjonijiet, l-istatus dApp, fajl binarju dekompilat.
Waves Explorer. Applikazzjoni li għadha kif ġiet skjerata.