Dominando Web 3.0 con Waves -Módulo #3

Kolin Platform
Dominando Web3.0 con Waves
10 min readJul 13, 2019

Módulo #3 Introducción a los Contratos y Cuentas Inteligentes

¡Hola!

Bienvenido al Modulo 3 de “Dominando Web3.0 con Waves”.

En este módulo hablaremos sobre contratos inteligentes, cómo funcionan y cómo usarlos para implementar nuestra aplicación descentralizada Web3: Coupon Bazaar.

Temas de este módulo:

3.1 Descripción general

3.2 Introducción a los Contratos Inteligentes

3.3 Contratos y Cuentas inteligentes en Waves

3.4 Problemas de seguridad y cuentas inteligentes de firma múltiple

3.5 Cuentas inteligentes y aplicaciones descentralizadas (dApps)

3.6 Práctico: “Coupon Bazaar”

¡Que lo disfrutes!

¡Empecemos!

Los contratos tradicionales representan un acuerdo entre al menos dos partes involucradas (participantes). Estos acuerdos son validados y ejecutados por un tercero, ya sea un intermediario legal o gobierno. Estos intermediarios son clave para garantizar la validación de las condiciones del contrato, y también para evaluar las circunstancias y eventos que podrían afectar la ejecución del contrato.

A pesar de que comparten términos similares, los Contratos Inteligentes no son contratos siguiendo la definición de un “acuerdo entre dos partes”. Un contrato inteligente es un protocolo de computadora (código fuente o programa) que se puede ejecutar dentro de un entorno distribuido como una red blockchain. Todas las operaciones, incluidos los resultados de ejecución, se almacenan dentro de la cadena de bloques.

En esta definición, un contrato inteligente no es un contrato entre partes, sino un protocolo de cooperación entre usuarios, usuario y computadora o incluso computadora y computadora, de acuerdo con las reglas previamente definidas en el código fuente del contrato inteligente.

Un contrato inteligente es un código de programa de computadora. Es un conjunto de instrucciones que incluye diferentes comprobaciones y validaciones, operaciones de lectura y escritura de datos, operaciones de activos digitales (como transferencias, emisión, quema, congelación, etc.).

Recuerde que la tecnología principal para Web3.0 es una cadena de bloques o, de forma más general, DLT (Distributed Ledger Technology), que permite la ejecución de contratos inteligentes en cientos de máquinas simultáneamente.

Los contratos inteligentes ofrecen varias características interesantes:

- No intermediarios

- Almacenamiento seguro de activos digitales

- El codigo es ley

- Copias de seguridad predeterminadas

- Evita errores humanos.

- Ejecución sin necesidad de confianza (Trustless)

- Ejecucion autonoma

Es posible que algunos de ustedes hayan escuchado sobre los contratos Ricardianos, una innovación creada en los años 90.

Es una forma digital de contratos tradicionales. Un contrato Ricardiano tiene dos partes: términos legibles por humanos y componentes legibles por máquinas. Las firmas digitales y la automatización operativa se utilizan aquí. Los contratos Ricardianos todavía se consideran contratos tradicionales a pesar de su naturaleza digital debido a su necesidad intrínseca por poder legal, ausente en los contratos inteligentes.

Los contratos inteligentes Ricardianos son la mejor combinación de ambos.

Diferentes plataformas DLT poseen diferentes enfoques para el desarrollo de Contratos Inteligentes.

Los contratos inteligentes Waves están representados por dos tipos diferentes: cuentas inteligentes (Smart Accounts) y activos inteligentes (Smart Assets). Practicaremos con activos inteligentes más adelante en este curso.

Cualquier cuenta de Waves se puede convertir en una cuenta inteligente aplicando un script de cuenta especial. Un script de cuenta es un código de programa escrito en el lenguaje RIDE desarrollado por Waves, que contiene un conjunto de condiciones que permiten o deniegan diferentes tipos de transacciones salientes.

Técnicamente hablando, la creación y el despliegue de los contratos inteligentes de Waves tienen varias etapas:

Escritura del código RIDE, compilación, generación de una transacción de script de conjunto, validación por al menos un nodo, conjunto de UTX entre todos los nodos e inserción del script de transacción en el siguiente bloque.

En una descripción más precisa, hay algunos pasos más:

- Waves IDE valida el código RIDE

