Dominando Web 3.0 con Waves -Módulo #4

Kolin Platform
Dominando Web3.0 con Waves
8 min readJul 7, 2019

Módulo #4 Practicando con RIDE para dApps

¡Hola! estamos en el curso en linea “Dominando Web3.0 con Waves”. Modulo 4.

En este módulo practicaremos con contratos inteligentes y también aprenderemos cómo trabajar con las bibliotecas principales de Waves.

4.1 Contratos inteligentes y dApps

4.2 Coupon Bazaar, Web 3.0 y dApps

4.3 Votación (Privada) Commit-Reveal

4.4 Práctico:

Un contrato inteligente es un código o programa de computadora que puede ejecutarse dentro de un entorno distribuido como una red blockchain. Todas las operaciones y resultados de ejecución se almacenan en la cadena de bloques.

En esta definición, un contrato inteligente no es un contrato entre las partes, sino que es un protocolo de cooperación entre usuarios, usuario y computadora o incluso computadora — computadora según las reglas descritas en el código del contrato inteligente.

Los contratos inteligentes de Waves están representados por dos tipos diferentes: cuentas inteligentes y activos inteligentes. Cualquier cuenta de Waves se puede convertir en una cuenta inteligente aplicando un script de cuenta (account-script) especial. El script de cuenta es un código de programa escrito en RIDE (lenguaje de contratos inteligentes de Waves) que contiene un conjunto de condiciones permitiendo o denegando diferentes tipos de transacciones salientes.

Para facilitar el proceso de desarrollo de dApps por parte de los desarrolladores, RIDE (el lenguaje de contratos inteligentes de Waves) tiene dos tipos de funciones principales: @Verifier y @Callable.

Las funciones @Callable son capaces de ser llamados por usuarios externos.

Como resultado de la ejecución, nueva información puede ser insertada o actualizada en el almacenamiento de datos (key-value) de la dApp y/o se pueden transferir fondos desde el saldo de la dApp a la persona que invoco el script o a cualquier otra dirección que se desee, si la lógica dentro del script de la dApp lo permite. En el caso de Waves, las aplicaciones digitales y las cuentas inteligentes son la misma entidad.

Las funciones @Callable() funcionan con dos tipos de argumentos de entrada: args (argumentos) y payment (pago). La API de Waves tiene una función especial para trabajar con las funciones @Callable — invokeScript(). Observe el siguiente ejemplo: “Aquí se puede ver WriteSet() en el codigo del contrato inteligente escrito en RIDE. Significa que el resultado de esta invocación sera escrita en el almacenamiento de datos de la dApp (key-value).”

Mira el segundo ejemplo a continuación: “Aquí puedes ver un TransferSet() y ScriptResult() en el código de contrato inteligente RIDE. Significa que el resultado de esta invocación se escribirá en el almacenamiento key-value de la aplicación, y también se transferirán algunos fondos a una determinada dirección al mismo tiempo “.

Podemos usar todas las combinaciones de WriteSet(), TransferSet() o ambos usando ScriptResult() metodos.

¡Todas las operaciones son atómicas!

Recuerde: estamos creando un mercado de cupones descentralizado de Web3.0: “Coupon Bazaar”.

Los usuarios buscan descuentos en bienes y servicios que pueden comprar por un precio reducido en el mercado.

Cada cupón es un activo digital que representa un descuento especial ofrecido por un proveedor.

El “Coupon Bazaar” es un mercado. Proporciona coordinación cliente-proveedor, servicios de pago y coordinación de servicios de entrega entre proveedores y clientes.

¡Utilicemos funciones @Callable para implementar todas las funcionalidades descritas en nuestra dApp!. Pero, en primer lugar, mira el siguiente código: “Puede ver que podemos declarar cualquier función personalizada en RIDE. Estamos trabajando principalmente con el almacenamiento de key-value dApp, así que implementemos algunas funciones para eso.”

Ahora, estamos listos para implementar la funcionalidad para proveedores: Agregar Item “Add item”.

Por favor, abra el IDE de Waves y agregue esta funcionalidad.

Los usuarios están buscando descuentos para productos y servicios y pueden comprarlos por un precio reducido en el mercado de Bazar.

Implementemos la opción “Purchase” (compra) para clientes.

Como puedes ver, nuestra dApp tiene una clave (key) especial para el saldo del proveedor. Además, el cliente puede comprar el mismo cupón muchas veces. Todas las compras se registrarán en el almacenamiento de la dApp.

La dApp del “Coupon Bazaar” tiene una clave (key) especial para el saldo del proveedor. Para poder retirar fondos de la cuenta personal del proveedor, debemos implementar la función de retiro (withdraw). Vamos a hacer eso:

