Un problema fundamental en la computación distribuida y los sistemas multiagente es lograr la confiabilidad general del sistema en presencia de una serie de procesos defectuosos. Esto a menudo requiere la coordinación de procesos para alcanzar un consenso o acordar algún valor de datos que se necesita durante el cálculo. Ejemplos de aplicaciones de consenso incluyen acordar qué transacciones confirmar en una base de datos en qué orden, replicación de máquinas de estado y transmisiones atómicas . Las aplicaciones del mundo real que a menudo requieren consenso incluyen computación en la nube , sincronización de relojes , PageRank , formación de opinión, redes eléctricas inteligentes , estimación de estado , control de vehículos aéreos no tripulados (y múltiples robots/agentes en general), equilibrio de carga , cadena de bloques y otras.
El problema del consenso requiere que varios procesos (o agentes) lleguen a un acuerdo sobre un único valor de datos. Algunos de los procesos (agentes) pueden fallar o no ser confiables de alguna otra manera, por lo que los protocolos de consenso deben ser tolerantes a fallas o resilientes. Los procesos deben proponer sus valores candidatos, comunicarse entre sí y acordar un único valor de consenso.
El problema del consenso es un problema fundamental en el control de sistemas multiagente. Un enfoque para generar consenso es que todos los procesos (agentes) acuerden un valor mayoritario. En este contexto, una mayoría requiere al menos uno más de la mitad de los votos disponibles (donde cada proceso recibe un voto). Sin embargo, uno o más procesos defectuosos pueden distorsionar el resultado resultante de tal manera que no se alcance el consenso o que se alcance incorrectamente.
Los protocolos que resuelven problemas de consenso están diseñados para tratar con un número limitado de procesos defectuosos . Estos protocolos deben satisfacer varios requisitos para ser útiles. Por ejemplo, un protocolo trivial podría hacer que todos los procesos generen un valor binario de salida 1. Esto no es útil; por lo tanto, el requisito se modifica de modo que la producción debe depender de la entrada. Es decir, el valor de salida de un protocolo de consenso debe ser el valor de entrada de algún proceso. Otro requisito es que un proceso puede decidir sobre un valor de salida solo una vez, y esta decisión es irrevocable. Un método es correcto en una ejecución si no experimenta un fallo. Un protocolo de consenso que tolere fallos de detención debe satisfacer las siguientes propiedades. [1]
Según la aplicación, pueden ser adecuadas variaciones en la definición de integridad . Por ejemplo, un tipo de integridad más débil [ se necesita más explicación ] sería que el valor de la decisión fuera igual a un valor que proponía algún proceso correcto, no necesariamente todos. [1] También existe una condición conocida como validez en la literatura, que se refiere a la propiedad de que un mensaje enviado por un proceso debe ser entregado. [1]
Un protocolo que puede garantizar correctamente el consenso entre n procesos, de los cuales como máximo t fallan, se dice que es t-resiliente .
Al evaluar el rendimiento de los protocolos de consenso, dos factores de interés son el tiempo de ejecución y la complejidad de los mensajes . El tiempo de ejecución se expresa en notación Big O en la cantidad de rondas de intercambio de mensajes como una función de algunos parámetros de entrada (normalmente la cantidad de procesos o el tamaño del dominio de entrada). La complejidad de los mensajes se refiere a la cantidad de tráfico de mensajes que genera el protocolo. Otros factores pueden incluir el uso de la memoria y el tamaño de los mensajes.
Los distintos modelos de computación pueden definir un "problema de consenso". Algunos modelos pueden tratar con grafos completamente conectados, mientras que otros pueden tratar con anillos y árboles. En algunos modelos se permite la autenticación de mensajes, mientras que en otros los procesos son completamente anónimos. Los modelos de memoria compartida en los que los procesos se comunican accediendo a objetos en la memoria compartida también son un área importante de investigación.
En la mayoría de los modelos de protocolos de comunicación, los participantes se comunican a través de canales autenticados. Esto significa que los mensajes no son anónimos y los receptores conocen la fuente de cada mensaje que reciben. Algunos modelos suponen una forma de autenticación más fuerte y transferible , en la que cada mensaje está firmado por el remitente, de modo que el receptor no sólo conoce la fuente inmediata de cada mensaje, sino también el participante que creó inicialmente el mensaje. Este tipo de autenticación más fuerte se logra mediante firmas digitales y, cuando está disponible, los protocolos pueden tolerar una mayor cantidad de fallas. [2]
Los dos modelos de autenticación diferentes se denominan a menudo modelos de comunicación oral y modelos de comunicación escrita . En un modelo de comunicación oral, se conoce la fuente inmediata de información, mientras que en los modelos de comunicación escrita más sólidos, en cada paso el receptor no solo conoce la fuente inmediata del mensaje, sino también el historial de comunicación del mensaje. [3]
En los protocolos de consenso de valor único más tradicionales, como Paxos , los nodos cooperantes acuerdan un valor único, como un número entero, que puede ser de tamaño variable para codificar metadatos útiles , como una transacción enviada a una base de datos.
Un caso especial del problema de consenso de valor único, llamado consenso binario , restringe el dominio de entrada y, por lo tanto, de salida, a un solo dígito binario {0,1}. Si bien no son muy útiles por sí mismos, los protocolos de consenso binario suelen ser útiles como bloques de construcción en protocolos de consenso más generales, especialmente para el consenso asincrónico.
En los protocolos de consenso de múltiples valores , como Multi-Paxos y Raft , el objetivo es acordar no solo un valor único, sino una serie de valores a lo largo del tiempo, formando un historial que crece progresivamente. Si bien el consenso de múltiples valores se puede lograr de manera simple ejecutando varias iteraciones de un protocolo de consenso de un solo valor en sucesión, muchas optimizaciones y otras consideraciones, como el soporte de reconfiguración, pueden hacer que los protocolos de consenso de múltiples valores sean más eficientes en la práctica.
Hay dos tipos de fallos que puede sufrir un proceso: un fallo por caída o un fallo bizantino . Un fallo por caída ocurre cuando un proceso se detiene abruptamente y no se reanuda. Los fallos bizantinos son fallos en los que no se imponen condiciones en absoluto. Por ejemplo, pueden ocurrir como resultado de las acciones maliciosas de un adversario. Un proceso que experimenta un fallo bizantino puede enviar datos contradictorios o conflictivos a otros procesos, o puede suspenderse y luego reanudar la actividad después de una demora prolongada. De los dos tipos de fallos, los fallos bizantinos son mucho más disruptivos.
Por lo tanto, un protocolo de consenso que tolere fallos bizantinos debe ser resiliente a cualquier posible error que pueda ocurrir.
Una versión más fuerte del consenso que tolera los fracasos bizantinos se da fortaleciendo la restricción de integridad:
El problema del consenso puede considerarse en el caso de sistemas asincrónicos o sincrónicos. Si bien las comunicaciones del mundo real suelen ser inherentemente asincrónicas, resulta más práctico y a menudo más fácil modelar sistemas sincrónicos, [4] dado que los sistemas asincrónicos naturalmente implican más problemas que los sincrónicos.
En los sistemas sincrónicos, se supone que todas las comunicaciones se realizan en rondas . En una ronda, un proceso puede enviar todos los mensajes que necesita y, al mismo tiempo, recibir todos los mensajes de otros procesos. De esta manera, ningún mensaje de una ronda puede influir en los mensajes enviados dentro de la misma ronda.
En un sistema distribuido de paso de mensajes totalmente asincrónico, en el que al menos un proceso puede tener una falla por caída , se ha demostrado en el famoso resultado de imposibilidad FLP de 1985 de Fischer, Lynch y Paterson que un algoritmo determinista para lograr el consenso es imposible. [5] Este resultado de imposibilidad se deriva de los escenarios de programación del peor caso, que es poco probable que ocurran en la práctica, excepto en situaciones adversas como un atacante inteligente de denegación de servicio en la red. En la mayoría de las situaciones normales, la programación de procesos tiene un grado de aleatoriedad natural. [4]
En un modelo asincrónico, algunas formas de fallas pueden ser manejadas por un protocolo de consenso sincrónico. Por ejemplo, la pérdida de un enlace de comunicación puede ser modelada como un proceso que ha sufrido una falla bizantina.
Los algoritmos de consenso aleatorio pueden eludir el resultado de imposibilidad de FLP al lograr seguridad y actividad con una probabilidad abrumadora, incluso en los peores escenarios de programación, como un atacante inteligente de denegación de servicio en la red. [6]
Los algoritmos de consenso tradicionalmente suponen que el conjunto de nodos participantes es fijo y dado desde el principio: es decir, que algún proceso de configuración previo (manual o automático) ha autorizado a un grupo particular conocido de participantes que pueden autenticarse entre sí como miembros del grupo. En ausencia de un grupo cerrado y bien definido con miembros autenticados, un ataque Sybil contra un grupo de consenso abierto puede derrotar incluso a un algoritmo de consenso bizantino, simplemente creando suficientes participantes virtuales para superar el umbral de tolerancia a fallas.
Un protocolo de consenso sin permiso , por el contrario, permite que cualquiera en la red se una dinámicamente y participe sin permiso previo, pero en su lugar impone una forma diferente de costo artificial o barrera de entrada para mitigar la amenaza de ataque Sybil . Bitcoin introdujo el primer protocolo de consenso sin permiso usando prueba de trabajo y una función de ajuste de dificultad, en el que los participantes compiten para resolver acertijos criptográficos y ganan probabilísticamente el derecho a comprometer bloques y ganar recompensas asociadas en proporción a su esfuerzo computacional invertido. Motivados en parte por el alto costo energético de este enfoque, los protocolos de consenso sin permiso posteriores han propuesto o adoptado otras reglas de participación alternativas para la protección contra ataques Sybil, como prueba de participación , prueba de espacio y prueba de autoridad .
A continuación se presentan tres problemas de acuerdo de interés:
Una colección de procesos, numerados de a a comunicarse mediante el envío de mensajes entre sí. El proceso debe transmitir un valor a todos los procesos de manera que:
También se conoce como el problema del general.
Los requisitos formales para un protocolo de consenso pueden incluir:
Para n procesos en un sistema parcialmente sincrónico (el sistema alterna entre períodos buenos y malos de sincronía), cada proceso elige un valor privado. Los procesos se comunican entre sí mediante rondas para determinar un valor público y generar un vector de consenso con los siguientes requisitos: [7]
Se puede demostrar que las variaciones de estos problemas son equivalentes en el sentido de que la solución de un problema en un tipo de modelo puede ser la solución de otro problema en otro tipo de modelo. Por ejemplo, una solución al problema general bizantino débil en un modelo de paso de mensajes autenticado sincrónico conduce a una solución para la consistencia interactiva débil. [8] Un algoritmo de consistencia interactiva puede resolver el problema de consenso haciendo que cada proceso elija el valor mayoritario en su vector de consenso como su valor de consenso. [9]
Existe un protocolo síncrono anónimo t-resiliente que resuelve el problema de los generales bizantinos , [10] [11] si y el caso de los generales bizantinos débiles [8] donde es el número de fallas y es el número de procesos.
Para los sistemas con procesadores, de los cuales son bizantinos, se ha demostrado que no existe ningún algoritmo que resuelva el problema de consenso para en el modelo de mensajes orales . [12] La prueba se construye mostrando primero la imposibilidad para el caso de tres nodos y usando este resultado para argumentar sobre particiones de procesadores. En el modelo de mensajes escritos hay protocolos que pueden tolerar . [2]
En un sistema completamente asincrónico no existe una solución de consenso que pueda tolerar uno o más fallos de bloqueo incluso cuando solo se requiere la propiedad de no trivialidad. [5] Este resultado a veces se denomina prueba de imposibilidad FLP en honor a los autores Michael J. Fischer , Nancy Lynch y Mike Paterson , quienes recibieron un premio Dijkstra por este importante trabajo. El resultado FLP se ha verificado mecánicamente para que se mantenga incluso bajo supuestos de imparcialidad . [13] Sin embargo, FLP no afirma que nunca se pueda alcanzar el consenso: simplemente que bajo los supuestos del modelo, ningún algoritmo siempre puede alcanzar el consenso en un tiempo acotado. En la práctica, es muy poco probable que ocurra.
El algoritmo de consenso Paxos de Leslie Lamport y sus variantes, como Raft , se utilizan de forma generalizada en sistemas informáticos distribuidos y en la nube ampliamente implementados . Estos algoritmos suelen ser sincrónicos, dependen de un líder elegido para avanzar y solo toleran fallos y no fallas bizantinas.
Un ejemplo de un protocolo de consenso binario de tiempo polinomial que tolera fallas bizantinas es el algoritmo Phase King de Garay y Berman. [14] El algoritmo resuelve el consenso en un modelo de paso de mensajes sincrónico con n procesos y hasta f fallas, siempre que n > 4 f . En el algoritmo Phase King, hay f + 1 fases, con 2 rondas por fase. Cada proceso realiza un seguimiento de su salida preferida (inicialmente igual al valor de entrada del propio proceso). En la primera ronda de cada fase, cada proceso transmite su propio valor preferido a todos los demás procesos. Luego recibe los valores de todos los procesos y determina qué valor es el valor mayoritario y su recuento. En la segunda ronda de la fase, el proceso cuyo id coincide con el número de fase actual se designa como el rey de la fase. El rey transmite el valor mayoritario que observó en la primera ronda y sirve como desempate. Luego, cada proceso actualiza su valor preferido de la siguiente manera. Si el recuento del valor mayoritario observado por el proceso en la primera ronda es mayor que n /2 + f , el proceso cambia su preferencia a ese valor mayoritario; de lo contrario, utiliza el valor del rey de la fase. Al final de f + 1 fases, los procesos muestran sus valores preferidos.
Google ha implementado una biblioteca de servicios de bloqueo distribuidos llamada Chubby . [15] Chubby mantiene la información de bloqueo en pequeños archivos que se almacenan en una base de datos replicada para lograr una alta disponibilidad en caso de fallas. La base de datos se implementa sobre una capa de registro tolerante a fallas que se basa en el algoritmo de consenso de Paxos . En este esquema, los clientes de Chubby se comunican con el maestro de Paxos para acceder/actualizar el registro replicado; es decir, leer/escribir en los archivos. [16]
Muchos juegos de estrategia en tiempo real en línea entre pares utilizan un protocolo Lockstep modificado como protocolo de consenso para gestionar el estado del juego entre los jugadores de un juego. Cada acción del juego da como resultado una transmisión delta del estado del juego a todos los demás jugadores del juego junto con un hash del estado total del juego. Cada jugador valida el cambio aplicando el delta a su propio estado del juego y comparando los hashes del estado del juego. Si los hashes no coinciden, se realiza una votación y aquellos jugadores cuyo estado del juego está en minoría se desconectan y se eliminan del juego (lo que se conoce como desincronización).
Otro enfoque bien conocido son los llamados algoritmos de tipo MSR, que se han utilizado ampliamente en la ciencia informática y la teoría de control. [17] [18] [19]
Bitcoin utiliza una prueba de trabajo , una función de ajuste de dificultad y una función de reorganización para lograr un consenso sin permisos en su red abierta entre pares . Para extender la cadena de bloques o el libro mayor distribuido de Bitcoin , los mineros intentan resolver un rompecabezas criptográfico, donde la probabilidad de encontrar una solución es proporcional al esfuerzo computacional gastado en hashes por segundo. El nodo que primero resuelve dicho rompecabezas tiene su versión propuesta del siguiente bloque de transacciones agregada al libro mayor y eventualmente aceptada por todos los demás nodos. Como cualquier nodo en la red puede intentar resolver el problema de la prueba de trabajo, un ataque Sybil es inviable en principio a menos que el atacante tenga más del 50% de los recursos computacionales de la red.
Otras criptomonedas (por ejemplo, Ethereum , NEO, STRATIS, ...) utilizan prueba de participación , en la que los nodos compiten para agregar bloques y ganar recompensas asociadas en proporción a la participación , o criptomonedas existentes asignadas y bloqueadas o apostadas por un período de tiempo determinado. Una ventaja de un sistema de "prueba de participación" sobre un sistema de "prueba de trabajo" es el alto consumo de energía que demanda este último. Como ejemplo, se estima que la minería de bitcoins (2018) consume fuentes de energía no renovables en una cantidad similar a la de todas las naciones de la República Checa o Jordania, mientras que el consumo total de energía de Ethereum, la red de prueba de participación más grande, es apenas inferior al de 205 hogares estadounidenses promedio. [29] [30] [31]
Algunas criptomonedas, como Ripple, utilizan un sistema de nodos de validación para validar el libro de contabilidad. Este sistema utilizado por Ripple, llamado Ripple Protocol Consensus Algorithm (RPCA), funciona en rondas:
Otras reglas de participación utilizadas en protocolos de consenso sin permiso para imponer barreras de entrada y resistir ataques de sibila incluyen prueba de autoridad , prueba de espacio , prueba de quema o prueba de tiempo transcurrido.
En contraste con las reglas de participación sin permiso mencionadas anteriormente, todas las cuales recompensan a los participantes en proporción a la cantidad de inversión en alguna acción o recurso, los protocolos de prueba de personalidad apuntan a dar a cada participante humano real exactamente una unidad de poder de voto en el consenso sin permiso, independientemente de la inversión económica. [33] [34] Los enfoques propuestos para lograr una distribución de poder de consenso de uno por persona para la prueba de personalidad incluyen partidos con seudónimos físicos, [35] redes sociales, [36] identidades emitidas por el gobierno seudónimas, [37] y biometría. [38]
Para resolver el problema del consenso en un sistema de memoria compartida, se deben introducir objetos concurrentes. Un objeto concurrente, u objeto compartido, es una estructura de datos que ayuda a los procesos concurrentes a comunicarse para llegar a un acuerdo. Las implementaciones tradicionales que utilizan secciones críticas se enfrentan al riesgo de bloquearse si algún proceso muere dentro de la sección crítica o permanece inactivo durante un tiempo intolerablemente largo. Los investigadores definieron la libertad de espera como la garantía de que el algoritmo se complete en un número finito de pasos.
El número de consenso de un objeto concurrente se define como el número máximo de procesos en el sistema que pueden alcanzar el consenso por el objeto dado en una implementación sin espera. [39] Los objetos con un número de consenso de pueden implementar cualquier objeto con un número de consenso de o menor, pero no pueden implementar ningún objeto con un número de consenso mayor. Los números de consenso forman lo que se denomina la jerarquía de objetos de sincronización de Herlihy . [40]
Según la jerarquía, los registros de lectura/escritura no pueden resolver el consenso ni siquiera en un sistema de dos procesos. Las estructuras de datos como pilas y colas solo pueden resolver el consenso entre dos procesos. Sin embargo, algunos objetos concurrentes son universales (anotados en la tabla con ), lo que significa que pueden resolver el consenso entre cualquier número de procesos y pueden simular cualquier otro objeto a través de una secuencia de operaciones. [39]
{{cite book}}
: |journal=
ignorado ( ayuda )