A Waves RIDE dApp felépítése, telepítése és tesztelése
Helló! Ebben a cikkben megmutatom, hogyan írhat és futtathat egy szokásos dApp-ot egy Waves csomóponton. Nézzük a szükséges eszközöket, módszereket és egy példát a fejlesztésre.
A dApps és a normál alkalmazások fejlesztési sémája majdnem ugyanaz:
Írjuk a kódot
Automatizált tesztelés írása
Az alkalmazás elindítása
Tesztelés
Tools
1. docker a csomópont és a Waves Explorer futtatásához
Ha nem szeretne csomópontot indítani, kihagyhatja ezt a lépést. Hiszen létezik egy teszt- és kísérleti hálózat. De a saját csomópont telepítése nélkül a tesztelési folyamat elhúzódhat.
Folyamatosan új fiókokra lesz szüksége teszt tokenekkel. A teszt hálózati csaptelep 10 percenként 10 HULMÁT továbbít.
Az átlagos blokkolási idő a teszthálózatban 1 perc, a csomópontban - 15 másodperc. Ez különösen akkor észrevehető, ha egy tranzakció több megerősítést igényel.
Agresszív gyorsítótárazás lehetséges a nyilvános tesztcsomópontokon.
Előfordulhat, hogy karbantartás miatt átmenetileg nem elérhetők.
Mostantól azt feltételezem, hogy a saját csomópontjával dolgozik.
Telepítse a Surfboardot, egy olyan eszközt, amely lehetővé teszi tesztek futtatását egy meglévő csomóponton.
npm install -g @waves/surfboard
3. Visual Studio Code beépülő modul
Ez a lépés nem kötelező, ha nem rajong az IDE-ért, és inkább a szövegszerkesztőket részesíti előnyben. Az összes szükséges eszköz parancssori segédprogram. Ha vim-et használ, figyeljen a bővítményre vim-ride.
Töltse le és telepítse a Visual Studio kódot: https://code.visualstudio.com/
Nyissa meg a VS Code-ot, és telepítse a waves-ride bővítményt:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Győződjön meg arról, hogy a csomópont a REST API-n keresztül indul el http://localhost:6869:
Swagger REST API csomóponthoz
2. Indítsa el a Waves Explorer egy példányát:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Nyisson meg egy böngészőt, és lépjen ide http://localhost:3000. Látni fogja, milyen gyorsan épül fel egy üres helyi csomópont áramkör.
A Waves Explorer egy helyi csomópontpéldányt jelenít meg
RIDE szerkezet és szörfdeszka eszköz
Hozzon létre egy üres könyvtárat, és futtassa a parancsot
surfboard init
A parancs inicializál egy könyvtárat a projekt szerkezetével, a „hello world” alkalmazásokkal és tesztekkel. Ha megnyitja ezt a mappát a VS Code segítségével, a következőket fogja látni:
Surfboard.config.json
A ./ride/ mappa alatt egyetlen wallet.ride fájl található – az a könyvtár, ahol a dApp kód található. A következő blokkban röviden elemezzük a dApps-okat.
A ./test/ mappa alatt egy *.js fájl található. A teszteket itt tárolják.
Az Envs fontos rész. Minden környezet a következőképpen van konfigurálva:
A dApp és a hálózat CHAIN_ID elindításához használt csomópont REST API-végpontja.
Titkos kifejezés egy tokenekkel rendelkező fiókhoz, amely a teszt tokenek forrása lesz.
Mint látható, a surfboard.config.json alapértelmezés szerint több környezetet is támogat. Az alapértelmezett a helyi környezet (a defaultEnv kulcs egy megváltoztatható paraméter).
Wallet-demó alkalmazás
Ez a rész nem utal a RIDE nyelvre. Inkább tekintse meg az általunk telepített és tesztelt alkalmazást, hogy jobban megértse, mi történik a blokkláncban.
Nézzünk egy egyszerű Wallet-demó alkalmazást. Bárki küldhet tokeneket egy dApp címre. Csak a HULLÁMAIDAT vonhatod vissza. Két @Callable függvény érhető el az InvokeScriptTransaction segítségével:
deposit()amelyhez mellékelt befizetés szükséges WAVES-ben
withdraw(amount: Int)amely tokeneket ad vissza
A dApp életciklusa során a struktúra (cím → mennyiség) megmarad:
Akció
Eredmény állapot
kezdetben
üres
Alice letétbe helyez 5 HULLÁMOT
alice-cím → 500000000
Bob letétbe helyez 2 HULLÁT
alice-cím → 500000000
bob-cím → 200000000
Bob visszahúz 7 HULLÁMOT
TAGADVA!
Alice visszahúz 4 HULLÁMOT
alice-cím → 100000000
bob-cím → 200000000
Íme a kód a helyzet teljes megértéséhez:
# 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
A VSCode beépülő modul támogatja a folyamatos fordítást a fájl szerkesztése közben. Ezért mindig figyelheti a hibákat a PROBLÉMÁK lapon.
Ha más szövegszerkesztőt szeretne használni a fájl összeállításakor, használja a
surfboard compile ride/wallet.ride
Ez egy sorozat base64 lefordított RIDE kódot ad ki.
Tesztszkript a 'wallet.ride' számára
Nézzük tesztfájl. A JavaScript Mocha keretrendszere működteti. Van egy „Előtte” funkció és három teszt:
A „Mielőtt” több számlát finanszíroz a MassTransferTransaction segítségével, lefordítja a szkriptet és telepíti a blokkláncra.
A „Can deposit” egy InvokeScriptTransaction-t küld a hálózatnak, aktiválva a deposit() funkciót mind a két számlán.
„Nem lehet többet kivenni, mint amennyit letétbe helyeztek” teszteli, hogy senki sem lophatja el mások tokenjeit.
A „Lehet befizetni” ellenőrzi, hogy a kifizetések feldolgozása megfelelő-e.
Futtasson teszteket a szörfdeszkáról, és elemezze az eredményeket a Waves Explorerben
A teszt futtatásához futtassa
surfboard test
Ha több szkriptje van (például külön telepítési szkriptre van szüksége), futtathatja
surfboard test my-scenario.js
A Surfboard összegyűjti a tesztfájlokat a ./test/ mappában, és futtatja a szkriptet a surfboard.config.json fájlban konfigurált csomóponton. Néhány másodperc múlva valami ilyesmit fog látni:
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)
Hurrá! A tesztek sikeresek. Most nézzük meg, mi történik a Waves Explorer használatakor: nézze meg a blokkokat, vagy illessze be a fenti címek egyikét a keresésbe (például a megfelelő wallet#. Itt megtalálhatja a tranzakciós előzményeket, a dApp állapotát, a dekompilált bináris fájlt.
Waves Explorer. Egy alkalmazás, amelyet most telepítettek.
Néhány tipp szörfdeszkához:
1. A testnet környezetben való teszteléshez használja:
2. Ha látni szeretné a tranzakciók JSON-verzióit és azt, hogy a csomópont hogyan dolgozza fel azokat, futtassa a tesztet a -v paranccsal (azaz „bőbeszédű”):
A Waves Keeper beállítása helyi csomóponttal való együttműködésre
2. Importál titkos kifejezést tokenekkel a hálózathoz? Az egyszerűség kedvéért használja a csomópont kezdeti magját: waves private node seed with waves tokens. Cím: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.