Când a apărut problema, echipa de inginerie Sui a diagnosticat rapid problema și a lansat o soluție, care a fost apoi implementată de nodurile de validare, minimizând astfel timpul de întrerupere a rețelei.

Prezentare generală a evenimentului

Între aproximativ 1:15 și 3:45 AM, ora Pacificului, 21 noiembrie 2024 (ora 17:15 - 19:45, ora estică), rețeaua principală Sui a suferit o întrerupere completă. Toate nodurile de validare au intrat într-un ciclu de prăbușire, provocând o întrerupere completă a procesării tranzacțiilor.

Cauza problemei

În codul de control al blocajului, assert! a declanșat o eroare: dacă costul estimat al execuției este zero, aceasta va duce la prăbușirea nodului de validare. Această problemă apare numai dacă sunt îndeplinite toate condițiile următoare:

1. Controlul blocajului setat pe modul TotalGasBudgetWithCap:

  • Acest mod a fost activat temporar în versiunea protocolului 63, iar apoi a fost retras, fiind 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:

  • Inputuri 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 blocajului?

Rețeaua Sui, bazată pe arhitectura obiectelor, suportă procesarea paralelă la scară largă a diferitelor tranzacții ale utilizatorilor, lucru imposibil de realizat în majoritatea altor rețele. Cu toate acestea, dacă mai multe tranzacții scriu simultan pe același obiect partajat, aceste tranzacții trebuie să fie executate în ordine, iar volumul de procesare a tranzacțiilor implicând acel obiect specific are o limită.

Sistemul de control al blocajului previne supraîncărcarea rețelei prin limitarea ratei de scriere a tranzacțiilor pe același obiect partajat, pentru a evita verificările de puncte de control care durează prea mult timp.

Recent am îmbunătățit sistemul de control al blocajelor pentru a crește utilizarea obiectelor partajate prin estimarea mai precisă a complexității tranzacțiilor. Dar codul noului mod TotalGasBudgetWithCap avea un bug, care a dus la apariția acestei probleme.

Cum rezolvăm problema?

După stabilirea problemei, corectarea codului a fost foarte directă (vezi PR #20365). Această corectare a fost implementată pe rețeaua principală (v1.37.4) și pe rețeaua de testare (v1.38.1).

PR #20365: Modificarea bump_object_execution_cost pentru a utiliza adunarea saturată și a permite tranzacții cu cost zero.

🌟 Rețeaua principală v1.37.4:https://github.com/MystenLabs/sui/releases

În urma răspunsului activ al comunității nodurilor de validare, a durat doar 15 minute de la lansarea corectării până la restabilirea rețelei Sui la normalitate.

Ce am învățat?

  • Sistemul de detectare și răspuns la evenimente funcționează bine: Alarmele automate și raportările comunității au fost activate aproape simultan, iar noi am mobilizat rapid resursele echipei pentru diagnosticare și corectare.

  • Comunitatea nodurilor de validare a performat excelent: După lansarea corectării, rețeaua Sui s-a restabilit aproape imediat.

Măsuri preventive

  1. Îmbunătățirea sistemului de teste: Adăugarea mai multor tipuri de tranzacții adverse similare care au declanșat această prăbușire pentru a descoperi problemele potențiale.

  2. Optimizarea procesului de construire: Creșterea vitezei de generare a binarelor pentru depanare și lansare, reducând în continuare timpul de răspuns la evenimente. O parte din timpul în acest proces de întrerupere a fost cauzat de așteptarea construirii versiunii de lansare.

Mulțumim comunității și nodurilor de validare pentru suportul acordat, asigurând o recuperare rapidă a rețelei Sui!