Traducción al español de “Combinator makes easy work of Shelley hard fork”
Publicado por Anthony Quinn en el blog de IOHK el 6 de Mayo de 2020
Una mirada entre bastidores con Duncan Coutts y Edsko de Vries
Desde que el lanzamiento de la Testnet Incentivada marcó la llegada de la era Shelley el año pasado, la plataforma Cardano ha entrado en un período de rápido desarrollo. El protocolo de consenso Ouroboros Classic ha apoyado a Cardano Byron y a la criptografía ada durante los últimos 30 meses, y pronto cambiaremos a Ouroboros Praos. Esta es la versión de nuestro protocolo de prueba de participación (PoS) que inicialmente impulsará a Shelley a medida que Cardano se descentralice. Construye el proceso de staking con recompensas monetarias para los titulares de ada y los propietarios de stake pools.
Actualizamos Cardano el 20 de Febrero con una bifurcación dura que cambió la red principal del protocolo de consenso original, Ouroboros Classic, a una versión actualizada, Ouroboros BFT. Esta bifurcación dura BFT comenzó un período de transición bajo Ouroboros BFT, una versión reducida del protocolo diseñada para ayudarnos a hacer el cambio a Praos, mientras que aún se previene cualquier comportamiento malicioso. Muchos probablemente ni siquiera se dieron cuenta. Para los usuarios de la billetera Daedalus, significaba una actualización de software estándar. Los intercambiadores tenían que actualizarse manualmente, pero tenían varias semanas para hacerlo y nosotros estábamos a mano para ayudar.
El siguiente evento fue el “reinicio Byron” el 30 de Marzo. Esto liberó un código totalmente nuevo para muchos de los componentes de Cardano, incluyendo un nuevo nodo para apoyar la delegación y la descentralización, y futuras características de Shelley. Una gran ventaja del nuevo código base es que ha sido rediseñado para ser modular, así que muchos componentes pueden ser cambiados sin afectar a los demás.
A su vez, la BFT actuará como el punto de partida de la bifurcación dura de Shelley, lo cual ocurrirá una vez que estemos contentos con la red de pruebas de Haskell. Esta segunda bifurcación dura será un proceso similar al de Febrero para los intercambiadores, los titulares de ada y los usuarios de billeteras, y, con suerte, tanto como un no-evento.
Sin embargo, mientras que todo se ve liso en la superficie, hay mucha actividad oculta en marcha. Como un pato nadando serenamente a través de un estanque - mientras sus pies están remando furiosamente bajo las aguas tranquilas - nuestros ingenieros blockchain son duros en ello.
Así que, nos sentamos con dos de los principales ingenieros del proyecto Cardano, Duncan Coutts y Edsko de Vries, para averiguar cómo lo han hecho. Duncan ha sido el líder arquitectónico de Cardano durante los últimos tres años, y entre ellos, Duncan y Edsko han pasado 35 años usando Haskell, el lenguaje de programación que se utiliza para desarrollar Cardano.
Duncan, ¿cómo lo hiciste?
Como se describe en la hoja de ruta de Cardano, los ingenieros blockchain de IOHK creen en las actualizaciones de código sin problemas. En lugar de intentar hacer el salto de Ouroboros Clásico a Praos en una sola actualización - lo que sería una tarea increíblemente compleja - ha sido un enfoque de dos etapas usando Ouroboros BFT como intermediario (Figura 1). El código BFT es compatible tanto con los nodos federados de la era Byron como con los nodos estilo Shelley liberados en el reinicio de Byron. Es como una carrera de relevos: un corredor (en nuestro caso, ejecutando un protocolo) entra en la caja de traspaso donde el otro corredor está esperando; sincronizan sus velocidades (por lo que son perfectamente compatibles entre sí) y luego entregan el bastón (operando la red principal), y luego el nuevo corredor con el bastón continúa desde la caja de traspaso para la siguiente vuelta.
Figura 1. Hoja de ruta de Red Principal Byron a Shelley
El proceso Daedalus Flight nos ha ayudado a desarrollar y probar rápidamente una nueva billetera y, una vez que todo el mundo la esté ejecutando en la red principal, y una vez que terminemos de intercambiar los nodos del núcleo, el viejo código es redundante. Estamos en esa fase de transición ahora mismo, con una nueva billetera Daedalus en la red principal que se lanzó el 24 de Abril.
Nuestro objetivo es tener una “entrada elegante en Shelley”, como el jefe de IOHK Charles Hoskinson describe en su video de pizarra sobre la bifurcación dura. Una herramienta vital para hacer este movimiento ha sido la creación de un combinador de bifurcación dura.
Eso suena a maquinaria agrícola. ¿Qué es eso?
Un combinador es sólo un término técnico para algo que combina otras cosas. Por ejemplo, la adición es un combinador de números. Un combinador de bifurcación dura combina dos protocolos en un solo protocolo. Lo llamamos una combinación secuencial de los dos protocolos porque ejecuta el primer protocolo durante un tiempo y en algún momento pasa al segundo. En nuestro caso, se trata de dos versiones de Ouroboros mientras pasamos de BTF a Praos.
La parte inteligente de todo esto ha sido el uso de módulos discretos que hacen su trabajo, mientras saben lo menos posible el uno del otro y de la blockchain. La simplicidad es la clave aquí y este proceso de sacar los detalles que llamamos “abstracción”. La mayoría de los módulos de consenso ni siquiera tienen que saber que están tratando con una criptomoneda y podrían estar poniendo casi cualquier cosa en una blockchain. Por ejemplo, hemos hecho seminarios usando el ejemplo de un libro de contabilidad de Pokémon en una blockchain de Ouroboros. La única cosa que es diferente son las reglas del libro contable; el consenso es todo lo mismo. Simplemente lo configuras - “instántalo” en la jerga de la programación - con las reglas para jugar a Pokémon en vez de para la contabilidad al estilo UTXO. [Para los lectores con interés técnico, tened cuidado de que Edsko profundice en el proceso de “abstracción” y los combinadores en una futura entrada de blog].
Haces que parezca simple
De hecho, es complicado porque Cardano está ejecutando la criptomoneda ada, y un montón de otras cosas, al mismo tiempo. Piensa que es como cambiar todas las ruedas de un coche mientras conduces y remolcas una caravana. Así que tenemos que estar seguros de que podemos hacer esto de una forma totalmente fiable.
Podríamos haber abordado esto como una tarea única, pero tenía sentido hacerlo de forma genérica usando un combinador de protocolos. Elegimos esta ruta porque obtenemos un mejor resultado y las pruebas que son vitales para asegurar que el código funciona son mucho más fáciles. Además de eso, habrá más bifurcaciones difíciles por venir, lo que hizo la elección aún más clara. Por ejemplo, a medida que nos acerquemos a la culminación del desarrollo de Cardano y nos movamos a través de las eras de Goguen, Basho y Voltaire, habrá al menos una bifurcación dura en cada etapa.
Entonces, ¿cómo te las arreglaste con las partes difíciles?
Bueno, en primer lugar, tuvimos que hacerlo sin tener que recurrir a la investigación. Los investigadores describen un protocolo único como algo independiente y perfecto. Pero no es ahí donde estamos. Estamos intentando dirigir Praos después de haber empezado con una cadena que usaba otra cosa. En lo que Edsko está trabajando, pasando de un protocolo a otro de forma genérica, no está cubierto en la investigación. Y es difícil, es complicado. Todos los detalles necesitan mucha reflexión, muchos rasguños en la cabeza. Pero cambiar entre las bases de código de Cardano no es el tipo de cosa que los académicos pueden esperar que se publique. No tiene un aspecto novedoso y se ve sólo como una cuestión de implementación.
Edsko, ¿puedes darnos un ejemplo?
Como dice Duncan, para los investigadores, estos asuntos de implementación son triviales pero tratarlos es el 99% de lo que hacemos. Tómese el problema del tiempo para una blockchain. Es contra lo que me he estado golpeando la cabeza durante un par de semanas. El tiempo se divide en franjas donde la cadena puede contener como máximo un bloque por franja. A menudo necesitamos convertir entre números de franja y tiempo en el mundo real, por ejemplo cuando un nodo necesita saber “¿Es mi turno?” para generar el siguiente bloque. Esto es fundamental para Cardano, pero la longitud de una franja cambia después de la bifurcación dura. Para Byron, una ranura es de 20 segundos; para Shelley, será de dos segundos, o tal vez uno. Para complicar realmente las cosas, el momento exacto en que se hace la bifurcación dura se decide en la propia cadena. Sin embargo, necesito saber cuándo es el punto de cambio. Es un dilema: para hacer conversiones de franjas necesito saber el estado de la blockchain, pero para saber el estado necesito saber las conversiones de franjas!
Este es un verdadero territorio de huevo y gallina con muchas cosas complejas que desenredar. Tenemos que ser muy precisos con la forma en que hacemos las cosas. Puede ser trivial en teoría, pero es muy difícil desenredar las cosas y asegurarse de que no es un problema circular.
No podemos permitirnos equivocarnos, así que ¿cómo sabes que tienes razón?
Duncan: Esa es una excelente pregunta. Mi respuesta es que llegas a la respuesta en dos niveles. El primero es intelectual: analizas el problema, haces las matemáticas, hablas con los colegas y luchas con él hasta que puedes ver cómo encaja todo. En segundo lugar, hacemos todas nuestras pruebas de QuickCheck para darnos la confianza de que esto hace lo que creemos que hace. Hacemos pruebas extensas que nos llevan a los casos inusuales en los que nunca pensarías, incluyendo este cambio. Podemos hacer 100.000 pruebas cada vez que cambiamos una línea de código. (Lars Brünjes ha escrito sobre cómo John Hughes, uno de los creadores de Haskell, ha ayudado a IOHK a desarrollar sus estrategias de pruebas).
Edsko: Sí, estoy de acuerdo con esos dos puntos. En términos del combinador, resuelvo estas cosas pensando en las garantías que el código que escribo debe proporcionar, y que garantiza que, a su vez, necesita del libro de contabilidad. Esbozo una prueba matemática de que este razonamiento “si-entonces” está realmente justificado, y luego recurro a los equipos del método formal. El equipo de métodos formales son las personas que establecen las reglas matemáticas que describen la blockchain, y luego pueden ajustar las reglas de tal manera que proporcionen las garantías requeridas.
En cuanto al segundo punto de Duncan, sé que la cuestión del tiempo que mencioné anteriormente es correcta al pensar matemáticamente duro, y al hacer pruebas. Las decisiones sobre el tiempo son fáciles cuando tenemos la blockchain completa, pero son difíciles cuando tenemos que hacer predicciones sobre el futuro. Afortunadamente, la forma en que preparamos las cosas significa que puedo crear fácilmente blockchains de prueba. Así que puedo crear una blockchain completa, y luego cortar esta cadena por la mitad. Tomo la primera mitad y la considero en el presente; y pongo la otra mitad en el futuro. Entonces puedo usar el “presente” (primera mitad) para hacer predicciones sobre el “futuro” (la segunda mitad) y verificarlas contra todo el asunto (en el cual los cálculos son fáciles). Si coinciden, entonces sé que todo está bien.
¿Cuándo empezaste con esto?
Justo después de que a Duncan se le ocurriera la genial idea del OBFT. Así que he estado pensando en el combinador de vez en cuando durante unos 18 meses. Fue un objetivo de diseño desde el principio de nuestra reescritura modular de Ouroboros a partir de Octubre de 2018, con mi primer compromiso con el repositorio GitHub. Tuvimos una demostración del prototipo con OBFT y Praos poco después, en Diciembre de 2018.
¿Y cuánta gente ha estado involucrada?
Duncan: Mucha gente ha estado trabajando en el código de consenso, pero siempre que tenemos algo realmente difícil, como este combinador, se lo damos a Edsko: ¡es nuestro ingeniero de software extraordinario! Esta es la programación de Haskell como escalada libre, en lugar de escalar con las cuerdas de los métodos formales de apoyo.
¿Alguna idea final?
Duncan: El código que estaba corriendo ahora mismo está siendo eliminado y muy pronto el código que estaba corriendo Cardano hace un mes ya no existirá. Una vez que todo el mundo esté ejecutando el nuevo código en la red principal y una vez que terminemos de intercambiar los nodos del núcleo, el viejo código será redundante. Estamos en esa fase de transición ahora mismo y nadie está gritando que el cielo se está cayendo. Nadie lo ha notado.
Edsko: Eso es todo un logro en sí mismo. La idea de OBFT fue crucial para hacer la transición, pero ya no es relevante una vez que hacemos esa transición a Shelley. Esta ha sido una forma de deshacernos del código heredado, lo cual es a menudo muy difícil de hacer, como los bancos saben a su costo.
Duncan: Y si todo funciona bien, no notará nada.
Duncan y Edsko, gracias por su tiempo. Creo que será mejor que los dejemos a ambos volver a ello.