Cuentas y activos inteligentes de Waves y su aplicación

Alejandro Escandon
8 min readJul 11, 2019

De subastas a esquemas de fidelización de clientes

Blockchain se asocia a menudo solo con criptomonedas, pero el alcance de la tecnología DLT (tecnología de registro distribuido) es mucho más amplio. Una de las áreas más prometedoras para el uso de la blockchain o cadena de bloques son los contratos inteligentes: código que se ejecuta automáticamente y que no requiere confianza entre las partes que lo acuerdan.

RIDE: un lenguaje de contrato inteligente

Waves ha desarrollado un lenguaje especial para contratos inteligentes: RIDE. Su documentación completa está aquí.

Un contrato basado en RIDE es una función que devuelve “verdadero” o “falso” como resultado. En consecuencia, la transacción se registra en la cadena de bloques o se rechaza. Un contrato inteligente garantiza plenamente la ejecución de las condiciones establecidas en él. La generación de transacciones de contratos inteligentes en RIDE ya es posible a partir del día 10 de julio 2019 que se ha activado en la mainnet.

Actualmente, Waves ofrece dos tipos de contratos inteligentes, cuentas inteligentes y activos inteligentes. Una cuenta inteligente es una cuenta de usuario común, para la cual se puede configurar un script que controla todas las transacciones. El script de una cuenta inteligente podría verse, por ejemplo, así:

match tx {
case t: TransferTransaction | MassTransferTransaction => false
case _ => true
}

tx es una transacción a la cual se le da permiso de ejecución, utilizando la herramienta de coincidencia de patrones. La coincidencia de patrones en RIDE se utiliza para verificar el tipo de transacción. Ver tipos de transacciones existentes aquí. En un script de una cuenta inteligente se pueden procesar todos los tipos de transacciones existentes. En el ejemplo anterior se permiten todas con excepción de las transacciones de transferencia

case t: TransferTransaction | MassTransferTransaction => false

Un script también puede usar variables, y declaraciones “if-then-else” para la verificación de las condiciones. Para facilitar la probable terminación del contrato y que su complejidad (costo), sea fácil de predecir antes de comenzar la ejecución del contrato, RIDE no contiene bucles ni operadores de salto (es un lenguaje que no es turing completo).

Entre las otras características de las cuentas de Waves está el estado. Se puede agregar un número indefinido de pares (clave, valor) al estado de una cuenta usando DataTransactions. Posteriormente, esa información se puede procesar a través de la API REST o directamente en el contrato inteligente.

Cada transacción puede contener un arreglo (array) de pruebas (proofs) en las que se puede ingresar la firma del participante, el ID de la transacción, etc.

El uso de RIDE en la IDE https://ide.wavesplatform.com/ permite la visualización de la vista compilada de un contrato inteligente (siempre que se pueda compilar), la creación de nuevas cuentas y la configuración de scripts para estas, así como el envío de transacciones a través de la línea de comandos.