Implemente la funcionalidad de retiro y ponga aquí el cambio de estado obtenido desde el explorador Waves.

Mirando al futuro, imaginemos que los miembros de la comunidad del “Coupon Bazaar” pueden querer votar por la promoción o eliminación de ciertos productos. Pueden hacerlo usando un procedimiento de votación privado.

Pero … espera un momento …
Todo en la red pública de blockchain es público y transparente. Por lo tanto, cualquier voto estará abierto para otros durante la elección, y los votos de un miembro podrían afectar las decisiones de otros.

Un esquema “Commit-Reveal” nos ayudará con eso.

Ahora necesitamos implementar dos pasos:

El paso Commit — aquí se recolectan votos encriptados usando una función hash y una cadena aleatoria (salt).

El paso Reveal — aquí se recogen los votos, se descifran y se comparan sus hashes con los hashes registrados.

Como puede ver, no hay forma de cambiar la votación después de que finalice el paso de Commit. Nadie sabe el resultado de la votacion antes de que se realice el paso de revelación (Reveal)

¡Vamos a implementar esto! Pero antes que nada tenemos que declarar nuevas variables y funciones:

El paso Commit — aquí estamos recolectando votos encriptados usando la función hash y una string aleatoria(salt):

continuemos

let commits = ["G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq",

"Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi",

"ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ"]

let reveals = ["delisted", "featured", "featured"]

let salts = ["random1", "random2", "random3"]

Implemente la funcionalidad de confirmación (utilizando los hashes y votos mostrados en el código anterior) en nuestra dApp e ingrese como respuesta los cambios de estado de la transaccion:

Intente realizar tres confirmaciones desde diferentes cuentas (con los datos del paso anterior) y ponga aquí los datos de valor clave del almacenamiento de la dApp:

El paso Reveal — Aquí estamos recogiendo los votos descifrados y comparando sus hashes con los hashes registrados.
Como puede ver, no hay forma de cambiar la votación después de que finalice el paso de confirmación (Commit).

Nadie conoce los votos antes del paso Reveal. Después de que se complete dicho paso de revelación, veremos el resultado de la votación como un cambio de estado.

Trate de hacer tres pasos de revelacion (Reveal) desde diferentes cuentas (usando los datos de los pasos anteriores) y ponga aquí los “Cambios de estado” (state changes) de la tercera invocacion de “voteReveal”:

Recuerde: estamos creando un mercado de cupones descentralizado de Web3.0: “Coupon Bazaar”.

Los usuarios están buscando descuentos por bienes y servicios y pueden comprarlos por un pequeño precio en este mercado.

Cada cupón es un activo digital que representa un descuento especial ofrecido por un proveedor.

En este paso, intentaremos mejorar nuestra aplicación boilerplate creada en el “Módulo 1”.

Abra GitHub y cree un fork del repositorio mweb3waves (https://github.com/AlekseiPupyshev/mweb3waves) en vuestra cuenta personal de GitHub.

Clonelo a su computadora local y cambie a la rama bchintegration.

git clone https://github.com/**your*account**/mweb3waves.git;git checkout bchintegration;npm install;npm run build;npm run server;

Corra el comando npm y abra http://localhost:5000/. Este es un nuevo proyecto para “Coupon Bazaar”.

Veamos el código fuente. (package.json y index.jsx):

Aquí puedes ver algunos cambios:

1. Nuevas libretas importantes fueron incluidas en el proyecto. — waves-transactions y waves-crypto.

2. Las funciones más importantes se importaron a la aplicación de reacción.

Ya estás familiarizado con las funciones: { invokeScript, broadcast, waitForTx } de la IDE JavaScript.

nodeInteraction — nos permitirá obtener datos del almacenamiento de key-value dApp.

¡Hagamos algunos ejercicios!

Abre la consola de desarrollo en http://localhost:5000/ y ponga el resultado impreso de console.log(JSON.stringify(v)):

¿Cómo obtener hashes para la implementación de los pasos commit?

let commits = ["G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq", "Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi", "ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ"] 
let reveals = ["delisted", "featured", "featured"]
let salts = ["random1", "random2", "random3"]

Abre la consola de desarrollo en http://localhost:5000/ y trate de llamar las funciones “crypto”:

Ponga aquí el hash para:

"delisted" + "random4"

Utilizando el objeto nodeInteraction, escriba el código para obtener el numero de bloque actual (height):

Pista:

https://wavesplatform.github.io/waves-transactions/globals.html

--

--

Kolin Platform
Dominando Web3.0 con Waves

Kolin is an acronym of "Konscienco Lingvo" which in Esperanto means "Conscious Language". https://kolinplatform.com