Cómo crear, implementar y probar la dApp Waves RIDE
¡Hola! En este artículo, le mostraré cómo escribir y ejecutar una dApp normal en un nodo de Waves. Veamos las herramientas, los métodos y un ejemplo de desarrollo necesarios.
El esquema de desarrollo para dApps y aplicaciones normales es casi el mismo:
Escribimos el código
Escribir pruebas automatizadas
Lanzamiento de la aplicación
Prueba
Instrumentos
1. docker para ejecutar el nodo y Waves Explorer
Si no desea iniciar un nodo, puede omitir este paso. Después de todo, existe una red de prueba y experimentación. Pero sin implementar su propio nodo, el proceso de prueba puede prolongarse.
Necesitará constantemente nuevas cuentas con tokens de prueba. El grifo de la red de prueba transfiere 10 ONDAS cada 10 minutos.
El tiempo medio de bloqueo en la red de prueba es de 1 minuto, en el nodo, de 15 segundos. Esto es especialmente notable cuando una transacción requiere múltiples confirmaciones.
El almacenamiento en caché agresivo es posible en nodos de prueba públicos.
También es posible que no estén disponibles temporalmente debido a mantenimiento.
De ahora en adelante asumiré que estás trabajando con tu propio nodo.
2. Herramienta de línea de comandos de tabla de surf
Instale Surfboard, una herramienta que le permite ejecutar pruebas en un nodo existente.
npm install -g @waves/surfboard
3. Complemento de código de Visual Studio
Este paso es opcional si no eres fanático de los IDE y prefieres los editores de texto. Todas las herramientas necesarias son utilidades de línea de comandos. Si usas vim, presta atención al complemento. vim-ride.
Descargue e instale el código de Visual Studio: https://code.visualstudio.com/
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Asegúrese de que el nodo se inicie a través de la API REST en http://localhost:6869:
API REST Swagger para nodo
2. Inicie una instancia de Waves Explorer:
docker run -d -e API_NODE_URL=http://localhost:6869 -e NODE_LIST=http://localhost:6869 -p 3000:8080 wavesplatform/explorer
Abre un navegador y ve a http://localhost:3000. Verá qué tan rápido se construye un circuito de nodo local vacío.
Waves Explorer muestra una instancia de nodo local
Estructura RIDE y herramienta para tabla de surf.
Cree un directorio vacío y ejecute el comando en él
surfboard init
El comando inicializa un directorio con la estructura del proyecto, las aplicaciones y pruebas de "hola mundo". Si abre esta carpeta con VS Code, verá:
Tabla de surf.config.json
En la carpeta ./ride/ encontrará un único archivo wallet.ride, el directorio donde se encuentra el código de la dApp. Analizaremos brevemente las dApps en el siguiente bloque.
Debajo de la carpeta ./test/ encontrará un archivo *.js. Las pruebas se almacenan aquí.
./surfboard.config.json: archivo de configuración para ejecutar pruebas.
Envs es una sección importante. Cada entorno está configurado así:
Punto final de la API REST del nodo que se utilizará para iniciar la dApp y CHAIN_ID de la red.
Una frase secreta para una cuenta con tokens que serán la fuente de tus tokens de prueba.
Como puede ver, surfboard.config.json admite múltiples entornos de forma predeterminada. El valor predeterminado es el entorno local (la clave defaultEnv es un parámetro modificable).
Aplicación de demostración de billetera
Esta sección no es una referencia al lenguaje RIDE. Más bien, una mirada a la aplicación que implementamos y probamos para comprender mejor lo que sucede en la cadena de bloques.
Veamos una sencilla aplicación de demostración de Wallet. Cualquiera puede enviar tokens a una dirección de dApp. Sólo podrás retirar tus WAVES. Dos funciones @Callable están disponibles a través de InvokeScriptTransaction:
deposit()que requiere un pago adjunto en WAVES
withdraw(amount: Int)que devuelve fichas
Durante todo el ciclo de vida de la dApp, se mantendrá la estructura (dirección → cantidad):
la columna Acción
Estado resultante
inicial
vacío
Alice deposita 5 ONDAS
dirección-alicia → 500000000
Alice retira 4 ONDAS
dirección-alicia → 100000000
dirección-bob → 200000000
Aquí está el código para comprender completamente la situación:
# 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 código de muestra también se puede encontrar en GitHub.
El complemento VSCode admite la compilación continua mientras se edita un archivo. Por lo tanto, siempre puede monitorear los errores en la pestaña PROBLEMAS.
Si desea utilizar un editor de texto diferente al compilar el archivo, utilice
surfboard compile ride/wallet.ride
Esto generará una serie de código RIDE compilado en base64.
Script de prueba para 'wallet.ride'
Miremos a archivo de prueba. Desarrollado por el marco Mocha de JavaScript. Hay una función “Antes” y tres pruebas:
"Antes" financia varias cuentas a través de MassTransferTransaction, compila el script y lo implementa en la cadena de bloques.
“Can deposit” envía una InvokeScriptTransaction a la red, activando la función deposit() para cada una de las dos cuentas.
"No se puede retirar más de lo depositado" prueba que nadie puede robar los tokens de otras personas.
"Puede depositar" cheques que los retiros se procesen correctamente.
Ejecute pruebas desde Surfboard y analice resultados en Waves Explorer
Para ejecutar la prueba, ejecute
surfboard test
Si tiene varios scripts (por ejemplo, necesita un script de implementación independiente), puede ejecutar
surfboard test my-scenario.js
Surfboard recopilará los archivos de prueba en la carpeta ./test/ y ejecutará el script en el nodo configurado en surfboard.config.json. Después de unos segundos verás algo como esto:
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)
¡Hurra! Se pasaron las pruebas. Ahora echemos un vistazo a lo que sucede cuando se usa Waves Explorer: mire los bloques o pegue una de las direcciones anteriores en la búsqueda (por ejemplo, la correspondiente wallet#. Allí puede encontrar el historial de transacciones, el estado de la dApp y el archivo binario descompilado.
Explorador de olas. Una aplicación que acaba de implementarse.
Algunos consejos sobre tablas de surf:
1. Para realizar pruebas en el entorno testnet, utilice:
Configurar Waves Keeper para que funcione con un nodo local
2. ¿Importar frase secreta con tokens para la red? Para simplificar, use la semilla inicial de su nodo: waves private node seed with waves tokens. DIRECCIÓN: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.