C贸mo usamos Nix en IOHK. Traducci贸n al espa帽ol. 馃嚜馃嚫

translation
espa帽ol-馃嚜馃嚫

#1

Documento original Publicado el 6 de Febrero de 2019

Ver link a IOHK de Rodney Lorrimar, Ingeniero DevOps

Ver Documento Original aqu铆.

IOHK tiene un historial de poner en pr谩ctica grandes investigaciones. Esto incluye el uso de lenguajes de programaci贸n funcionales, la adopci贸n de m茅todos formales y, por supuesto, la implementaci贸n de nuestra propia investigaci贸n revisada por pares (peer-reviewed) en algoritmos de consenso de cadenas de bloques (blockchain).

Abordamos el problema de la implementaci贸n de software de forma similar, utilizando ideas que han surgido de trabajos acad茅micos recientes. Este sistema aplica los principios de programaci贸n funcional al 谩mbito de la gesti贸n de paquetes de software y de la administraci贸n de sistemas.

En este breve art铆culo t茅cnico describir茅 c贸mo utilizamos Nix en IOHK, y compartir茅 algunos de nuestros planes para el futuro.

驴Qu茅 son Nix, Nixpkgs y NixOS?

NixOS es una distribuci贸n Linux construida sobre el gestor de paquete Nix.

Lo que personalmente me gusta del gestor de paquetes Nix es su capacidad de instalar m煤ltiples versiones del mismo paquete, o de aplicar f谩cilmente una modificaci贸n de c贸digo fuente a un paquete. Para el desarrollo de Haskell en particular, hay paquetes binarios para un n煤mero impresionante de compiladores, herramientas y paquetes Hackage disponibles.

Lo que distingue a NixOS es su sistema de configuraci贸n. Incluye una gran colecci贸n de m贸dulos de alta calidad que se configuran de forma declarativa y uniforme. Esto es una ventaja para los administradores de sistemas que necesitan aplicar la misma configuraci贸n a muchos sistemas o integrar una amplia variedad de software en un solo sistema.

Debajo del gestor de paquetes Nix y NixOS se encuentra el lenguaje Nix - un lenguaje espec铆fico de dominio, puramente funcional, evaluado perezosamente (lazily-evaluated) para la configuraci贸n e implementaci贸n de software.

El art铆culo NixOS: Una distribuci贸n Linux puramente funcional es una excelente introducci贸n. Establece claramente los problemas que NixOS intenta resolver, muchos de los cuales ser谩n familiares para los usuarios t茅cnicos.

驴Qui茅n est谩 detr谩s del proyecto NixOS?

NixOS fue creado en 2003 en la Universidad de Utrecht como proyecto de investigaci贸n de Eelco Dolstra, formando parte principal de su tesis doctoral. Quince a帽os despu茅s, el proyecto NixOS se ejecuta en GitHub con cientos de colaboradores involucrados, y la base de c贸digo est谩 mejorando a un ritmo de unos 500 git cometidos (commits) por semana.

La comunidad tambi茅n se comunica a trav茅s de un canal activo de IRC en Freenode, un foro de discusi贸n, una conferencia anual (aproximadamente) y reuniones regulares.

Adem谩s, varias empresas ofrecen servicios de consultor铆a Nix, como Tweag I/O y Mayflower.

驴Por qu茅 Nix?

