Saluton! En ĉi tiu artikolo mi montros al vi kiel skribi kaj ruli regulan dApp sur Waves-nodo. Ni rigardu la necesajn ilojn, metodojn kaj ekzemplon de evoluo.
La evoluskemo por dApps kaj regulaj aplikoj estas preskaŭ la sama:
Skriba kodo
Skribante aŭtomatigitan testadon
Lanĉante la programon
Testado
Iloj
1. docker ruli nodon kaj Waves Explorer
Se vi ne volas komenci nodon, vi povas salti ĉi tiun paŝon. Post ĉio, ekzistas prova kaj eksperimenta reto. Sed sen deplojado de via propra nodo, la testa procezo povas daŭri.
Vi konstante bezonos novajn kontojn kun testaj ĵetonoj. La prova reto-krano transdonas 10 ONDOJ ĉiujn 10 minutojn.
La averaĝa bloktempo en la testa reto estas 1 minuto, en la nodo - 15 sekundoj. Ĉi tio estas precipe rimarkebla kiam transakcio postulas plurajn konfirmojn.
Agresema kaŝmemoro eblas sur publikaj testnodoj.
Ili ankaŭ povas esti provizore neatingeblaj pro bontenado.
De nun mi supozos, ke vi laboras per via propra nodo.
Instalu Surfboard, ilon, kiu ebligas al vi fari testojn sur ekzistanta nodo.
npm install -g @waves/surfboard
3. Vida Studio Kodo kromaĵo
Ĉi tiu paŝo estas laŭvola se vi ne estas ŝatanto de IDEoj kaj preferas tekstredaktilojn. Ĉiuj necesaj iloj estas komandliniaj utilecoj. Se vi uzas vim, atentu la kromprogramon vim-ride.
Elŝutu kaj instalu Visual Studio Code: https://code.visualstudio.com/
Malfermu VS Code kaj instalu la kromprogramon waves-ride:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Malfermu retumilon kaj iru al http://localhost:3000. Vi vidos kiom rapide malplena loka noda cirkvito estas konstruita.
Waves Explorer montras lokan nodan ekzemplon
RIDE strukturo kaj Surftabulo ilo
Kreu malplenan dosierujon kaj rulu la komandon en ĝi
surfboard init
La komando pravigas dosierujon kun la projektostrukturo, "saluton mondo" aplikaĵoj kaj testoj. Se vi malfermas ĉi tiun dosierujon kun VS Code, vi vidos:
Surfboard.config.json
Sub la dosierujo ./ride/ vi trovos ununuran dosieron wallet.ride - la dosierujon kie troviĝas la dApp-kodo. Ni mallonge analizos dApps en la sekva bloko.
Sub la dosierujo ./test/ vi trovos dosieron *.js. Testoj estas konservitaj ĉi tie.
./surfboard.config.json - agorda dosiero por ruli testojn.
Envs estas grava sekcio. Ĉiu medio estas agordita tiel:
REST API finpunkto de la nodo, kiu estos uzata por lanĉi la dApp kaj CHAIN_ID de la reto.
Sekreta frazo por konto kun ĵetonoj, kiuj estos la fontoj de viaj testaj ĵetonoj.
Kiel vi povas vidi, surfboard.config.json subtenas plurajn mediojn defaŭlte. La defaŭlta estas la loka medio (la defaultEnv-klavo estas ŝanĝebla parametro).
Monujo-demo-apliko
Ĉi tiu sekcio ne estas referenco al la RIDE-lingvo. Prefere, rigardu la aplikaĵon, kiun ni deplojas kaj testas por pli bone kompreni, kio okazas en la blokĉeno.
Ni rigardu simplan Wallet-demo-aplikaĵon. Ĉiu povas sendi ĵetonojn al dApp-adreso. Vi povas nur retiri viajn ONDOJN. Du @Callable-funkcioj haveblas per InvokeScriptTransaction:
deposit()kiu postulas kunan pagon en ONDOJ
withdraw(amount: Int)kiu resendas ĵetonojn
Dum la dApp-vivciklo, la strukturo (adreso → kvanto) estos konservita:
ago
Rezulta stato
komenca
malplena
Alice deponas 5 ONDOJ
alice-adreso → 500000000
Bob deponas 2 ONDOJ
alice-adreso → 500000000
bob-adreso → 200000000
Bob retiras 7 ONDOJ
NITA!
Alice retiriĝas 4 ONDOJ
alice-adreso → 100000000
bob-adreso → 200000000
Jen la kodo por plene kompreni la situacion:
# 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
La kromaĵo VSCode subtenas kontinuan kompilon dum redaktado de dosiero. Tial vi ĉiam povas monitori erarojn en la langeto PROBLEMOJ.
Se vi volas uzi alian tekstredaktilon dum kompilado de la dosiero, uzu
surfboard compile ride/wallet.ride
Ĉi tio eligos serion de base64 kompilita RIDE-kodo.
Testa skripto por 'wallet.ride'
Ni rigardu prova dosiero. Funkciigita de la Mocha kadro de JavaScript. Estas funkcio "Antaŭ" kaj tri testoj:
"Antaŭ" financas multoblajn kontojn per MassTransferTransaction, kompilas la skripton kaj deplojas ĝin al la blokĉeno.
"Povas deponi" sendas InvokeScriptTransaction al la reto, aktivigante la funkcion deponejo () por ĉiu el la du kontoj.
"Ne povas eltiri pli ol estis deponita" testoj, ke neniu povas ŝteli aliulajn ĵetonojn.
"Povas deponi" ĉekojn, ke retiriĝoj estas ĝuste procesitaj.
Faru testojn de Surfboard kaj analizu rezultojn en Waves Explorer
Por fari la teston, kuru
surfboard test
Se vi havas plurajn skriptojn (ekzemple, vi bezonas apartan deplojan skripton), vi povas ruli
surfboard test my-scenario.js
Surfboard kolektos la testdosierojn en la dosierujo ./test/ kaj ruligos la skripton sur la nodo agordita en surfboard.config.json. Post kelkaj sekundoj vi vidos ion tian:
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)
Hura! Provoj pasis. Nun ni rigardu kio okazas kiam vi uzas Waves Explorer: rigardu la blokojn aŭ algluu unu el la supraj adresoj en la serĉon (ekzemple, la responda wallet#. Tie vi povas trovi transakcian historion, dApp-statuson, malkompilitan binaran dosieron.
2. Importi sekretan frazon kun ĵetonoj por la reto? Por simpleco, uzu la komencan semon de via nodo: waves private node seed with waves tokens. Adreso: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.