ReasonML y NEM Blockchain
Introducción de la integración de la Blockchain de NEM con ReasonML
Este artículo explica el uso básico del NEM2-SDK con ReasonML, junto a NEM2-CLI
Introducción
Realizaremos la configuración de los servicios NEM Catapult, para exponenciar nuestro flujo de trabajo de Blockchain, luego interactuamos con la misma blockchain utilizando NEM SDK para javascript, pero para ser extra-cool ™ escribiremos nuestros ejemplos utilizando ReasonML.
ReasonML es esencialmente una sintaxis para el lenguaje de programación OCaml, viene con una variedad de herramientas útiles, que nos permiten compilarlo en Javascript.
NEM es una tecnología de cadena de bloques relativamente nueva, que maneja transacciones de firma múltiple con facilidad y tiene un avanzado desarrollo de herramientas.
Pre Requisitos
Se asume que el lector tenga un conocimiento de programación y en conocer el lenguaje Docker, Javascript, Git y Blockchain (P.e. Ethereum, tezos…).
Glosario
Primero que todo, vamos ahondar un poco en la tecnología que usaremos:
- NEM Blockchain es una plataforma Blockchain que facilita la integración con aplicaciones nuevas o existentes, al proporcionar una experiencia de desarrollado más confortable a comparación de otras Blockchain. Permite una blockchain tanto privada como pública, en la que se puede desarrollar activos inteligentes y transacciones de multi-firma.
- ReasonML es una sintaxis del lenguaje OCaml y a su vez una “caja de herramienta”, orientada a desarrolladores de Javascript
- Instalar Catapult
Se comienza por clonar la base de código del catapult-service-bootstrap, luego organice todos los servicios de la ventana acoplable utilizando los comandos a continuación.
“Para quienes no están familiarizados con Docker o Git, se ha copiado el código de almacenamiento remoto, para luego iniciar los servicio provistos utilizando las “máquinas virtuales” de la ventana acoplable. “
$> git clone https://github.com/tech-bureau/catapult-service-bootstrap $> cd catapult-service-bootstrap $> docker-compose up |
Una vez que Nem empiece a compilar, su terminal output lucirá algo así
El siguiente paso es de verificar, que el resto de la Blockchain y nodos estén corriendo. Usted puede hacer esto integrando el REST API , proporcionado por Catapult Rest, como se muestra a continuación.
$> curl localhost:3000/block/1 |
Si todo sale como se esperaba, usted verá replicado el JSON replicado como se ve arriba
Se ha instalado correctamente NEM Blockchain y los nodos REST en su máquina
2. Configuración ReasonML/ NEM environment
Para desarrollar nuestra integración de la blockchain con Catapult REST, se usará el NEM SDK, con ReasonML
Se empezará por crear la estructura apropiada de la carpeta:
Los siguientes comandos, se ejecutan por fuera del directorio “git clonado” que se creó en el paso 1
$> mkdir app $> cd app $> touch Dockerfile $> touch run-in-docker.sh & chmod +x run-in-docker.sh |
Creación de la estructura de la carpeta
“Se necesitará de un ambiente para compilar los scripts. Use un nodo basado en la imagen docker, con la plataforma-bs (Herramienta ReasonML) ya instalada. De click aquí para aprender qué rol juega acá bs-platform a.k.a. bucklescript. “
# Use a recent nodejs image FROM node:11.4 # Install bucklescript compiler RUN yarn global add bs-platform RUN yarn global add nem2-cli |
Contenido previo de la carpeta Docker
“El siguiente paso es de construir la imagen docker, por lo que se podrá utilizar el reason environment. “
$> docker build . -t reason-bread |
Creación de la imagen, ahora se podrá correr el run-in-docker.sh
“Cuando utilizamos el run-in-docker.sh para proporcionar una capa interactiva con el ReasonML instalado. “
docker run –network=”catapult-service-bootstrap_default” -v “$PWD”:/app -w /app -it reason-bread:latest /bin/bash |
Pequeño y útil script, que nos permite correr el reason-able shel, encima de nuestras carpetas
Resultado de los comandos anteriores. Dockerfile, run-in-docker.sh creado con el contenido apropiado, y la imagen de motivo disponible.
Felicidades, ahora está listo para comunicarse con la NEM Blockchain, a través de scripts escritos en ReasonML: todo lo que necesita para compilar y ejecutar scripts ReasonML, sucede en la imagen de la ventana acoplable que acabamos de crear.
3. Configuración del Proyecto Reason
Hasta ahora, hemos establecido una base sólida. Se están ejecutando los bloques NEM blockchain y REST, y tenemos una imagen acoplable con un pequeño script auxiliar para ejecutar el código ReasonML.
El siguiente paso es armar / generar un proyecto de Reason.
$> cd app $> ./run-in-docker.sh |
Nuestra instancia interactiva / bin / bash, con bucklescript disponible debería tener este aspecto.
$> bsb -init . -theme basic-reason |
Proyecto generado, exitosamente
“ Para confirmar que nuestro proyecto ha sido generado como esperábamos. Compilamos y ejecutamos nuestro demo script.
$> yarn build && node src/Demo.bs.js |
Sientase libre de usar el editor de código de su preferencia, yo usualmente utilizo opt-in para vscode. Nuestra imagen acoplable toma / monta los archivos del mismo sistema de al que podemos acceder desde nuestra “computadora real”.
Our generated Demo script written in Reason, as shown in visual studio code editor.
Nuestro script de demostración generado en Reason, como se muestra en el editor de código de estudio visual.
“Demo.re es un archivo, que fue generado usando bsb-init y Demo.bs.js, que es lo mismo pero se compila en javascript”
Compile y corra usando el nodo, como cualquier archivo de javascript
Vamos a hacer esto !
Nuestra configuración funciona como se esperaba, podemos pasar a la parte divertida.
El primer ejercicio creará una nueva cuenta en NEM Blockchain, utilizando el sdk y el cli.
En nuestro entorno docker, instale nem2-sdk.
$> yarn add nem2-sdk |
Generar una nueva cuenta -SDK
Nuestro proyecto de demostración contiene un archivo llamado Demo.re. El cual podemos eliminar. En su lugar, vamos a crear un nuevo archivo en src /, llamado generateNewAccount.re. Escribiremos un código ReasonML, que usará NEM2-SDK, para hablar con la pila de Catapult que configuramos anteriormente. ReasonML nos permite escribir código funcional de tipo seguro, que se intera sin problemas con javascript (navegador y nodo).
Queremos crear una cuenta / billetera NEM, que es un bloque de identidad básica para la cadena de bloques. Lo que nos permite usar todas las características geniales de NEM, como el intercambio de activos inteligentes o las transacciones de firma múltiple. Terminaremos con una clave privada, una clave pública y una dirección.
/* Define a nemAccount type, so we can access Account properties from the SDK */ type nemAccount = Js.t({ . publicKey: string, privateKey: string, publicAccount: unit }); /* Import SDK’s Account class */ [@bs.module “nem2-sdk”] external account: (nemAccount) = “Account”; /* Import SDK’s NetworkType enum, as a dictionary of integers */ [@bs.module “nem2-sdk”] external networkType: Js.Dict.t(int) = “NetworkType”; /* SDK’s Account.generateNewAccount, is a static method */ [@bs.send] external generateNewAccount: (nemAccount, int) => nemAccount = “generateNewAccount”; /* Get the ID of our desired network, so we can create an account */ let mijinTestNetwork = Js.Dict.get(networkType, “MIJIN_TEST”); switch (mijinTestNetwork) { | None => Js.log(“Failed to create an account, wrong network used”); | Some(network) => { let newAccount: nemAccount = generateNewAccount(account, network); Js.log(newAccount##publicAccount); Js.log(“Private key: ” ++ newAccount##privateKey); } } |
Verifiquemos que los archivos hayan compilado y ejecutado primero, después iremos con los contenidos
$> yarn start |
El output de yarn corre
Ahora un nuevo archivo aparece, generateNewAccount.bs.js. Esto sucedio por ejecutar el javascript, gracias al compilador bucklescript. Miremos esto:
// Generated by BUCKLESCRIPT VERSION 4.0.11, PLEASE EDIT WITH CARE ‘use strict’; var Js_dict = require(“bs-platform/lib/js/js_dict.js”); var Nem2Sdk = require(“nem2-sdk”); var mijinTestNetwork = Js_dict.get(Nem2Sdk.NetworkType, “MIJIN_TEST”); if (mijinTestNetwork !== undefined) { var newAccount = Nem2Sdk.Account.generateNewAccount(mijinTestNetwork); console.log(newAccount.publicAccount); console.log(“Private key: ” + newAccount.privateKey); } else { console.log(“Failed to create an account, wrong network used”); } exports.mijinTestNetwork = mijinTestNetwork; /* mijinTestNetwork Not a pure module */ |
Parece familiar, ¿no ? ¿Qué es lo que hace?
- Importa el SDK
- Extrae el valor typescript enums, para MIJIN_TEST
- Sí la prueba de la red corre normal, usa la cuenta SDK class, para crear una nueva cuenta
Ahora puedes ejecutar el salida del script, usando el nodo
$> node src/generateNewAccount.bs.js |
Tenemos la llave público/privada, con la dirección de NEM
Generación de una nueva cuenta – CLI
Hasta ahora hemos podido crear una nueva cuenta NEM, utilizando el SDK, con enlaces personalizados de ReasonML. Ahora intentemos lograr el mismo resultado utilizando la CLI de NEM.
Nuestra imagen docker ya contiene nem2-cli, así que vamos a usarla.
“En caso de que los servicios de catapulta no se estén ejecutando, puede utilizar los siguientes comandos para volver a activarlos.”
$> cd catapult-service-bootstrap $> docker-compose up |
Ejecute esto fuera del contenedor dock de razón-pan, también lo hemos hecho en la sección de inicio, ¡siéntase libre de desplazarse hacia atrás hasta allí!
Ahora usaremos cli para generar una nueva cuenta y guardarla en la lista de perfiles de la CLI. Más o menos lo mismo, como lo hizo nuestro código. Asegúrese de ejecutar los siguientes comandos, dentro de run-in-docker.sh, porque necesita acceso a nem2-cli que está instalado allí.
El comando a continuación le pedirá cierta información, usaremos el mismo tipo de red que en nuestros ejemplos de Razón, mientras que la URL del nodo NEM2 cambiará (se muestra a continuación); esto se debe al hecho de que el nodo REST se ejecuta en un contenedor separado, que nuestro run-in-docker.sh, por lo que esencialmente se trata de una red de conexión, que puede obtener más información aquí.
# Network Type: MIJIN_TEST # Save it?: y # NEM2 NODE URL: http://catapult-service-bootstrap_rest-gateway_1:3000 # Profile name: main (this can be whatever you desire) $> nem2-cli account generate |
Puede verificar si su cuenta se generó y guardó con éxito, enumerando los perfiles existentes.
Usar la clave privada preestablecida con Reason
Si desea, puede rellenar la lista de perfiles de la CLI, con las cuentas generadas programáticamente (utilizando nuestro código de razón).
Es bastante sencillo:
# Network Type: MIJIN_TEST # Private key: Output from your reason script, done in the previous step # NEM2 NODE URL: http://catapult-service-bootstrap_rest-gateway_1:3000 # Profile name: generated-with-reason (this can be whatever you desire) $> nem2-cli profile create |
Un nuevo perfil aparece en el final
Felicitaciones ¿ha creado con éxito dos (o más) cuentas NEM, que ahora puede usar para explorar el resto de la cadena de bloques NEM? Hay una amplia documentación disponible, puede encontrarla en este enlace.
¿Que sigue?
En el siguiente artículo, exploraremos las transacciones de NEM2 Faucet, Mosaics y Multi-signature.
Esto nos permitirá intercambiar nuestro Bread personalizado (Mosaic / smart asset), por xem (moneda virtual) con otras cuentas en la cadena de bloques.
Fuente: Medium