Creando una aplicación blockchain sin servidor con las funciones Catapult y Netlify

Este tutorial le mostrará cómo crear una aplicación de blockchain sin servidor utilizando las funciones Catapult y Netlify.

Serverless blockchain app diagram

En particular, vamos a crear un grifo blockchain. Pero primero, revisemos qué significan todos estos conceptos y qué tan bien encajan.

¿Qué es la cadena de bloques Catapult?

Catapult es el nombre en clave del próximo motor blockchain de NEM. NEM permite a los desarrolladores acceder a funciones integradas avanzadas de blockchain utilizando una API REST. Puede usar NEM para integrar las capacidades de blockchain en aplicaciones nuevas o existentes con código ligero. Lea más sobre Catapult aquí.

… y sin servidor?
Una aplicación necesita vivir en algún lugar para que otros accedan a ella.

Inicialmente, las aplicaciones estaban ubicadas en servidores dentro de las instalaciones de la compañía. Ahora, es común contratar máquinas virtuales de proveedores como Amazon o Google, en lugar de tener la plancha en casa. Aún así, los desarrolladores tienen que cambiar el enfoque del desarrollo para configurar los servidores, las máquinas virtuales o los contenedores para poder ejecutar sus aplicaciones.

La arquitectura sin servidor proporciona una mayor abstracción para los desarrolladores, lo que les permite ejecutar código en un entorno completamente administrado por otros. En resumen, no se dedica tiempo a configurar la infraestructura, incluida la configuración, la disponibilidad, el equilibrio de carga …

Una de las plataformas que ofrece la función como servicio (FaaS) es Netlify, que agrega una capa de configuración simplista sobre Amazon Lambda.

¿Cómo encaja todo?
El primer beneficio claro de ejecutar una aplicación sin servidor es que hay menos infraestructura para mantener. La ejecución de funciones sin servidor suele ser más barata que ejecutar un servidor altamente disponible y distribuido las 24 horas del día, teniendo en cuenta que las funciones se cobran por uso.

En segundo lugar, leer de la cadena de bloques de Catapult es tan sencillo como consumir una llamada API. Sin embargo, las cosas comienzan a complicarse cuando tenemos que cambiar el estado de la cadena de bloques, ya que los nodos solo aceptan datos serializados. Para serializar las transacciones, generalmente usamos un Kit de desarrollo de software (SDK), pero hasta el momento, Catapult no ofrece un SDK para cada idioma. Podemos llenar este vacío creando funciones personalizadas sin servidor en Javascript simple, que luego pueden ser consumidas por aplicaciones escritas en cualquier otro idioma.

Serverless diagram

Imagine una empresa dispuesta a integrar la cadena de bloques Catapult en su aplicación existente escrita en Ruby. Desafortunadamente, no hay Catapult SDK para Ruby. Aún así, para superar el problema, podrían usar una función lambda para registrar transacciones en la cadena de bloques.

Resumen de la aplicación
Para mostrar cómo podemos combinar aplicaciones sin servidor y blockchain, vamos a construir un grifo sin servidor para Catapult. Los faucets son contratos simples que permiten que las cuentas soliciten tokens de blockchain.

Como las aplicaciones Catapult se pueden desarrollar en JavaScript simple, podríamos fallar en el error al poner toda la lógica dentro de la aplicación cliente. Sin embargo, para anunciar transacciones, primero debemos firmarlas con la clave privada del faucet y, como su nombre lo indica, esta clave debe permanecer privada a toda costa. Por esa razón, necesitamos agregar una capa adicional y mover parte de la aplicación detrás de una aplicación de servidor, donde los usuarios no pueden acceder a esta clave privada.

El faucet presentado está alojado en GitHub, puesto a disposición de otros gracias al CDN de Netlify y su servicio “Funciones”.

Requisitos
Para ejecutar este ejemplo, asegúrese de tener Git, NodeJS 12 LTS e hilo instalados. Si no ha desarrollado aplicaciones de Catapult antes, le recomiendo que complete la sección de Inicio de Catapult para crear una cuenta y enviar su primera transacción a la red.

Descargar el proyecto repetitivo
El proyecto nem2-serverless-faucet tiene todos los componentes necesarios para implementar una aplicación sin servidor.

Vamos a probar la aplicación primero localmente y luego implementarla en Netlify. Si desea implementar un grifo personalizado, vaya a la sección “Implementación de la aplicación”.

  1. Bifurcar el repositorio.
  2. Clone su repositorio.

git clone https://github.com/your-username/nem2-serverless-faucet.git

3. Agregue el proyecto

