Kijan pou konstwi, deplwaye ak teste Waves RIDE dApp
Bonjou! Nan atik sa a mwen pral montre w ki jan yo ekri ak kouri yon dApp regilye sou yon ne Waves. Ann gade nan zouti ki nesesè yo, metòd ak yon egzanp devlopman.
Konplo devlopman pou dApps ak aplikasyon regilye se prèske menm bagay la:
Ekri kòd
Ekri tès otomatik
Lanse aplikasyon an
Tès
Zouti
1. docker kouri ne ak Waves Explorer
Si ou pa vle kòmanse yon ne, ou ka sote etap sa a. Apre yo tout, gen yon tès ak rezo eksperimantal. Men, san yo pa deplwaye ne pwòp ou a, pwosesis tès la ka trennen sou.
Ou pral toujou bezwen nouvo kont ak siy tès yo. Wobinèt rezo tès la transfere 10 VAG chak 10 minit.
Tan an mwayèn blòk nan rezo tès la se 1 minit, nan ne a - 15 segonn. Sa a se espesyalman aparan lè yon tranzaksyon mande pou plizyè konfimasyon.
Cache agresif posib sou nœuds tès piblik yo.
Yo ka pa disponib tou tanporèman akòz antretyen.
Depi koulye a mwen pral asime ke w ap travay ak ne pwòp ou a.
Enstale Surfboard, yon zouti ki pèmèt ou fè tès sou yon ne ki egziste deja.
npm install -g @waves/surfboard
3. Visual Studio kòd plugin
Etap sa a opsyonèl si ou pa fanatik IDE epi ou prefere editè tèks. Tout zouti ki nesesè yo se sèvis piblik liy kòmand. Si w itilize vim, peye atansyon sou plugin la vim-woulib.
Telechaje epi enstale Kòd Visual Studio: 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
Louvri yon navigatè epi ale nan http://localhost:3000. Ou pral wè ki jan vit bati yon sikwi vid lokal ne.
Waves Explorer montre yon egzanp ne lokal
RIDE estrikti ak zouti Surfboard
Kreye yon anyè vid epi kouri lòd la nan li
surfboard init
Kòmandman an inisyalize yon anyè ak estrikti pwojè a, aplikasyon "bonjou mond" ak tès yo. Si ou louvri katab sa a ak VS Code, ou pral wè:
Surfboard.config.json
Anba katab la ./ride/ w ap jwenn yon sèl dosye wallet.ride - anyè kote kòd dApp la ye. Nou pral yon ti tan analize dApps nan pwochen blòk la.
Anba katab ./test/ w ap jwenn yon fichye *.js. Tès yo estoke isit la.
./surfboard.config.json – fichye konfigirasyon pou fè tès yo.
Envs se yon seksyon enpòtan. Chak anviwònman konfigirasyon konsa:
Pwen final REST API nan ne ki pral itilize pou lanse dApp ak CHAIN_ID rezo a.
Yon fraz sekrè pou yon kont ak siy ki pral sous yo nan siy tès ou yo.
Kòm ou ka wè, surfboard.config.json sipòte plizyè anviwònman pa default. Defo a se anviwònman lokal la (kle defaultEnv la se yon paramèt ki ka chanje).
Aplikasyon pou bous-demo
Seksyon sa a pa yon referans a lang RIDE. Olye de sa, yon gade nan aplikasyon an ke nou deplwaye ak teste pi byen konprann sa k ap pase nan blockchain la.
Ann gade nan yon aplikasyon senp bous-demo. Nenpòt moun ka voye jeton nan yon adrès dApp. Ou ka sèlman retire WAVES ou yo. De fonksyon @Callable disponib atravè InvokeScriptTransaction:
deposit()ki mande yon peman tache nan WAVES
withdraw(amount: Int)ki retounen marqueur
Pandan tout sik lavi dApp la, estrikti a (adrès → kantite lajan) yo pral konsève:
Aksyon
Eta ki lakòz
premye
vid
Alice depoze 5 VAG
alice-address → 500000000
Bob depoze 2 VAG
alice-address → 500000000
bob-adrès → 200000000
Bob retire 7 VAG
NYE!
Alice retire 4 VAG
alice-address → 100000000
bob-adrès → 200000000
Isit la se kòd la konplètman konprann sitiyasyon an:
# 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
Plugin VSCode a sipòte konpilasyon kontinyèl pandan y ap modifye yon dosye. Se poutèt sa, ou ka toujou kontwole erè nan tab la PWOBLÈM.
Si ou vle sèvi ak yon lòt editè tèks lè w ap konpile dosye a, sèvi ak
surfboard compile ride/wallet.ride
Sa a pral bay yon seri kòd RIDE konpile base64.
Script tès pou 'wallet.ride'
Ann gade dosye tès la. Powered by moka fondasyon JavaScript a. Gen yon fonksyon "Anvan" ak twa tès:
"Anvan" finanse plizyè kont atravè MassTransferTransaction, konpile script la epi deplwaye li nan blockchain la.
"Ka depoze" voye yon Tranzaksyon InvokeScript nan rezo a, aktive fonksyon an depo () pou chak nan de kont yo.
"Pa ka retire plis pase sa te depoze" tès ke pèsonn pa ka vòlè siy lòt moun.
"Ka depoze" chèk ke retrè yo trete kòrèkteman.
Kouri tès nan Surfboard epi analize rezilta yo nan Waves Explorer
Pou kouri tès la, kouri
surfboard test
Si ou gen plizyè script (pa egzanp, ou bezwen yon script deplwaman separe), ou ka kouri
surfboard test my-scenario.js
Surfboard pral kolekte dosye tès yo nan katab la ./test/ epi kouri script la sou ne ki configuré nan surfboard.config.json. Apre kèk segonn ou pral wè yon bagay tankou sa a:
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)
Houra! Tès yo te pase. Koulye a, ann gade sa k ap pase lè w ap itilize Waves Explorer: gade blòk yo oswa kole youn nan adrès ki anwo yo nan rechèch la (pa egzanp, korespondan an. wallet#. Gen ou ka jwenn istwa tranzaksyon, estati dApp, dekonpile dosye binè.
Mete kanpe Waves Keeper pou travay avèk yon ne lokal
2. Enpòte fraz sekrè ak marqueur pou rezo a? Pou senplisite, sèvi ak premye grenn nan ne ou: waves private node seed with waves tokens. Adrès: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.