Lorsque le problème s'est produit, l'équipe d'ingénierie Sui a rapidement diagnostiqué le problème et publié un correctif, qui a ensuite été déployé par les nœuds de validation, minimisant ainsi le temps d'interruption du réseau.
Aperçu des événements
Entre environ 1h15 et 3h45 heure du Pacifique le 21 novembre 2024 (heure de Beijing : 21 novembre 2024 de 17h15 à 19h45), le mainnet Sui a connu une panne complète du réseau. Tous les nœuds de validation ont été pris dans une boucle de crash, entraînant une interruption totale du traitement des transactions.
Cause du problème
L'assertion ! dans le code de contrôle de blocage a déclenché une erreur : si le coût d'exécution estimé est zéro, cela provoquera un crash des nœuds de validation. Ce problème ne se produit qu'en satisfaisant toutes les conditions suivantes :
1. Le contrôle de blocage est réglé sur le mode TotalGasBudgetWithCap :
Ce mode a été brièvement activé dans la version de protocole 63 avant d'être révoqué, puis réactivé dans la version de protocole 68 avec le planificateur cumulé.
2. Le réseau a reçu des transactions contenant simultanément les conditions suivantes :
Entrée d'objet partagé variable
Zéro instruction MoveCall
Lorsque le réseau reçoit ce type de transaction, tous les nœuds de validation s'effondrent immédiatement.
Qu'est-ce que le contrôle de blocage ?
L'architecture basée sur des objets du réseau Sui prend en charge le traitement parallèle à grande échelle de différentes transactions utilisateurs, ce qui n'est pas réalisable sur la plupart des autres réseaux. Cependant, si plusieurs transactions écrivent simultanément sur le même objet partagé, ces transactions doivent être exécutées dans l'ordre, et il existe une limite sur le volume de traitement des transactions impliquant cet objet spécifique.
Le système de contrôle de blocage empêche le réseau d'être surchargé par des points de contrôle ayant des temps d'exécution trop longs en limitant le taux de transactions écrivant sur le même objet partagé.
Nous avons récemment mis à jour le système de contrôle de blocage pour améliorer l'utilisation des objets partagés en estimant plus précisément la complexité des transactions. Cependant, il y avait un bug dans le code du nouveau mode TotalGasBudgetWithCap, ce qui a conduit à ce problème.
Comment résoudre le problème ?
Une fois le problème établi, la correction du code était très directe (voir PR #20365). Ce correctif a été déployé sur le mainnet (v1.37.4) et le testnet (v1.38.1).
PR #20365 : Modifiez bump_object_execution_cost pour utiliser l'addition saturée et permettre les transactions à coût zéro.
🌟 Mainnet v1.37.4:https://github.com/MystenLabs/sui/releases
En réponse active de la communauté des nœuds de validation, il n'a fallu que 15 minutes entre la publication du correctif et la restauration normale du réseau Sui.
Qu'avons-nous appris ?
Le système de détection et de réponse aux événements fonctionne bien : les alertes automatiques et les rapports de la communauté ont presque été déclenchés simultanément, et nous avons rapidement mobilisé les ressources de l'équipe pour le diagnostic et la correction.
La communauté des nœuds de validation a excellé : après la publication du correctif, le réseau Sui a presque immédiatement retrouvé son état normal.
Mesures préventives
Améliorer le système de test : Ajouter davantage de types de transactions adversariales similaires à celles ayant déclenché ce crash pour identifier des problèmes potentiels.
Optimiser le processus de construction : Améliorer la vitesse de génération des fichiers binaires pour le débogage et la publication, réduisant ainsi davantage le temps de réponse aux événements. Une partie du temps d'interruption a été due à l'attente de la construction de la version publiée.
Merci pour le soutien de la communauté et des nœuds de validation, qui ont assuré un rétablissement rapide du réseau Sui !