Prezentare generală a evenimentului
Între aproximativ ora 1:15 și 3:45 PM, ora Pacificului, pe 21 noiembrie 2024 (ora GMT+8: 21 noiembrie 2024, între 5:15 PM și 7:45 PM), rețeaua principală Sui a suferit o blocare totală. Toate nodurile de validare au intrat într-un ciclu de prăbușire, ducând la o întrerupere completă a procesării tranzacțiilor.
Cauza problemei
Codul de control al blocării a declanșat o eroare: dacă costul de execuție estimat este zero, nodurile de validare se prăbușesc. Această problemă apare dacă sunt îndeplinite toate următoarele condiții:
1. Controlul blocării a fost setat pe modul TotalGasBudgetWithCap:
Acest mod a fost activat temporar în versiunea protocolului 63, dar a fost retras ulterior și reactivat din nou în versiunea protocolului 68 cu programatorul cumulativ.
2. Rețeaua a primit tranzacții care conțin simultan următoarele condiții:
Intrări de obiecte partajate variabile
Zero instrucțiuni MoveCall
Când rețeaua primește astfel de tranzacții, toate nodurile de validare se prăbușesc imediat.
Ce este controlul blocării?
Rețeaua Sui, bazată pe o arhitectură de obiecte, suportă procesarea paralelă la scară largă a diferitelor tranzacții utilizator, ceea ce nu este posibil în majoritatea altor rețele. Cu toate acestea, dacă mai multe tranzacții scriu simultan în același obiect partajat, aceste tranzacții trebuie să fie executate în ordine, iar volumul de procesare al tranzacțiilor implicând acel obiect specific are o limită.
Sistemul de control al blocării previne supraîncărcarea rețelei prin limitarea ratei tranzacțiilor care scriu în același obiect partajat, pentru a evita punctele de control cu un timp de execuție prea lung.
Recent am actualizat sistemul de control al blocării pentru a îmbunătăți utilizarea obiectelor partajate prin estimarea mai precisă a complexității tranzacțiilor. Totuși, în codul noii metode TotalGasBudgetWithCap există o eroare care a dus la această problemă.
Cum să rezolvăm problema?
După stabilirea problemei, corectarea codului a fost foarte directă (vezi PR #20365). Această corectare a fost implementată în rețeaua principală (v1.37.4) și în rețeaua de testare (v1.38.1).
PR #20365: A modificat bump_object_execution_cost pentru a folosi adunarea saturată și a permis tranzacții cu cost zero.
🌟 Rețeaua principală v1.37.4:
https://github.com/MystenLabs/sui/releases
În urma unui răspuns activ din partea comunității nodurilor de validare, de la publicarea corecției până la restabilirea normalității rețelei Sui a trecut doar 15 minute.
Ce am învățat?
Sistemul de detectare și răspuns la evenimente funcționează bine: alertele automate și raportările comunității au fost declanșate aproape simultan, iar noi am mobilizat rapid resursele echipei pentru diagnosticare și corectare.
Comunitatea nodurilor de validare a performat excelent: După publicarea corecției, rețeaua Sui a fost aproape imediat restabilită.
Măsuri de prevenire
Îmbunătățirea sistemului de testare: Adăugarea mai multor tipuri de tranzacții de adversitate similare cu cele care au declanșat această prăbușire, pentru a descoperi problemele potențiale.
Optimizarea procesului de construcție: Creșterea vitezei de generare a fișierelor binare de debug și publicare, reducând în continuare timpul de răspuns la evenimente. O parte din timpul acestui proces de întrerupere a fost cauzat de așteptarea construirii versiunii publicate.
Mulțumim comunității și nodurilor de validare pentru suport, care au asigurat o recuperare rapidă a rețelei Sui!