¡Hola! En este artículo, voy a mostrarte cómo escribir y ejecutar un dApp en la nodo Waves. Revisaremos las herramientas necesarias, los métodos y un ejemplo de desarrollo.

El esquema de desarrollo de dApps y aplicaciones comunes no difiere mucho:
- Escribimos el código
- Escribimos pruebas automatizadas
- Iniciamos la aplicación
- Probamos
Herramientas
1. docker para ejecutar la nodo y Waves Explorer
Si no deseas ejecutar la nodo, puedes omitir este paso. Existen redes de pruebas y experimentales. Pero sin desplegar tu propia nodo, el proceso de prueba puede tardar.
- Siempre necesitarás nuevas cuentas con tokens de prueba. El grifo de la red de pruebas transfiere 10 WAVES cada 10 minutos.
- El tiempo medio de bloques en la red de pruebas es de 1 minuto, mientras que en la nodo es de 15 segundos. Esto es especialmente notorio cuando una transacción requiere varias confirmaciones.
- En nodos de prueba públicos, puede haber un caché agresivo.
- También pueden estar temporalmente fuera de servicio debido al mantenimiento técnico.
A partir de aquí asumiré que estás trabajando con tu propia nodo.
2. Herramienta de línea de comandos Surfboard
- Descarga e instala Node.js usando ppa, homebrew o exe aquí: .
- Instala Surfboard, una herramienta que te permitirá ejecutar pruebas en una nodo existente.
npm install -g @waves/surfboard
3. Plugin de Visual Studio Code
Este paso es opcional, si no eres un fanático de las IDE y prefieres editores de texto. Todas las herramientas necesarias son utilidades de línea de comandos. Si usas vim, presta atención al plugin .
Descarga e instala Visual Studio Code:
Abre VS Code e instala el plugin waves-ride:

Extensión del navegador Waves Keeper:
¡Listo!
Ejecuta la nodo y Waves Explorer
1. Inicia la nodo:
docker run -d -p 6869:6869 wavesplatform/waves-private-node
Asegúrate de que la nodo se ejecute a través de REST API en :

Interfaz Swagger REST API para la nodo
2. Inicia 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 el navegador y ve a . Verás cómo se construye rápidamente una cadena vacía en la nodo local.

Waves Explorer muestra una instancia de la nodo local
Estructura de RIDE y herramienta Surfboard
Crea un directorio vacío y ejecuta dentro de él el comando
surfboard init
El comando inicializa el directorio con la estructura del proyecto, una aplicación tipo 'hello world' y pruebas. Si abres esta carpeta con VS Code, verás:

Surfboard.config.json
- Bajo la carpeta ./ride/ encontrarás un único archivo wallet.ride, que es el directorio donde se encuentra el código dApp. Analizaremos brevemente el dApp en el siguiente bloque.
- En la carpeta .\/test\, encontrará el archivo *.js. Aquí se almacenan las pruebas.
- .\/surfboard.config.json es el archivo de configuración para ejecutar las pruebas.
Envs es una sección importante. Cada entorno se configura de la siguiente manera:
- El endpoint de la API REST de la nodo, que se utilizará para lanzar la dApp y el CHAIN_ID de la red.
- Frase secreta para la cuenta con tokens, que serán las fuentes de tokens de su prueba.
Como puede ver, surfboard.config.json por defecto soporta varios entornos. Por defecto está configurado el entorno local (la clave defaultEnv es un parámetro modificable).
La aplicación Wallet-demo
Esta sección no es un manual del lenguaje RIDE. Más bien, es una mirada a la aplicación que estamos desplegando y probando para entender mejor lo que sucede en la blockchain.
Consideremos una aplicación simple Wallet-demo. Cualquiera puede enviar tokens a la dirección de la dApp. Solo se pueden retirar sus propios WAVES. Hay dos funciones @Callable disponibles a través de InvokeScriptTransaction:
deposit(), que requiere un pago adjunto en WAVESwithdraw(amount: Int), que devuelve tokens
A lo largo de todo el ciclo de vida de la dApp, la estructura (dirección → cantidad) se mantendrá:
Acción
Estado resultante
inicial
vacío
Alice deposita 5 WAVES
alice-address → 500000000
Bob deposita 2 WAVES
alice-address → 500000000
bob-address → 200000000
Bob retira 7 WAVES
¡DENEGADO!
Alice retira 4 WAVES
alice-address → 100000000
bob-address → 200000000
Aquí está el código para entender 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() = falseTambién se puede encontrar un ejemplo de código en .
El plugin de VSCode soporta compilación continua al editar el archivo. Por lo tanto, siempre puede seguir los errores en la pestaña PROBLEMAS.

