Money for Developers: Creando tu primera transacción en Stellar

Ernesto Garcia N
Blockchain Academy Mexico
10 min readJan 12, 2020

Blockchain for Money

Bitcoin no sólo llegó al mundo para presentarnos la tecnología detrás: Blockchain. Si no que también abrió las puertas del trading para muchas personas que hicieron sus primeras transacciones con alguna criptomoneda, y trayendo consigo portafolios de inversión, inversionistas, especuladores y muchos otros modelos de negocio relacionados.

Personalmente, como Blockchain Developer, hago un esfuerzo importante por evitar relacionarme muy a fondo con el mundo del trading, porque estoy convencido de que la verdadera importancia está en el desarrollo de la tecnología, y siempre es mejor pensar en las ventajas de Blockchain como una herramienta para desarrollar soluciones para distintas industrias, desde cadena de suministros hasta confidencialidad de datos médicos.

(fuente: https://stellar.org)

A final de cuentas, a pesar de que la primera categoría relevante de aplicación de Blockchain fue el intercambio de valor, aún no hemos logrado masificar su uso, por lo que es difícil llevar esta tecnología a casos de uso del mundo real, gracias a los costos de comisiones para los mineros, o el tiempo que tarda en confirmarse una transacción.

Siendo Blockchain For Money la principal categoría de uso de esta tecnología, Stellar hace una propuesta interesante para solucionar los problemas del intercambio de valor que suelen existir desde el lado del desarrollo de software.

¿Qué es Stellar?

Stellar es un sistema de pagos basado en Blockchain, open-source, developer friendly, descentralizado y multi-currency, con el cual se pueden distribuir tokens, realizar pagos, y hacer operaciones de trading a un costo mucho más bajo y con un protocolo de consenso extremadamente más eficiente que el Proof of Work.

Stellar provee una solución interoperable basada en Blockchain (fuente: https://stellar.org)

Stellar fue construido con dos características principales que, desde mi punto de vista, aportan mucho valor, y crean un abanico de posibilidades importante para desarrollar soluciones financieras:

  • Interoperabilidad entre diversas divisas: Con Stellar es posible no sólo enviar transacciones en criptomonedas sino también en moneda FIAT, utilizando un mecanismo basado en Anchors, que son entidades que proveen liquidez entre activos, haciendo posible una transferencia — por ejemplo de MXN a EUR — en pocos segundos y con una comisión ridículamente baja (0.000001 XLM ~= 0.00001 MXN)
  • Excelente developer experience: La tecnología de Stellar fue pensada tomando en cuenta a los desarrolladores ante todo, por lo que su documentación es bastante extensa, completa, y perfecta para desarrollar wallets, exchanges descentralizados, sistemas de pago, etc. Incluso, existe una lista pública de sugerencias de desarrollo que publica Stellar, y la puedes encontrar aquí.
XLM a MXN a 11 de Enero de 2020 en https://coinbase.com

Ante este panorama, estoy convencido de que Stellar es la opción indicada para desarrollar pensando en sistemas de pagos, y creo que aún existe mucho por hacer, por lo que, sin más que añadir, te enseñaré cómo realizar tu primera transacción de Stellar en un proyecto básico utilizando node.

Nota: Si aún no tienes node en tu computadora, te recomiendo que vayas a https://nodejs.org/ e instales la versión LTS (Long Term Support). Otra alternativa es instalarlo utilizando Brew si tienes MacOS

Configurando el proyecto

Nota: Puedes encontrar el resultado final del proyecto aquí.

Stellar tiene una interfaz HTTP para comunicarse con su infraestructura, y que es llamada Horizon, a través de la cual podemos realizar las diferentes operaciones que están disponibles. En el caso de Javascript, existe un SDK que implementa los llamados a Horizon necesarios simplificar las operaciones.

Horizon es la forma de comunicar nuestras aplicaciones con la red Stellar

Para utilizar Horizon vamos crear un proyecto en Node, con el que instalaremos de forma local el SDK de Stellar y crearemos una cuenta con la que realizaremos las transacciones dentro de su testnet.

Antes de crear nuestro proyecto, es necesario que abras una terminal Unix, y generes un directorio donde colocarlo. En mi caso, lo nombre como stellar_app

mkdir stellar_app

En seguida, crearemos un proyecto con npm utilizando el siguiente comando

npm init -y

-y es el flag que nos permitirá saltarnos el setup inicial, y dejar el default, por lo que no tenemos que hacer mayores configuraciones.

Lo siguiente que haremos será instalar los paquetes necesarios para trabajar con el ejemplo, los cuáles serán los siguientes:

  • dotenv: Nos servirá para utilizar un archivo secreto de configuración donde guardaremos nuestras llaves de acceso a nuestro wallet.
  • node-fetch: Ayudará a realizar peticiones http desde Node
  • stellar-sdk: La librería de Stellar para Javascript

Todas las podremos instalar utilizando:

npm install --save dotenv node-fetch stellar-sdk

Finalmente, podemos abrir el proyecto en cualquier editor de código que dispongamos, y encontraremos una estructura similar a esta:

Estructura inicial de archivos

Sólo como extra, y si quieres utilizar git, puedes añadir un .gitignore que contenga a los node_modules y el .env para evitar que el control de versiones verifique a estos archivos, en mi caso lo colocaré dado que dejaré el repositorio público en github.

echo “node_modules\n*.env” > .gitignore

Antes de comenzar, también te pediré que añadas estos scripts a tu package.json para que puedas utilizarlos a través de npm.:

“scripts”: {“create-pair”: “node utils/create-pair.js”,“check-balance”: “node utils/check-balance.js”,“check-recipient-balance”: “node utils/check-recipient-balance.js”,“send-transaction”: “node utils/send-transaction.js”}

Nota: En caso de no agregar esta sección a tu package.json, los comandos futuros no funcionarán, por lo que es estrictamente necesario que los añadas.

Abriendo nuestro wallet

Stellar a través de su SDK provee una forma de generar una cuenta con su llave pública y un seed secret con el cual podemos firmar transacciones. No obstante, para evitar que cualquiera genere cuentas y las utilice como SPAM para saturar, sólo permite que operen cuentas con almenos 1 XLM en su balance. Por lo tanto, se necesita hacer una solicitud de fondos de prueba para poder empezar a realizar operaciones.

El proceso de creación lo podemos hacer con el siguiente script, el cuál colocaremos en una carpeta utils dentro de nuestro proyecto, y con el nombre de create-pair.

utils/create.pair.js

Inspeccionemos el código:

La primera sección nos generará un secret y un public key desde el pair que importamos del SDK de stellar, los cuáles son sumamente importantes para realizar nuestras transacciones y operaciones, por lo que no sobra decir que el secret no debe ser revelado nunca a nadie.

En el siguiente bloque, haremos una petición al friendbot de stellar para que nos haga una transferencia por 10,000 XLM de prueba, que utilizaremos para todo tipo de tests dentro de la testnet.

El friendbot realizará una transacción, por lo que la respuesta de la misma será el comprobante de que se realizó de forma correcta.

Adicionalmente, guardaremos nuestro SECRET y nuestra PUBLIC KEY en un archivo secreto, que utilizaremos después para la transacción, y que evitará que hardcodeemos nuestras llaves dentro de la aplicación.

Para crear nuestro wallet, ejecutamos el siguiente comando con npm

npm run create-pair

Si todo sale bien, recibirás el mensaje de success en consola junto con toda la respuesta del friendbot de stellar, además de encontrar el archivo .env en tu directorio root, y que contiene tus llaves:

npm run create-pair

Revisando nuestros fondos

Ahora que ya tenemos nuestra wallet habilitada y con 100 XLM en el balance, debemos de verificar que efectivamente tenemos el balance en nuestra cuenta. Para hacerlo, debemos crear un archivo en utils con el nombre de check-balance.js

Este script es algo más simple, y lo que hace es cargar la cuenta desde la testnet de stellar utilizando el url de horizon, y después, itera por todas las cuentas asociadas al par, mostrándonos el balance en cada uno de los diferentes assets que dispongamos.

Como el friendbot sólo envió XLM, en nuestro balance veremos el key native, que se utiliza para referirse a Lumens.

Para ejecutarlo, es necesario que corramos:

npm run check-balance

Y obtendremos un resultado similar a este:

npm run check-balance

Realizando la transacción

Antes de comenzar con esta sección, decidí crear un archivo igual al anterior de check-balance.js, pero con la dirección a la que enviaremos, y que es la que Stellar proporciona en la documentación.

// Cuenta de pruebas de los docs de Stellar
GA2C5RFPE6GCKMY3US5PAB6UZLKIGSPIUKSLRB6Q723BM2OARMDUYEJ5

Edit: Stellar removió esta dirección, por lo que te recomiendo que a partir de ahora uses la siguiente en los scripts posteriores:

GDC75JQ6SOC3EJU5FL2IO6JL5Y2HUEPZQBVAM2TESCLG5NMYPSX6JJRP

Este nuevo archivo tiene la misma estructura que el anterior, sólo que utilizará únicamente la dirección hardcodeada a la cuál enviaremos XLM

Para verificar el balance de la cuenta de destino probablemente ya sabes cuál comando ejecutar:

npm run check-recipient-balance

El resultado será el siguiente:

npm run check-recipient-balance

Como puedes ver, ésta cuenta tiene más tipos de assets en su poder. No obstante, no ahondaremos en su significado, si no que nos enfocaremos en el type native.

Recuerda que probablemente el número no sea consistente con el balance que te aparezca, pero eso es claramente porque ese es el balance a la fecha de edición de este artículo.

Ahora sí, para ejecutar la transacción, vamos a añadir un archivo final en utils y que tendrá el nombre de send-transaction.js, con el cuál enviaremos 10 XLM desde la cuenta que generamos con create-pair.js hacia la cuenta de pruebas.

El contenido del script send-transaction.js es el siguiente:

Ahora analicemos su contenido:

Lo primero será cargar nuestro par de llaves utilizando el secret seed que tenemos guardado en el .env que generamos al inicio del artículo, y dejaremos el destino escrito directamente en el código.

En seguida, intentamos cargar la cuenta de destino, que, aunque no es necesario, se considera una buena práctica, para evitar errores de parte de Horizon, y evitar el cobro de la comisión base de 0.000001 XLM que coloca Stellar.

Ahora armaremos la transacción utilizando el TransactionBuilder, y pasandole como opciones el fee base de Stellar y el identificador de la testnet.

Algo importante a destacar, es que un pago en Stellar es lo que se conoce como una operación, por lo que, debemos añadir el pago como un tipo de operación a través de .addOperation().

Las principales opciones de la operación de pago de StellarSdk son:

  • destination: Aquí va la llave publica del destinatario, que es la misma que definimos al inicio del script
  • asset: Dado que Stellar permite enviar diferentes tipos de activos, aquí podemos especificarlo, inclusive, podríamos añadir MXN, USD, EUR, o cualquier otra divisa que sea soportada por Stellar.
  • amount: La cantidad a enviar

Adicionalmente, el timeout es para esperar un tiempo determinado por la respuesta de la transacción antes de generar un error.

Y finalmente, .build() servirá para traducir la transacción al formato que entiende Stellar, en JSON.

Por último, utilizamos nuestras llaves para firmar la transacción y comprobar que efectivamente somos nosotros quienes estamos ejecutando la transacción.

El resultado lo guardamos después de enviarla a horizon, y lo mostramos con el mensaje de éxito.

Si todo sale correcto, podrás enviar tu transacción con el siguiente comando:

npm run send-transaction

Y el resultado que obtendrás será el siguiente:

npm run send-transaction

Es importante destacar que la transacción se ejecutó y confirmo bastante rápido, lo cuál es un detalle que se logra gracias al protocolo de consenso de Stellar.

Comprobando resultados

Para confirmar que la transacción se realizó correctamente, puedes correr los comandos de check-balance y check-recipient-balance, para comprobar que efectivamente tu balance bajó, y el del destino subió.

npm run check-balance && npm run check-recipient-balance

Nuestro balance ahora es de 10 XLM menos que antes
El balance de la cuenta destino aumentó en 10XLM

Notarás que tienes un balance no sólo de 10XLM menos que antes, si no que además, se cobra la comisión correspondiente por ella, la cual cabe destacar que es bastante baja en comparación a otras redes.

Conclusión

Gracias a que Stellar soluciona el problema del costo y tiempo de confirmación de transacciones, además de proveer librerías de desarrollo bastante completas, podemos utilizarlas para desarrollar integraciones altamente funcionales y perfectamente integradas con nuestro codebase.

Si bien, en este ejemplo no llegamos al desarrollo de una aplicación completa, ni tampoco al de contratos inteligentes, creo que es perfecto para entender los alcances. Es decir, todas las condiciones de un contrato inteligente pueden ser manejadas a través de código, y utilizando la librería para crear y guardar la firma de diversos actores, o para automatizar pagos.

Lo importante de Stellar es que, además de proveer una documentación extensa, nos habilita como desarrolladores a aprovechar todas las ventajas de los pagos en línea utilizando Blockchain.

Te animo a que continúes investigando, y que tomes algunas de las ideas de la lista pública que tiene Stellar para desarrollar, y así, aprender más sobre esta interesante propuesta

--

--

Ernesto Garcia N
Blockchain Academy Mexico

Ethereum Developer @OpenZeppelin | Intern twice @Google | Blockchain Development Teacher @blockdemy and @platzi