Com construir, desplegar i provar la dApp Waves RIDE
Hola! En aquest article us mostraré com escriure i executar una dApp normal en un node Waves. Vegem les eines necessàries, els mètodes i un exemple de desenvolupament.
L'esquema de desenvolupament per a dApps i aplicacions normals és gairebé el mateix:
Codi d'escriptura
Redacció de proves automatitzades
Inicieu l'aplicació
Prova
Instruments
1. docker per executar el node i Waves Explorer
Si no voleu iniciar un node, podeu ometre aquest pas. Després de tot, hi ha una xarxa de proves i experimentals. Però sense desplegar el vostre propi node, el procés de prova pot allargar-se.
Necessitaràs constantment comptes nous amb fitxes de prova. L'aixeta de la xarxa de prova transfereix 10 ONDES cada 10 minuts.
El temps mitjà de bloc a la xarxa de prova és d'1 minut, al node - 15 segons. Això es nota especialment quan una transacció requereix confirmacions múltiples.
La memòria cau agressiva és possible als nodes de prova públics.
També poden no estar disponibles temporalment a causa del manteniment.
A partir d'ara assumiré que esteu treballant amb el vostre propi node.
Instal·leu Surfboard, una eina que us permet fer proves en un node existent.
npm install -g @waves/surfboard
3. Connector de Visual Studio Code
Aquest pas és opcional si no sou un fan dels IDE i preferiu els editors de text. Totes les eines necessàries són utilitats de línia d'ordres. Si utilitzeu vim, presteu atenció al connector vim-ride.
Baixeu i instal·leu Visual Studio Code: https://code.visualstudio.com/
Obriu VS Code i instal·leu el connector waves-ride:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Obriu el vostre navegador i aneu a http://localhost:3000. Veureu amb quina rapidesa es construeix un circuit de nodes locals buit.
Waves Explorer mostra una instància de node local
Estructura RIDE i eina de taula de surf
Creeu un directori buit i executeu-hi l'ordre
surfboard init
L'ordre inicialitza un directori amb l'estructura del projecte, aplicacions "hola món" i proves. Si obriu aquesta carpeta amb VS Code, veureu:
Surfboard.config.json
A la carpeta ./ride/ hi trobareu un únic fitxer wallet.ride: el directori on es troba el codi dApp. Analitzarem breument les dApps al bloc següent.
A la carpeta ./test/ trobareu un fitxer *.js. Les proves s'emmagatzemen aquí.
./surfboard.config.json: fitxer de configuració per executar proves.
Envs és una secció important. Cada entorn es configura així:
Punt final de l'API REST del node que s'utilitzarà per llançar la dApp i CHAIN_ID de la xarxa.
Una frase secreta per a un compte amb fitxes que seran les fonts dels vostres fitxes de prova.
Com podeu veure, surfboard.config.json admet diversos entorns de manera predeterminada. El valor predeterminat és l'entorn local (la clau defaultEnv és un paràmetre canviable).
Aplicació de demostració de cartera
Aquesta secció no és una referència al llenguatge RIDE. Més aviat, una ullada a l'aplicació que implementem i provem per entendre millor què passa a la cadena de blocs.
Vegem una senzilla aplicació de demostració de Wallet. Qualsevol pot enviar fitxes a una adreça dApp. Només pots retirar les teves ONDES. Hi ha dues funcions @Callable disponibles mitjançant InvokeScriptTransaction:
deposit()que requereix un pagament adjunt en WAVES
withdraw(amount: Int)que retorna fitxes
Al llarg del cicle de vida dApp, es mantindrà l'estructura (adreça → import):
Alice retira 4 ONDES
adreça-alicia → 100000000
adreça bob → 200000000
Aquí teniu el codi per entendre completament la situació:
# 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
El connector VSCode admet la compilació contínua mentre s'edita un fitxer. Per tant, sempre podeu controlar els errors a la pestanya PROBLEMES.
Si voleu utilitzar un editor de text diferent quan compileu el fitxer, feu servir
surfboard compile ride/wallet.ride
Això sortirà una sèrie de codi RIDE compilat en base64.
Script de prova per a "wallet.ride"
Mirem-ho fitxer de prova. Desenvolupat pel marc Mocha de JavaScript. Hi ha una funció "Abans" i tres proves:
"Abans" finança diversos comptes mitjançant MassTransferTransaction, compila l'script i el desplega a la cadena de blocs.
"Pot dipositar" envia una transacció InvokeScript a la xarxa, activant la funció de dipòsit () per a cadascun dels dos comptes.
"No es pot retirar més del que es va dipositar" proves que ningú pot robar fitxes d'altres persones.
"Pot dipositar" verifica que les retirades es processen correctament.
Executeu proves des de Surfboard i analitzeu els resultats a Waves Explorer
Per executar la prova, córrer
surfboard test
Si teniu diversos scripts (per exemple, necessiteu un script de desplegament independent), podeu executar-lo
surfboard test my-scenario.js
Surfboard recopilarà els fitxers de prova a la carpeta ./test/ i executarà l'script al node configurat a surfboard.config.json. Al cap d'uns segons veureu alguna cosa com això:
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! Proves superades. Mirem ara què passa quan utilitzeu Waves Explorer: mireu els blocs o enganxeu una de les adreces anteriors a la cerca (per exemple, la corresponent wallet#. Allà podeu trobar l'historial de transaccions, l'estat d'App, el fitxer binari descompilat.
Explorador de les ones. Una aplicació que s'acaba de desplegar.
Configurant Waves Keeper per treballar amb un node local
2. Importar una frase secreta amb fitxes per a la xarxa? Per simplificar, utilitzeu la llavor inicial del vostre node: waves private node seed with waves tokens. Adreça: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.