cd nem2-serverless-faucet

4. Ejecute la instalación de hilo.

yarn install

Desarrollando una función lambda
Primero, necesitamos definir la función sin servidor. El archivo src / lamba / faucet.js contiene la función que está usando el faucet.

import querystring from "querystring";
import {
    Account,
    Address,
    Deadline,
    EmptyMessage,
    Mosaic,
    MosaicId,
    TransactionHttp,
    TransferTransaction,
    UInt64
} from "nem2-sdk";
const {GENERATION_HASH, MOSAIC_DIVISIBILITY, MOSAIC_ID, NETWORK, NODE_URL, FAUCET_PRIVATE_KEY } = process.env;

exports.handler = async (event, context) => {
    // Only allow POST
    if (event.httpMethod !== "POST") {
        return {statusCode: 405, body: "Method Not Allowed"};
    }

    const params = querystring.parse(event.body);
    const recipientAddress = Address.createFromRawAddress(params.address);
    const amount = params.amount < 1000 ?
        UInt64.fromUint(params.amount * Math.pow(10, parseInt(MOSAIC_DIVISIBILITY))) :
        UInt64.fromUint(1000 * Math.pow(10, parseInt(MOSAIC_DIVISIBILITY)));

    const transferTransaction = TransferTransaction.create(
        Deadline.create(),
        recipientAddress,
        [new Mosaic(new MosaicId(MOSAIC_ID), amount)],
        EmptyMessage,
        parseInt(NETWORK),
        UInt64.fromUint(2000000));

    const account = Account.createFromPrivateKey(FAUCET_PRIVATE_KEY, parseInt(NETWORK));
    const signedTransaction = account.sign(transferTransaction, GENERATION_HASH);

    const transactionHttp = new TransactionHttp(NODE_URL, NETWORK);
    transactionHttp.announce(signedTransaction)
        .subscribe(x => console.log(x),err => console.log(err));

    return {
        statusCode: 200,
        body: `Transaction announced: ${signedTransaction.hash}`
    };
};

Como puede ver, una función lambda se desarrolla de manera similar a cualquier otra API. En este caso, la función toma como cantidad de entrada y dirección. Luego, definimos una transacción, la firmamos con la cuenta de faucet y la enviamos a la red. Finalmente, la función devuelve una respuesta OK si la transacción se anunció con éxito.

Todas las variables de entorno están definidas en el archivo .env, excepto una: la clave privada.

NODE_URL=http://api-harvest-20.us-west-1.nemtech.network:3000
NETWORK=152
GENERATION_HASH=CC42AAD7BD45E8C276741AB2524BC30F5529AF162AD12247EF9A98D6B54A385B
MOSAIC_ID=103E3F46B101D781
MOSAIC_DIVISIBILITY=6

Cambie las variables de entorno como lo desee. Luego, abra una nueva terminal y configure la clave privada de la llave.

export FAUCET_PRIVATE_KEY="my value"

Llamando a la función
Ahora que hemos definido la función, podemos llamarla. El archivo src / index.html define el formulario utilizado para realizar una solicitud POST a la función sin servidor.

<form action="/.netlify/functions/faucet" method="POST">
    <p>
        <label>What's your address?<br/><input name="address" type="text"></label>
        <label>How many units (max 1000)?<br/><input name="amount" type="number"></label>
    </p>
    <p>
        <button type="submit">Receive!</button>
    </p>
</form>

Pruebe la aplicación localmente ejecutando npm run start. Luego, abra localhost: 8080 en una nueva pestaña del navegador.

Implementar la aplicación
Ahora que hemos creado y probado el faucet, podemos usar Netlify para alojar la aplicación. Si no tiene una cuenta de Netlify, regístrese aquí primero.

  1. Cree un nuevo sitio desde Git usando este enlace.
  2. Elija implementar usando su cuenta de GitHub.
  3. Autorizar Netlify.
  4. Seleccione el repo nem2-serverless-faucet.
  5. Abra la pestaña Configuración avanzada de compilación y defina las siguientes variables de entorno:
Environment variables for Production

6. Haga clic en el botón “Implementar sitio”, ¡y listo!

Después de implementar la aplicación, Netlify le mostrará la URL del sitio.

Conclusión
En este tutorial, solo hemos comenzado a ver lo que podemos lograr combinando funciones sin servidor y la cadena de bloques Catapult. Sin embargo, podemos imaginar una amplia gama de posibilidades prometedoras. Si crea una nueva aplicación sin servidor usando el código repetitivo compartido, ¡no dude en compartir el enlace en los comentarios!

Fuente: David Garcia Blog