Los sistemas informáticos distribuidos sufren infinidad de errores, y la falla bizantina es uno de los más habituales. Este tipo de errores son muy complicados de resolver, porque el sistema de detección encuentra dificultades para decidir si el error está ahí o no.
Una falla bizantina, es una condición de un sistema computacional, concretamente de sistemas de computación distribuidos. Esta condición ocurre cuando uno o más componentes han fallado y no hay información precisa sobre si un componente ha fallado, o si la información del sistema es correcta.
En una falla bizantina, un componente como un servidor puede aparecer inconsistentemente como fallando y funcionando en los sistemas de detección de fallas. Esto ocurre porque el sistema presenta síntomas diferentes frente a diferentes observados. En este punto, es difícil para los otros componentes tomar la decisión de declararlo fallido y eliminarlo de la red. Pues para ello se necesita llegar a un consenso sobre qué componente ha fallado en primer lugar.
La Falla Bizantina como problema de consenso
El término toma su nombre del conocido “Problema de los Generales Bizantinos”. Este fue desarrollado para describir una circunstancia donde los actores deben acordar una estrategia o consenso para evitar el fracaso catastrófico del sistema. Y además deben de conseguir este meta sabiendo que entre ellos, pueden existir actores poco confiables.
El Problema de los Generales Bizantinos fue descrito por Robert Shostak en 1978, en el marco de un proyecto del laboratorio de Ciencias de la Computación de SRI International. Este proyecto se llamó SIFT, y contaba con respaldo de la misma agencia aeroespacial NASA. El caso descrito representa en esencia, un problema de comunicación distribuida entre computadores. En él, los computadores enfocados a diferentes propósitos, deben ser capaces de establecer una comunicación por pares y poder llegar a un consenso. Y deben de poder hacerlo aunque algunos de ellos estén averiados. Para entenderlo mejor, veamos su planteamiento:
El Problema de los Generales Bizantinos (PGB)
- Varios generales del mismo bando y sus ejércitos están situados en diferentes extremos de una ciudad con intención de asediarla.
- Para tener éxito, necesitarán atacar a la ciudad de forma coordinada para derrotar a las defensas o retirarse de forma coordinada. En caso de no sincronizar sus acciones, caerán ante las fuertes fuerzas enemigas.
- Para lograrlo, los generales atacantes se comunican entre ellos a través de mensajeros.
- Aunque la ciudad esté llena de enemigos, los mensajeros deben cruzar la ciudad para ir de un campamento a otro con las órdenes de ataque.
- El supuesto indica que el mensajero de un ejército informará a otro de la intención de atacar o no, y cuando hacerlo.
- Conforme reciban propuestas los generales irán confirmando o rechazando las mismas para establecer un acuerdo de votación sobre qué paso dar.
Cómo se puede observar, el problema es que dentro de la ciudad los enemigos podrían capturar a los mensajeros. De conseguir interceptarlos, el mensaje podría ser modificado y en consecuencia, el ataque no se realizaría de forma coordinada. Al no realizarse de forma coordinada, los ejércitos atacantes caerían derrotados, fracasando así su misión.
Por ejemplo, si un mensaje de los generales fuera “Atacar mañana”, se podría alterar el texto añadiendo detrás de “sólo si llueve”. De esta forma el otro ejército podría pensar que está acordando atacar sólo en caso de lluvia, y confirmar el mensaje. Con lo que el primer ejército atacaría y el segundo podría no hacerlo y retirarse si no lloviese.
En un conjunto de sistemas informáticos distribuidos con un objetivo común, cada computador equivale a un general y su ejército. Y por tanto, la red de datos sería análoga a los mensajeros que deben de cruzar la ciudad informando a los generales.
¿Qué efecto tienen las fallas bizantinas?
Las fallas bizantinas son consideradas la clase de fallas más general y más compleja de resolver. Esto es así porque el nodo que falla en la red, puede estar mostrando datos arbitrarios, y pretender estar correctamente. Las fallas bizantinas, son capaces de confundir los sistemas de detección de fallas. A pesar de la analogía, una falla bizantina no es, no obstante, un problema de seguridad que involucre interferencia humana hostil: puede surgir de forma aleatoria debido a fallas eléctricas que se van acumulando.
Para explicar un poco más los efectos y alcances de estas fallas explicaremos algunos casos conocidos de las mismas:
Caso #1: Transbordador Espacial Discovery – Vuelo STS-124
La NASA encontró que una de las fallas de la misión STS-124, se vio involucrada en el sistema de control de combustible. De sus cuatro sistema de control, los cuatro daban información errada y completamente distinta del sistema de control. Sin embargo, la falla no era de programación, sino física. Esta se originó en una tarjeta de control que se comunicó a los cuatros computadores. Una fisura en un diodo, fue lo que originó esta falla bizantina. La ruptura del diodo, fue culpable de una transmogrificación al convertir un diodo en un condensador. Esta situación atrasó el lanzamiento del transbordador hasta que la falla fue solucionada.
Si el sistema del Transbordador no fuera tolerantes a fallos bizantinos, esta falla hubiera sido desastrosa. Sin control del sistema de combustible, hubiera significado que el transbordador explotara. Este fallo es un claro ejemplo de lo peligrosos que pueden ser las fallas bizantinas, y de lo difícil que puede ser detectarlas o prevenirlas.
Caso #2: Tecnología blockchain
En el caso de la blockchain las fallas bizantinas se pueden presentar en la actuación de nodos no fiables o malintencionados. Si algún miembro de la comunidad envía información inconsistente a otros sobre transacciones, la confiabilidad de la blockchain se rompe. Para resolver esto, PoW ofrece mecanismos de tolerancia a fallas bizantinas (BFT) para evitar este problema.
Otro problema que se presenta en blockchain relacionado con las fallas bizantinas son los casos de doble gasto. El doble gasto, es un ataque en el que un actor hace uso en dos ocasiones distintas de las mismas criptomonedas. En este caso, la red blockchain debe resistir el hecho de que una misma criptomoneda se utilice de esta forma. Hacer esto es bastante complejo. Para lograrlo se debe diseñar mecanismos que sean tolerantes a fallas bizantinas parciales o completas.