Una vaca inteligente
Como hacer un crowdfunding con smart contracts.
El futuro sin duda es el dinero programable y una de las cosas que tal vez te interese programar es un crowdfunding a la medida de tus necesidades .
Para ejemplificar , supongamos que Ana necesita organizar a sus vecinos para que paguen a una compañía que pinte el edificio donde todos viven, ósea quiere hacer una vaca. Juntar dinero de los vecinos no es una tarea fácil, algunos vecinos incluso le piden a Ana como condición para aportar, estar seguros que otros vecinos aporten primero. Ana sabe que se necesita un monto mínimo para que se haga la obra y que si falla en la tarea de recaudar el total tendrá que devolver el dinero a los que sí aportaron. Ana ha escuchado que con Blockchain y Contratos Inteligentes todo esto puede automatizarse y se le ocurre pedirle ayuda a Beto que es experto en el tema. A continuación se describe el proceso para implementar esto en Stellar.
¿Por qué smart contracts?
Los smart contracts eliminan la necesidad de confiar en una persona cumplirá todo aquello a lo que se ha comprometido (y que normalmente se estipula en costosos contratos tradicionales). En este caso, los vecinos tienen que confiar en que Ana no se va robar el dinero, también tienen que confiar en su administración: si no se junta el mínimo en la vaca, Ana devuelve el dinero a los participantes. Este Contrato Inteligente elimina esa necesidad de confiar en Ana, también ayuda a dar a todos visibilidad de cuando se realiza cada aportación y asegurarse de que el proveedor del servicio recibió su pago en tiempo y forma. Es fácil imaginar cómo esta tecnología podría ayudar a prevenir actos de corrupción y malos manejos de recursos y generar grandes ahorros al no requerir auditorías, abogados y contratación de fiduciarios para manejar nuestras finanzas personales y colectivas. Los contratos inteligentes bajan el costo de realizar negocios.
Implementación de una vaca inteligente en Stellar
Ana le pide a Beto que construya un contrato inteligente para administrar la vaca usando Stellar ya que sabe que la wallet que ella utiliza smxwallet.com esta construida sobre Stellar. También se requiere que cada participante tenga una cuenta similar que utilice Stellar. Una cuenta Stellar, en esencia es un par de llaves (una pública y una privada) que se necesita para tener dinero en el libro contable de la red de Stellar . También se necesita determinar en qué moneda se realiza este financiamiento colectivo, en este caso se utiliza SMX que provee la empresa Saldo.mx (smx.saldo.mx). 1 SMX es igual a 1 Peso Mexicano y Saldo.mx provee el mecanismo para convertir dinero en una cuenta bancaria a dinero en Stellar. Para este contrato inteligente se necesitan: la cuenta de Ana [A] , la cuenta de Beto [B], la cuenta concentradora [C] donde se van a recibir los fondos
A. Cuenta Ana (Llave pública)
GDNMSLV6N5EVEDPXODQOIBKGIJUJUFK2DQFMNJWLZFQKILOHYKP3NANA
B. Cuenta Beto (Llave pública)
GCNKUIVXASBICDDCZXD4BGRXTLV467MCYP3UAOG44EZBLALHEMKZBETO
C. Cuenta Concentradora (Llave pública)
GBRPR55UUW6BK4DZLZVCMWXHGCINA3ELKRVBGHXKXWLEDUNPR62UVACA
A Beto se le ocurre configurar un servicio de intercambio de tokens de participación por cada aportación para administrar el proceso de aportaciones. Estos tokens de participación (VACA) serán emitidos por esta cuenta [C] y deben tener un límite estricto en su emisión. Esto quiere decir que una vez que se “impriman” estos tokens debe destruirse la impresora para que no puedan existir más tokens.
Puedes ver la emisión de estos tokens VACA en este explorador de Stellar
En la implementación de Beto, se contempla un mecanismo para además de devolver las aportaciones en caso de que no se junte el monto objetivo que garantiza que estos tokens de participación (VACA) se pueden intercambiar por dinero.
Toda esta implementación se tiene que modelar en transacciones de Stellar que es la única forma de programar contratos inteligentes en la red de Stellar. Es decir mediante el diseño de una secuencia de transacciones de Stellar se debe lograr estipular todas las condiciones del contrato.
Transacciones
5 Transacciones de Stellar se requieren para estructurar esta vaca inteligente. Una transacción de Stellar en esencia es una modificación al libro contable de Stellar que se encarga de guardar balances y ofertas de compra y venta. Cada transacción tiene un número de secuencia para organizar el orden. Es decir, es posible estipular que una transacción solo suceda (haga modificaciones) solo después de que otra suceda. Cada transacción puede incluir una o varias operaciones. Las operaciones son las funciones que soporta la red de Stellar. (Pagos, creación de ofertas de compra y venta, cambios en configuración de cuentas etc.) Una transacción de Stellar se puede armar y no necesariamente enviar a la red de Stellar para que realice los cambios, sino guardar para el futuro. Una transacción es entonces técnicamente un objeto con ciertos atributos ( Account, Sequence Number, Operations, Signers y otros) que indican a la red cuales son las modificaciones requeridas. Sin firma Stellar simplemente rechaza las transacciones.
Sobre la notación para describir las transacciones del contrato se tiene que tomar en cuenta lo siguiente:
- N, M — representan los números de secuencia de las transacciones de Beto y la cuenta concentradora respectivamente. N+1 significa una transacción subsecuente a N
- V — Monto mínimo que se necesita para pintar el edificio.
- X — Precio unitario al que se van a vender los tokens de participación denominados (VACA)
Una cuenta [D] corresponde al destino de los fondos. En este caso [D] es la cuenta de Stellar de la compañía que se encargará de pintar el edificio.
Beto encargado del diseño de estas transacciones, le plantea a Ana como solución la siguiente secuencia de transacciones, la cuales aunque se firman no se envían a la red inmediatamente como veremos a continuación, únicamente se estructuran y firman para tener listo el contrato.
Transacción 1: Creación de cuenta concentradora
Esto consiste en simplemente transferir un balance inicial en XLM a la cuenta [C] para que exista dentro de la red de Stellar
En este ejemplo se puede ver esta creación al transferir 3 XLM desde una cuenta existente ya en Stellar
Después de la transacción 1la cuenta [C] va a tener suficiente XLM para cubrir los gastos de las operaciones en las que participe dentro de la red de Stellar.
Transacción 2: Agregar firmantes
Esta transacción remueve a la cuenta [C] como firmante de su propia cuenta pero añade como firmantes a Ana y a Beto. Ana y Beto serán los únicos que pueden firmar transacciones (2 de 2 multisg) que correspondan a esta cuenta.
Las operaciones son
- Set Option — Signer: Añade a Ana como firmante de las transacciones de la cuenta concentradora con peso 1 ( Weight: 1 )
- Set Option — Signer: Añade a Beto com firmante de las transacciones de la cuenta concentradora con peso 1 ( Weight: 1 )
- Set Option — Thresholds & Weights: Remueve a llave privada original y cambia los pesos para siempre pedir todas las firmas (2 de 2).
Esta Transacción con secuencia N se podría hacer en varios pasos. Las 3 operaciones pueden consolidarse en una o varias transacciones. Como ejemplo puedes ver esta Transacción que tiene 1 de las 3 operaciones necesarias donde añade a Ana como firmante.
https://stellar.expert/explorer/public/tx/129544137862156288#129544137862156289
Transacción 3: Empieza la vaca
Esta Transacción con secuencia N+1 crea una oferta del token VACA contra aportaciones de fondos . Se usa la operación Manage Sell Offer y la tendrán que firmar Ana y Beto que son los nuevos firmantes (2/2) de la cuenta [C]
La Transacción 3 se crea y envía a la red para empezar la vaca. Crea una oferta en la red donde se ponen en venta tokens de participación a un precio de X por token. Dada la limitada cantidad de tokens, los tokens se valúan para que un total V pueda ser reunido después de la aportación de todos los vecinos .
Transacción 4: Se junta suficiente en la vaca para pintar
Consiste en un pago (Payment) que envía los fondos recaudados V a la cuenta destino para empiece la obra (D) y tiene una secuencia N +2. Debe llevar una restricción en los tiempo en el que esta transacción es válida. Esta restricción se plasma mediante el atributo Time Bounds en el cual se estipula que esta transacción se debe aceptar en la red de stellar a partir del fin de periodo de recaudación de fondos. Como la cuenta origen es [C], esta transacción tiene que ser firmada por Ana y Beto
Transacción 5: No se junta suficiente en la vaca
Tiene una secuencia N+3 y consiste en dos operaciones
- Manage Sell Offer — Cancel: Cancela la oferta de vender tokens de participación.
- Manage Buy Offer: Cuenta concentradora compra los tokens de participación a un precio unitario de X por token.
Y las siguientes restricciones de tiempo
Time Bounds:
- Minimum Time: Fin del periodo de recaudación
- Maximum Time: 0
Y al igual que la transacción 4, la cuenta origen es [C], esta transacción tiene que ser firmada por Ana y Beto
las transacciones 4 y 5 son firmadas previamente, no publicadas. Se crean (estructuran) y guardan sin ser enviadas a la red. Pueden ser enviadas a la red una vez que el periodo de crowdfunding haya concluido como lo estipularon Ana y Beto
Después de este periodo pueden ser enviada a la red por quien sea pues ya están firmadas. La transacción 4 transfiere los montos totales a la cuenta destino D. La transacción 5 previene que los tokens restantes se vendan al cancelar la oferta y permite a los participantes crear ofertas para vender sus tokens de participación a la cuenta [C] .
La seguridad de provee a través de la secuencia de las transacciones El número de secuencia de la transacción 4 es N+2 y el número de secuencia de la transacción 5 es N+3, Esto quiere decir que la red de Stellar no puede aceptar primero a la transacción 5
La vaca fracasa cuando no se juntan los fondos suficientes para la fecha estipulada y esto equivale a que no se venden los tokens de participación. La transacción 4 que ya estructurada se envía a la red pero no realiza las modificaciones que estipulan las operaciones. La cuenta [C] que tiene suficiente XLM para pagar los fees de la Transacción va a ser considerada por el mecanismo de consenso de Stellar y el número de secuencia se va a consumir pero se va a producir un error ya que el monto estipulado de la transacción no se puede cubrir.
La Transacción 5 se envía a la red, lo que permite que aquellos que sí contribuyeron y tienen los tokens de participación los puedan vender. Adicionalmente esta transacción cancela la capacidad de la cuenta [C] de seguir vendiendo tokens de participación.
La vaca se considera un éxito si se junta la cantidad total en el tiempo estipulado. y quiere decir que se venden todos los tokens de participación que mantenía la cuenta [C]. En ese caso cuando la Transacción 4 se envía a la red de Stellar, se acopla correctamente y se puede realizar el pago. Después la Transacción 5 se envía a la red pero fallará pues no tendrá los fondos para comprar los tokens de participación y los participantes no podrán intercambiar esos tokens de participación por su aportación a la vaca.
Para los participantes
Existen ciertas cosas que los participantes deben hacer previamente y durante la campaña:
- Crear trustline con la cuenta concentradora y con el emisor de SMX
Una trustline se requiere extender de la cuenta del participante a la cuenta [C] para que se pueda transaccionar con tokens de participación VACA y otra trustline con el emisor de SMX.
- Crear buy offer para comprar tokens de participación.
El participante recibirá tokens de participación a cambio de participación durante la campaña.
- Si la vaca es un éxito: nada. Si no, crear sell offer para vender los tokens de participación y recuperar su dinero.
Conclusiones
Si bien es no trivial el implementar contratos inteligentes, claramente utilizar blockchain como tecnología para los servicios financieros trae una serie de beneficios que transformará la forma de utilizar nuestro dinero, empezando por bajar los costos y protegernos de riesgos que hoy en día son muy difíciles de mitigar, atacando uno de los principales problemas de países latinoamericanos que es el fraude. Si tienes dudas sobre este tema por favor escríbenos a info@saldo.mx