Ereignisübersicht
Zwischen etwa 1:15 und 3:45 Uhr Pazifischer Zeit am 21. November 2024 (17:15 bis 19:45 Uhr Ostzeit) gab es eine vollständige Netzwerkstilllegung im Sui-Hauptnetz. Alle Validierungsnoten gerieten in eine Absturzschleife, was zu einem vollständigen Stopp der Transaktionsverarbeitung führte.
Ursache des Problems
Der assert!-Befehl im Blockierungssteuerungscode hat einen Fehler ausgelöst: Wenn die geschätzten Ausführungskosten null sind, führt dies zum Absturz der Validierungsnodene. Dieses Problem tritt auf, wenn alle folgenden Bedingungen erfüllt sind:
1. Blockierungssteuerung im Modus TotalGasBudgetWithCap gesetzt:
Dieser Modus wurde nach kurzer Aktivierung in Protokollversion 63 zurückgezogen und später in Protokollversion 68 mit dem kumulativen Scheduler erneut aktiviert.
2. Das Netzwerk hat Transaktionen empfangen, die gleichzeitig die folgenden Bedingungen enthalten:
Veränderbare gemeinsame Objekt-Eingaben
Null MoveCall-Anweisungen
Wenn das Netzwerk solche Transaktionen empfängt, stürzen alle Validierungsnoten sofort ab.
Was ist Blockierungssteuerung?
Die objektbasierte Architektur des Sui-Netzwerks unterstützt eine großflächige parallele Verarbeitung unterschiedlicher Benutzertransaktionen, was in den meisten anderen Netzwerken nicht möglich ist. Wenn jedoch mehrere Transaktionen gleichzeitig auf dasselbe gemeinsame Objekt schreiben, müssen diese Transaktionen in einer bestimmten Reihenfolge ausgeführt werden, und es gibt eine Obergrenze für die Verarbeitung von Transaktionen, die dieses bestimmte Objekt betreffen.
Das Blockierungssteuerungssystem verhindert eine Überlastung des Netzwerks durch Einschränkung der Transaktionsrate, die auf dasselbe gemeinsam genutzte Objekt schreibt, um zu lange Ausführungszeiten von Prüfungen zu vermeiden.
Wir haben unser Blockierungssteuerungssystem kürzlich aufgerüstet, um die Nutzung von gemeinsam genutzten Objekten durch genauere Schätzungen der Transaktionskomplexität zu verbessern. Im Code des neuen Modus TotalGasBudgetWithCap gibt es jedoch einen Fehler, der dieses Problem verursacht hat.
Wie lösen wir das Problem?
Nachdem das Problem festgestellt wurde, war die Codebehebung sehr direkt (siehe PR #20365). Diese Behebung wurde im Hauptnetz (v1.37.4) und im Testnetz (v1.38.1) bereitgestellt.
PR #20365: Ändern der bump_object_execution_cost, um gesättigte Addition zu verwenden und Transaktionen mit null Kosten zuzulassen.
🌟 Hauptnetz v1.37.4:
https://github.com/MystenLabs/sui/releases
Dank der aktiven Reaktion der Validierungsnodengemeinschaft dauerte es nur 15 Minuten vom Veröffentlichungsfix bis zur Wiederherstellung des Sui-Netzwerks.
Was haben wir gelernt?
Das Ereignisdetektions- und Reaktionssystem funktioniert gut: Automatische Warnungen und Community-Berichte wurden fast gleichzeitig ausgelöst, und wir haben schnell Teamressourcen für Diagnose und Reparatur mobilisiert.
Die Validierungsnodengemeinschaft hat hervorragende Leistungen gezeigt: Nach der Veröffentlichung des Fixes stellte sich das Sui-Netzwerk fast sofort wieder normal ein.
Präventionsmaßnahmen
Verbesserung des Testsystems: Hinzufügen von mehr konfrontativen Transaktionstypen, die diesen Absturz ausgelöst haben, um potenzielle Probleme zu identifizieren.
Optimierung des Build-Prozesses: Erhöhung der Geschwindigkeit bei der Erstellung von Debug- und Release-Binärdateien, um die Reaktionszeit auf Ereignisse weiter zu verkürzen. Ein Teil der Unterbrechungszeit war auf das Warten auf die Erstellung der veröffentlichten Version zurückzuführen.
Vielen Dank an die Gemeinschaft und die Validierungsnoten für ihre Unterstützung, die zu einer schnellen Wiederherstellung des Sui-Netzwerks beigetragen hat!