Cuando ocurrió el problema, el equipo de ingeniería de Sui diagnosticó rápidamente el problema y publicó una solución, que luego fue desplegada por los nodos de validación, minimizando así el tiempo de interrupción de la red.
Resumen de eventos
Entre aproximadamente las 1:15 y las 3:45 a.m. hora del Pacífico el 21 de noviembre de 2024 (hora de China: 21 de noviembre de 2024, 5:15 p.m. a 7:45 p.m.), la red principal de Sui experimentó una completa congestión de red. Todos los nodos de validación entraron en un ciclo de fallos, lo que llevó a una interrupción total del procesamiento de transacciones.
Causa del problema
Se activó un error en el código de control de bloqueo: si el costo de ejecución estimado es cero, provocará un fallo en los nodos de validación. Este problema se produce si se cumplen todas las siguientes condiciones:
1. Control de bloqueo configurado en modo TotalGasBudgetWithCap:
Este modo fue deshabilitado brevemente después de ser habilitado en la versión 63 del protocolo, y luego se volvió a habilitar en la versión 68 del protocolo con el programador acumulativo.
2. La red recibió transacciones que contenían simultáneamente las siguientes condiciones:
Entrada de objeto compartido variable
Cero instrucciones MoveCall
Cuando la red recibe este tipo de transacciones, todos los nodos de validación colapsan inmediatamente.
¿Qué es el control de bloqueo?
La arquitectura basada en objetos de la red Sui admite el procesamiento paralelo a gran escala de diferentes transacciones de usuarios, algo que no se puede lograr en la mayoría de otras redes. Sin embargo, si múltiples transacciones intentan escribir en el mismo objeto compartido al mismo tiempo, dichas transacciones deben ejecutarse en orden, y existe un límite en la cantidad de transacciones que pueden procesarse para ese objeto específico.
El sistema de control de bloqueo evita que la red se sobrecargue limitando la tasa de transacciones que escriben en el mismo objeto compartido, previniendo puntos de control que tarden demasiado en ejecutarse.
Recientemente hemos actualizado el sistema de control de bloqueo para mejorar la utilización de objetos compartidos al estimar con mayor precisión la complejidad de las transacciones. Sin embargo, hay un error en el código del nuevo modo TotalGasBudgetWithCap que causó este problema.
¿Cómo resolver el problema?
Una vez que se estableció el problema, la corrección del código fue bastante directa (ver PR #20365). Esta corrección se ha desplegado en la red principal (v1.37.4) y en la red de prueba (v1.38.1).
PR #20365: Modificar bump_object_execution_cost para utilizar suma saturada y permitir transacciones de costo cero.
🌟 Red principal v1.37.4:https://github.com/MystenLabs/sui/releases
Gracias a la respuesta activa de la comunidad de nodos de validación, solo tomó 15 minutos desde la publicación de la corrección hasta que la red Sui volvió a la normalidad.
¿Qué hemos aprendido?
El sistema de detección y respuesta a eventos funcionó bien: las alertas automáticas y los informes de la comunidad se activaron casi simultáneamente, y movilizamos rápidamente los recursos del equipo para el diagnóstico y la corrección.
La comunidad de nodos de validación se desempeñó excepcionalmente: después de la publicación de la corrección, la red Sui casi inmediatamente volvió a la normalidad.
Medidas preventivas
Mejorar el sistema de pruebas: Aumentar más tipos de transacciones adversariales que desencadenen este tipo de fallos para descubrir problemas potenciales.
Optimizar el proceso de construcción: Aumentar la velocidad de generación de archivos binarios para depuración y lanzamiento, y reducir aún más el tiempo de respuesta a eventos. Una parte del tiempo de interrupción fue debido a la espera para construir la versión de lanzamiento.
¡Gracias al apoyo de la comunidad y de los nodos de validación, se logró asegurar una rápida recuperación de la red Sui!