- El código RIDE se compila en una secuencia de símbolos compatibles con el formato base64

- La transacción set-script se usa para enviar el código compilado a un nodo de la blockchain

- Se comprueba la deserialización y la sintaxis, nombres y variables, invocaciones de funciones.

- Verificacion de cálculo de costes, tipo de transaccion y firma.

- Después de que el primer nodo haya completado la comprobación y validación, la transacción set-script se pasa al subgrupo internodos UTX

- Todos los demás nodos verifican los pasos de deserialización y calculos de costos computacionales realizados

- Los nodos mineros realizan la deserialización y la verificación de costos computacionales antes de validar e insertar un nuevo bloque en la cadena de bloques.

- Después de recibir un nuevo bloque, todos los nodos realizan los pasos de deserialización y costo computacional

- Ahora el script se ejecuta en todos los nodos y participa en la validación de todas las transacciones salientes desde la cuenta inteligente

Un script inteligente permite o niega algunas transacciones salientes dependiendo de ciertas condiciones. Esta lógica depende de varias fuentes de datos: datos de cuenta, datos de transacción, estado e informacion de la cadena de bloques.

¿Cuál es la diferencia entre una cuenta estándar y una cuenta inteligente?

Una cuenta estándar puede ser firmada solo por su dueño, debido a que puede usar su clave privada y semilla (SEED) para firmar todas las transacciones salientes. Otro usuarios no puede nusar su clave privada para firmar digitalmente transacciones de otras cuentas si es que no le pertenecen a dicho usuario. Bob no puede firmar una transacción desde la cuenta de Alice y viceversa.

Pero Alice puede configurar un script en su propia cuenta creando una cuenta inteligente a partir de su cuenta estándar. Para hacer eso, Alice debe firmar primero la transacción de set-script.

Cuando una cuenta estándar se convierte en una cuenta inteligente, cualquiera puede firmar ciertas transacciones salientes, según la lógica del script inteligente.

¡Hablemos de temas de seguridad!

Las condiciones estipuladas en el script de la cuenta deben cumplirse antes de permitir cualquier tipo de transacciones salientes, por ejemplo, el script define a los usuarios que pueden firmar transacciones salientes (sea uno o multiples usuarios). ¡Este es un momento muy crítico! Porque es el lugar más popular para las vulnerabilidades de seguridad.

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

Aquí los usuarios están buscando cupones de descuento para bienes y servicios y pueden comprarlos por un pequeño precio en el mercado.

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

“Coupon Bazaar” es un mercado que proporciona sistemas de pago, configuración cliente-proveedor y coordinacion de servicios de entrega entre proveedores y clientes.

Funcionalidad para proveedores:

  • Un sistema de registro de proveedores.
  • Gestión de artículos
  • Confirmación de compra

Funcionalidad para Clientes:

  • Encontrar cupones
  • Comprar cupones

Para trabajar con un almacenamiento de datos descentralizado mediante el uso de transacciones de datos (data transaction), debemos permitir que los Proveedores realicen transacciones de datos (data tx) y rechazar toda otra transaccion exceptuando las transacciones set-script

La transaccion Set-script es necesaria para que podamos actualizar la lógica de la cuenta inteligente en el futuro. Por favor, preste atención a esta vulnerabilidad: Ahora, cualquier usuario puede firmar las transacciones salientes, incluso actualizar la lógica de la cuenta inteligente.

Cualquiera es capaz de cambiar el script de la cuenta y retirar todos los fondos despues de eso.

Para permitir que solo el propietario de la dApp cambie/actualice el script, deberíamos utilizar la funcion sigVerify. Usando esta función podemos verificar que una firma, de un conjunto de firmas llamadas pruebas, pertenece al propietario de la dApp.

Podemos usar la función sigVerify en un matcher dentro de la función verify(). sigVerify devuelve un valor booleano TRUE cuando el propietario de la dApp firma la transacción y FALSE de lo contrario.

Veamos el ejemplo clásico de uso de Cuentas Inteligentes que permite aumentar la seguridad en el almacenamiento de activos digitales, una cuenta de firma múltiple (multi-sig).

Por ejemplo, nuestros proveedores son pequeñas empresas que constan de varios fundadores o administradores (tres en nuestro caso). Para retirar fondos de la cuenta multisig, se requieren al menos dos de las tres firmas para realizar una transacción de transferencia saliente.