Si desea usar otro editor de texto al compilar el archivo, use
surfboard compile ride\/wallet.ride
Esto generará una serie de códigos RIDE compilados en base64.
Escenario de prueba para ‘wallet.ride’
Veamos el . Funciona en el marco de JavaScript Mocha. Hay una función «Before» y tres pruebas:
- «Before» financia varias cuentas a través de MassTransferTransaction, compila el script y lo despliega en la blockchain.
- «Can deposit» envía a la red InvokeScriptTransaction, activando la función deposit() para cada una de las dos cuentas.
- «Can’t withdraw more than was deposited» prueba que nadie podrá robar los tokens de otros.
- «Can deposit» verifica que las retiradas se manejan correctamente.
Ejecutando pruebas con Surfboard y analizando los resultados en Waves Explorer
Para ejecutar la prueba, ejecute
surfboard test
Si tiene varios escenarios (por ejemplo, necesita un script de despliegue separado), puede ejecutar
surfboard test my-scenario.js
Surfboard recogerá archivos de prueba en la carpeta .\/test\/ y ejecutará el script en el nodo que está configurado en surfboard.config.json. Después de unos segundos, observarás algo similar:
cartera test suite
Generando cuentas con nonce: ce8d86ee
Cuenta generada: foofoofoofoofoofoofoofoofoofoofoo#ce8d86ee - 3M763WgwDhmry95XzafZedf7WoBf5ixMwhX
Cuenta generada: barbarbarbarbarbarbarbarbarbar#ce8d86ee - 3MAi9KhwnaAk5HSHmYPjLRdpCAnsSFpoY2v
Cuenta generada: wallet#ce8d86ee - 3M5r6XYMZPUsRhxbwYf1ypaTB6MNs2Yo1Gb
Cuentas financiadas con éxito
El script ha sido configurado
√ Se puede depositar (4385ms)
√ No se puede retirar más de lo que se depositó
√ Se puede retirar (108ms)
3 aprobadas (15s)
¡Hurra! Las pruebas han sido superadas. Ahora echemos un vistazo a lo que sucede al usar Waves Explorer: revisemos los bloques o introduzcamos una de las direcciones mencionadas anteriormente en la búsqueda (por ejemplo, correspondiente cartera#. Allí se puede encontrar el historial de transacciones, el estado de dApp, el archivo binario decompilado.

Waves Explorer. Una aplicación que acaba de ser desplegada.
Algunos consejos sobre Surfboard:
1. Para probar en el entorno testnet, usa:
surfboard test --env=testnet
2. Si deseas ver las versiones JSON de las transacciones y cómo son procesadas por el nodo, ejecuta la prueba con -v (significa 'verbose'):
surfboard test -v
Uso de aplicaciones con Waves Keeper
1. Configura Waves Keeper para que funcione:

Configuración de Waves Keeper para trabajar con un nodo local
2. ¿Importar la frase secreta con tokens para la red? Para simplificar, usa el seed inicial de tu nodo: waves private node seed with waves tokens. Dirección: 3M4qwDomRabJKLZxuXhwfqLApQkU592nWxF.
3. Puedes ejecutar una aplicación de una sola página, sin servidor, por tu cuenta, utilizando npm. O dirígete a una existente:
4. Introduce la dirección de la cartera del lanzamiento de prueba (subrayada arriba) en el campo de texto de la dirección dApp
5. Escribe una pequeña cantidad en el campo «Depositar» y presiona el botón:

Waves Keeper solicita permiso para firmar el InvokeScriptTransaction con un pago de 10 WAVES.
6. Confirma la transacción:

La transacción ha sido creada y se está transmitiendo a la red. Ahora se puede ver su ID
7. Observa la transacción usando Waves Explorer. Introduce el ID en el campo de búsqueda

Conclusiones y información adicional
Hemos revisado herramientas de desarrollo, pruebas, despliegue y uso de aplicaciones dApps simples en la Waves Platform:
- Lenguaje RIDE
- Editor VS Code
- Waves Explorer
- Surfboard
- Waves Keeper
Enlaces para aquellos que deseen continuar aprendiendo sobre RIDE:
¡Sigue profundizando en el tema de RIDE y crea tu primera dApp!
TL;DR:
Fuente: habr.com