Hay muchos sistemas existentes para la gesti贸n de la configuraci贸n de software, algunos con muchos m谩s usuarios que Nix. Sin embargo, creemos que Nix tiene la mejor implementaci贸n disponible de `Infraestructura como c贸digo鈥, no s贸lo en t茅rminos de caracter铆sticas, sino tambi茅n en su dise帽o y potencial.

Si trata su implementaci贸n como un programa escrito en un lenguaje funcional, entonces obtendr谩 las ventajas de la programaci贸n funcional como transparencia referencial, reutilizaci贸n segura de c贸digo y la capacidad de probar su implementaci贸n en forma unitaria. En su esencia, la鈥檇erivaci贸n鈥 de Nix abstrae los detalles y permite que los m贸dulos de software se construyan y usen m谩s o menos de la misma manera, independientemente de su idioma de origen.

Una derivaci贸n es una funci贸n que toma c贸digo fuente, construye herramientas y dependencias de librer铆as, y produce un paquete de software inmutable; debido a que Nix es puro (en el sentido de programaci贸n funcional), si alguna de las entradas cambia, entonces el resultado es un paquete de software diferente. Alternativamente, si una derivaci贸n con exactamente las mismas entradas ya ha sido construida en otra parte (por ejemplo, por integraci贸n continua (CI)), Nix simplemente descargar谩 ese paquete, en lugar de construir la derivaci贸n en s铆 misma, reduciendo la duplicaci贸n del trabajo.

La forma en que Nix calcula si una entrada de derivaci贸n ha cambiado es tomando su hash (velocidad a la que una computadora completa una operaci贸n ) criptogr谩fico. Las dependencias son recursivas, as铆 que este hash es en realidad un hash de hashes - un concepto poderoso que es reconocido instant谩neamente por los entusiastas de las blockchains.

C贸mo usamos Nix

Aqu铆 hay algunos ejemplos de c贸mo estamos usando Nix en IOHK.

1. Despliegue de la red de Cardano SL

(SL =Settlement Layer = Capa de Contabilidad)

Realizamos alrededor de 200 nodos de c谩lculo en AWS para las diferentes redes de prueba, la red principal de Cardano SL Byron, y el despliegue de la puesta en marcha de Cardano SL (un entorno utilizado para probar las actualizaciones).

Estos son todos los sistemas NixOS desplegados con NixOps.

Hemos escrito una herramienta llamada iohk-ops, que genera una red NixOps a partir de una descripci贸n topol贸gica abstracta. La descripci贸n de la topolog铆a describe el n煤mero de nodos de retransmisi贸n de Cardano SL, en qu茅 centro de datos est谩n alojados y las rutas est谩ticas entre pares. iohk-ops llama a NixOps para ejecutar la implementaci贸n.

La misma herramienta permite el despliegue de 鈥榞rupos de desarrolladores鈥 m谩s peque帽os que se utilizan para actividades de prueba. Estos cl煤steres comparten el mismo c贸digo de implementaci贸n y versiones de software id茅nticas, pero son m谩s peque帽os y pueden iniciarse y detenerse seg煤n sea necesario.

Las caracter铆sticas de reducci贸n de NixOS y NixOps ya han demostrado ser invaluables varias veces en nuestros despliegues de puesta en escena: toda la red puede ser redesplegada con un s贸lo comando, o s贸lo con nodos espec铆ficos.

Con NixOps tenemos la capacidad de aplicar ajustes de configuraci贸n y parches de c贸digo, luego reconstruir en el momento de la implementaci贸n, confiando en que el resultado ser谩 id茅ntico a lo que viene de CI, y se puede deshacer sin dejar un l铆o atr谩s.

2. Despliegue reproducible

Las medidas extremas, como la modificaci贸n del c贸digo de tiempo de implementaci贸n, no suelen ser necesarias, ya que el entorno de implementaci贸n puede reproducirse y probarse localmente, lo que garantiza que cualquier problema se detecte con suficiente antelaci贸n.

Como se mencion贸 anteriormente, una derivaci贸n de Nix es una funci贸n pura. El c贸digo puede ejecutarse localmente con exactamente el mismo entorno y las mismas bibliotecas (hasta el n煤cleo de Linux) que se utilizan en producci贸n.

3. R谩pidas reconstrucciones de im谩genes Docker

Los puntos fuertes de Docker incluyen su inmutabilidad, encapsulaci贸n y reproducibilidad, rasgos que comparte Nix. Sin embargo, est谩 severamente limitado por su modelo de datos y su DSL restringido.

La estructura de las dependencias de software es un 谩rbol, no una secuencia de capas, tal y como ha sido modelada por Docker. Una molestia t铆pica cuando se construyen im谩genes Docker con un archivo Docker es que si cambia una capa cerca de la parte inferior, entonces todo lo anterior debe ser reconstruido. Adem谩s, a menos que se tomen medidas para utilizar varias etapas de construcci贸n, los productos intermedios de construcci贸n de capas inferiores se incluir谩n en la imagen final.

En cambio, un paquete Nix s贸lo se reconstruir谩 si sus dependencias (o sus dependencias) han cambiado. El cierre m铆nimo de un paquete Nix contiene s贸lo lo necesario para ejecutar ese software.

De esta manera podemos generar im谩genes Docker a partir del cierre de las derivaciones de Nix que son m铆nimas y de r谩pida reconstrucci贸n. El proceso de construcci贸n tambi茅n puede ser parametrizado defini茅ndolo como una funci贸n en el lenguaje Nix.

4. Despliegue declarativo de los esclavos (slaves) de construcci贸n de macOS

Para producir los paquetes de instalaci贸n de macOS de Daedalus, mantenemos una peque帽a colecci贸n de sistemas macOS (alojados en MacinCloud). Estos sistemas eran bastante tediosos de mantener hasta que empezamos a usar nix-darwin. Nix-darwin permite la configuraci贸n declarativa de sistemas macOS de forma similar a NixOS.

Escribimos un gui贸n para configurar el Mac a trav茅s de SSH. Todas las cosas se gestionan a trav茅s del c贸digo Nix, incluyendo el entorno de construcci贸n, la monitorizaci贸n y el acceso SSH.

5. Compilaci贸n cruzada de Cardano SL para Windows

Para producir los paquetes de instalaci贸n de Windows de Daedalus, necesit谩bamos confiar en las instancias de compilaci贸n de recursos limitados de los proveedores de CI, o mantener una peque帽a colecci贸n de sistemas Windows. La infraestructura de Windows CI ha sido una fuente constante de problemas para nosotros.

Sin embargo, ahora podemos compilar c贸digo Haskell para Windows en Linux! La siguiente versi贸n principal de Daedalus para Windows incluir谩 un cardano-node.exe que fue construido con Nix en Linux.

Debido al tama帽o de Cardano SL, esto es todo un logro, y el resultado de varios meses de duro trabajo.

6. Entornos de desarrollo

Con nix-shell, podemos proporcionar entornos de desarrollo que contengan todas las herramientas y librer铆as necesarias para construir un proyecto, anclado a versiones definidas con precisi贸n.

En cardano-sl, la concha (shell) de Nix soporta tanto el flujo de trabajo de la pila, como el de cabal de nueva construcci贸n con dependencias preconstruidas de Haskell descargadas desde la cach茅 binaria de IOHK.

En el daedalus, la concha Nix proporciona hilo, y un m茅todo de funcionamiento de una blockchain de Cardano SL y billetera a nivel local.

Los desarrolladores y usuarios que no est谩n familiarizados con las herramientas de construcci贸n de otros lenguajes como Cabal, Stack (Haskell), NPM, Yarn (Javascript), o Cargo (Rust), todav铆a pueden reconstruir (o descargar una construcci贸n en cach茅 desde CI), simplemente ejecutando nix build.

Existen otras herramientas para proporcionar entornos de desarrollo reproducibles, como Apache Maven o Docker, pero no son f谩ciles de componer. Debido a que Nix es un lenguaje funcional, los entornos de desarrollo son la aplicaci贸n de funciones que pueden ser compuestas. As铆 que con Nix puedes escribir una funci贸n que combine entornos de desarrollo, o s贸lo las partes que necesites.

Orientaciones futuras

2019 ser谩 un a帽o emocionante para IOHK, con varios proyectos ambiciosos en preparaci贸n. Anticipamos que Nix jugar谩 un papel importante en el 茅xito de estos proyectos. Algunas de las cosas que hemos planeado son:

Construcci贸n Daedalus Pura

Actualmente construimos los instaladores de Daedalus para Windows y macOS usando un script de Haskell. Esto es m谩s lento de lo necesario y necesita ejecutarse en un sistema Windows o MacOS: preferir铆amos construir sobre Linux con Nix para que los componentes de software puedan ser almacenados en cach茅 seg煤n sea necesario.

iohk-nix

IOHK est谩 dividiendo la base de c贸digo de Cardano SL en m贸dulos independientes, que deben ser integrados en la construcci贸n del producto final. Hemos iniciado un repositorio de c贸digo Nix iohk-nix com煤n que puede ser reutilizado por cada subproyecto de Cardano SL.

Como con todos los idiomas, el c贸digo Nix puede ser escrito de una manera hermosa o horrible - y como Nix no tiene un sistema de tipo est谩tico, el c贸digo horrible es realmente malo. As铆 que parte de este proyecto ser谩 un esfuerzo para mejorar la legibilidad y documentaci贸n de nuestro c贸digo Nix para que sea f谩cil de entender y mantener.

Herramientas para desplegar un nodo o un pool de participaci贸n (stake pool)

En 2019, Cardano SL ser谩 descentralizada. Nos gustar铆a hacer que sea s煤per f谩cil para los usuarios t茅cnicos desplegar uno o m谩s nodos de Cardano SL, u operar un stake pool.

Esto incluir谩:

  • Alisar las esquinas 谩speras de los iohk-ops para que est茅n listos para el uso p煤blico.

  • Proporcionar una variedad de opciones de construcci贸n como im谩genes Docker o ejecutables totalmente enlazados est谩ticamente.

  • Utilizar las herramientas disponibles en NixOS para proporcionar una configuraci贸n de monitorizaci贸n llave en mano para todas las m茅tricas necesarias a nivel de aplicaci贸n.

nix-tools Haskell Builder

La infraestructura de construcci贸n de Nix Haskell requer铆a de una revisi贸n significativa para poder compilar Haskell de forma cruzada con Windows, principalmente para rastrear m谩s informaci贸n sobre las banderas y dependencias del compilador.

El resultado es un constructor Haskell m谩s potente, y una nueva implementaci贸n de stack2nix que corre m谩s r谩pido, entre otras cosas. Esta infraestructura de Haskell se llama nix-tools. Nuestro objetivo es rellenar las partes que faltan y enviarlas a Nixpkgs el a帽o que viene.

Este tema es tan interesante que merece su propia entrada en el blog, que esperamos publicarlo pronto.

Conclusi贸n

Este fue un r谩pido repaso de c贸mo usamos Nix para ayudar a desarrollar e implementar Cardano.

No todo es excelente, por supuesto. Los usuarios encuentran que Nix tiene una curva de aprendizaje empinada, y que la comunidad es relativamente peque帽a. Tambi茅n tenemos nuestra propia lista de deseos de caracter铆sticas y correcciones de errores para Nix que a煤n no han sido implementadas.

Si est谩 interesado en aprender m谩s sobre Nix, visite el sitio web de NixOS. Si te gusta la codificaci贸n o la administraci贸n de sistemas, es muy f谩cil empezar a contribuir al proyecto NixOS. Toma un poco de tiempo orientarse con el lenguaje Nix, pero entonces encontrar谩s que casi todo lo que necesitas saber est谩 en un solo repositorio git.

En IOHK contribuimos regularmente al proyecto NixOS. Estas contribuciones incluyen mejoras a los paquetes y m贸dulos de NixOS, y la contrataci贸n de desarrolladores para hacer mejoras m谩s grandes. Adem谩s, simplemente utilizando NixOS a gran escala en proyectos de investigaci贸n y comerciales, contribuimos al ecosistema - publicando nuestro c贸digo fuente bajo una licencia libre, enviando informes de errores o compartiendo nuestras experiencias con la comunidad.

Estamos contratando

El equipo de IOHK est谩 creciendo, y estamos buscando a las personas adecuadas para unirse a nosotros. Si ayudarle a desarrollar una plataforma de blockchain m谩s avanzada que cualquier otra es algo que le interesa, entonces revise nuestros listados de empleos y p贸ngase en contacto con nosotros.

Material gr谩fico, Mike Beeple


Interested in Translating Cardano Content?