Esta cuenta multisig también protege a la tienda en línea de ataques. Por ejemplo, cuando la clave privada o semilla (SEED) de un propietario ha sido comprometida o ha sido robada.

Para implementar una cuenta de firma múltiple con al menos dos firmas, debemos declarar las claves públicas de los firmantes de la cuenta. Los participantes deben poder firmar transacciones en un conjunto diferente de pedidos, por lo que todas las combinaciones deben ser posibles de verificar.

Para firmar una transacción varias veces, debemos pasar el objeto JavaScript varias veces a través de la misma función. Por ejemplo, a través de una función de transferencia en nuestro caso.

¡Hablemos de aplicaciones descentralizadas!

En nuestra aplicación Web3.0, el Proveedor debe poder confirmar las compras. Veamos cómo automatizar esto.

Usando contratos inteligentes podemos construir aplicaciones descentralizadas Web3.0.

Las aplicaciones descentralizadas (dApps) son aplicaciones que se ejecutan en una red de computadoras P2P en lugar de en una sola computadora. Las dApps han existido desde la aparición de las redes P2P. Son un tipo de programa de computadora diseñado para existir en la Internet de una manera que no este controlada por una sola entidad. Las aplicaciones descentralizadas no necesariamente tienen que ejecutarse sobre una red blockchain. BitTorrent, Popcorn Time, BitMessage, Tor, son todas dApps tradicionales corriendo un una red P2P, pero no en una Blockchain (que es un tipo específico de red P2P).”

Pero en nuestra definición: las dApps son websites con funciones blockchain habilitadas, donde un Smart Contract es lo que les permite conectarse a la blockchain. La forma más fácil de entender esto es entender cómo funcionan los sitios web tradicionales., como con nuestra dApp “Coupon Bazaar” que integra la cadena de bloques Waves y la extensión del navegador Waves Keeper.

Para facilitar el proceso de desarrollo de dApp por parte de los desarrolladores, el lenguaje de contrato inteligente RIDE-Waves tiene dos tipos de funciones:

@Verifier y @Callable.

Ya estamos familiarizados con @Verifier.

Las funciones @Callable pueden ser invocadas por usuarios externos (no solo por el creador de la dApp). Como resultado de la ejecución, nueva información puede ser insertada o actualizada en el almacenamiento de datos de la dApp (key-value) y/o los fondos pueden ser transferidos desde el saldo de la dApp a la persona que invoco la transaccion o a otra dirección dependiendo de la logica del script de la dApp’s.

En nuestro caso, una dApp y/o una cuenta inteligente son la misma entidad..

Los usuarios pueden llamar funciones @Callable en un proceso llamado invocation. Las funciones @Callable pueden ser utilizadas con invokeTransaction. La información obtenida de los parametros de invokeTransaction pueden tambien ser utilizados en un Smart Contract, for example, some payment information, including amount and payment currency (token).

En el ejemplo del Coupon Bazaar, vamos a crear una función de compra purchase() permitiendo compras por parte de los clientes y confirmando ventas de cupones a los proveedores.

Debido a esto, el precio de los items (item_prices) debe ser almacenado usando el key-value del almacenamiento de la dApp (key: item_A_coupon_price).

Luego podemos extraer los precios de los artículos usando la función getInteger().

Un cliente debe pagar la cantidad exacta para comprar un cupón; de lo contrario, el contrato inteligente generará una excepción con una descripción del error.

Como puede ver, una compra se confirmará automáticamente después de la ejecución de la función de compra purchase().

Todos los registros se almacenan en el almacenamiento key-value de la dApp. Estos datos se escriben utilizando la función WriteSet(). El contrato inteligente puede leer y reescribir estos datos durante la ejecución.

Para invocar (@Callable) la función purchase() debemos usar un nuevo tipo de transacción invokeScript() y ejecutarlo en JavaScript.

Podemos usar cualquier parametro key-value en el array de argumentos y detalles de pago. Para especificar qué función se ejecutará debemos usar el nombre de la función @Callable (i.e. purchase) y especificar la direccion de la cuenta dApp (o alias).

Así que estos son los aspectos básicos de los contratos inteligentes y su implementación en Waves.

Le deseamos buena suerte con el “Desafio de codigo”!

¡Que lo disfrutes!

--

--

Kolin Platform
Dominando Web3.0 con Waves

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