Para un ciclo completo que incluye crear una cuenta, agregarle un contrato inteligente y enviar una transacción, se puede usar una biblioteca con la API REST (como C #, C, Java, JavaScript, Python, Rust o Elixir). Para comenzar a usar IDE, simplemente presione el botón NUEVO.

Las posibilidades de aplicar contratos inteligentes son amplias: desde prohibir transacciones para direcciones específicas (“lista negra”) hasta dApps (aplicaciones) complejas.

Ahora consideraremos varios ejemplos específicos de aplicaciones de contratos inteligentes en negocios, como subastas, seguros y programas de lealtad de clientes.

Subastas

La transparencia es una de las condiciones necesarias para que una subasta sea exitosa: los participantes deben asegurarse de que la manipulación de la oferta sea imposible. Esto se puede lograr gracias a una cadena de bloques (blockchain) en la que todos los participantes disponen de datos inmutables para todas las ofertas y los tiempos en que se realizaron.

En la cadena de bloques de Waves, las ofertas se pueden registrar en el estado de la cuenta de la subasta utilizando DataTransactions.

Además, las horas de inicio y finalización de la subasta se pueden establecer utilizando números de bloque, ya que la frecuencia de generación de bloque de Waves es de aproximadamente 60 segundos.

Subasta inglesa (de precio ascendente)

En una subasta inglesa, los compradores hacen ofertas o apuestas, compitiendo entre sí para establecer el precio más alto. Cada nueva oferta debe superar la anterior. La subasta termina cuando ya no hay nadie dispuesto a exceder la última oferta. Si ningún competidor desafía la oferta actual dentro de un marco de tiempo determinado, el oferente que la colocó se convierte en el ganador. En este caso, el participante que realizó la oferta más alta debe proporcionar la cantidad indicada. La subasta inglesa es la subasta tradicional.

También hay una opción de subasta en la que el vendedor establece un precio mínimo para un artículo, y el precio final debe excederlo. De lo contrario, el artículo queda sin vender.

En este ejemplo, mostramos una cuenta inteligente creada específicamente para una subasta. El marco de tiempo de la subasta es igual a 3,000 bloques y el precio inicial es igual a 0,001 Waves. Un comprador puede hacer una oferta enviando un DataTransaction con la llave “price” (precio en inglés) y el valor de su oferta. En la transacción, debe agregar la clave pública y la firma del remitente.

El precio de cualquier oferta nueva debe ser superior al precio actual, y el oferente debe tener al menos una cantidad de tokens en su saldo que supere el valor del nuevo precio + la comisión. La dirección del oferente se agrega al campo “remitente” en la DataTransaction y el número del bloque debe estar dentro del marco de tiempo de la subasta.

Al final de la subasta, el participante nombrado como mejor postor, paga el artículo con un ExchangeTransaction que especifica el precio y el par del activo.

Subasta holandesa (precio decreciente)

En la subasta holandesa o subasta inversa, el artículo se ofrece inicialmente a un precio superior al que el comprador está dispuesto a pagar. El precio disminuye paso a paso hasta que uno de los participantes acepte el precio actual o hasta que se llega al precio de reserva, que es el precio mínimo aceptado para esa venta.

En este ejemplo, usamos las mismas herramientas que en la anterior, y también agregamos un delta para disminuir el precio paso a paso. El script de la cuenta comprueba si el participante es el primero que realizó la apuesta al precio ganador actual. De lo contrario, no acepta la transacción (DataTransaction).

Subasta de pago total o americana.

Se trata de una subasta ascendente al uso, solo que con la particularidad de que todos los postores deben pagar la oferta que hacen, pero sólo la puja más alta es la ganadora. Es realmente peligrosa para un inexperto, porque podemos acabar pagando mucho por nada.

Una subasta de pago total es una subasta en la que todos los licitantes pagan, independientemente de quién gane el artículo. Cada nuevo postor tiene que pagar su oferta, y el mejor postor gana el artículo, como en una subasta convencional.

En nuestro ejemplo, cada participante realiza una oferta enviando un DataTransaction con (clave, valor) * = (“ganador”, dirección), (“precio”, precio). La Transacción de datos de un oferente solo se aprueba si ya existe una TransferTransaction firmada por ellos y la oferta es más alta que las ofertas anteriores. La subasta se ejecuta hasta que se alcanza el bloque final de la subasta.

Seguros / Crowdfunding o red de financiación colectiva.

Considere la situación en la que necesitamos asegurar los activos de los usuarios contra pérdidas financieras. Por ejemplo, el usuario desea obtener una garantía de que, en caso de una depreciación del token, podrá recuperar el monto total pagado por estos tokens, y está listo para pagar una prima de seguro para ello.

Para tal efecto, se emitirán “tokens o fichas de seguro”. Luego se aplica un script a la cuenta del asegurado o titular de la póliza, lo que permite que solo se ejecuten las transacciones ExchangeTransactions que cumplan ciertas condiciones.

Para evitar el doble gasto, el usuario asegurado inicialmente debe enviar un DataTransaction a la cuenta del asegurador con (clave, valor) = (purchaseTransactionId, sellOrderId) y prohibir el envío de DataTransactions con las mismas claves ya utilizadas.

Por lo tanto, las pruebas del usuario (proofs) deben contener el ID de la transacción para la compra del token del seguro. El par del activo (asset) debe ser el mismo que en la transacción de compra. El costo debe ser igual al fijado en el momento de la compra, menos el precio de la prima del seguro.

La cuenta del asegurador más tarde comprará los tokens del seguro al usuario a un precio no inferior al precio de compra. La cuenta del asegurador creará una transacción de intercambio ExchangeTransaction y el usuario asegurado firmará el pedido (si la transacción es correcta). La cuenta del asegurador firmará el segundo pedido y la transacción se completa, y se enviará a la cadena de bloques.

Si no se realiza ninguna compra, el usuario puede crear una transacción de intercambio ExchangeTransaction en las condiciones establecidas en el script y enviar la transacción a la cadena de bloques. De esa manera, el usuario recuperará los fondos gastados para la compra de los tokens asegurados.

Un token de seguro puede convertirse en un activo inteligente, por ejemplo, para prohibir su transferencia a terceros.

Este esquema también se puede implementar para las fichas de crowdfunding, que se devuelven a los propietarios si no se ha cobrado la cantidad requerida.

Impuestos de transacción

Los contratos inteligentes también son aplicables en los casos en que es necesario recaudar impuestos de cada transacción con los activos. Esto se puede hacer a través de un nuevo activo con patrocinio (sponsored transactions) para las transacciones con Activos inteligentes:

1. Lanzamos FeeCoin, que se enviará a los usuarios a un precio fijo: 0.01 Waves = 0.001 FeeCoin.

2. Se establece el patrocinio de FeeCoin y el tipo de cambio: 0,001 Waves = 0,001 FeeCoin.

3. Se le añade el siguiente script para convertirlo en un activo inteligente:

Ahora, cada vez que alguien transfiere N activos inteligentes (smart assets), le enviará FeeCoin en la cantidad de N / taxDivisor de FeeCoin (que puede comprarle a usted a 10 * N / taxDivisor WAVES), y le dará al Minero N / taxDivisor WAVES. Como resultado, su ganancia (impuesto) será de 9 * N / taxDivisor WAVES.

También puede aplicar impuestos utilizando el script de activos inteligentes y MassTransferTransaction:

Devolución de parte del dinero y programas de fidelización.

La devolución o reembolso en efectivo (cashback) es un tipo de esquema de lealtad del cliente en el cual un porcentaje de los fondos gastados en bienes o servicios se devuelve al cliente.

Al implementar esto con una cuenta inteligente, debemos verificar las pruebas tal como lo hicimos en el caso del seguro. Para evitar el doble gasto, antes de cobrar un reembolso, un usuario debe enviar un DataTransaction con (clave, valor) = (purchaseTransactionId, cashbackTransactionId).

Además, debemos prohibir la configuración de DataTransactions con las mismas claves. cashbackDivisor es un número inverso para una acción de devolución de dinero. Si el valor de la devolución de efectivo es 0.1, el CashbackDivisor será 1 / 0.1 = 10.

Intercambio atómico (atomic swap)

El intercambio atómico permite a los usuarios intercambiar activos sin utilizar casas de cambios (exchanges). En un intercambio atómico, se requiere la aprobación de la transacción por parte de ambos participantes dentro de un marco de tiempo específico.

Si al menos uno de los participantes no aprueba la transacción dentro del plazo especificado, la transacción se cancela y no se produce ningún intercambio.

En nuestro ejemplo, usamos un script de cuenta inteligente:

En un próximo artículo, se verán las cuentas inteligentes aplicadas en herramientas financieras, como opciones, futuros y letras de cambio.

Traducción de los artículos originales en Применение смарт-аккаунтов Waves: от аукционов до бонусных программ y Application of Waves Smart Accounts: from Auctions to Customer Loyalty Schemes.

--

--