Panoramica dell'evento
Tra le 1:15 e le 3:45 del 21 novembre 2024 (ora del Pacifico) (ora del fuso orario +8: 21 novembre 2024 dalle 5:15 alle 7:45), la rete principale Sui ha subito un completo blocco della rete. Tutti i nodi di validazione sono entrati in un ciclo di crash, causando un'interruzione totale dell'elaborazione delle transazioni.
Causa del problema
L'assert! nel codice di controllo del blocco ha attivato un errore: se il costo di esecuzione stimato è zero, ciò provoca il crash dei nodi di validazione. Questo problema si verifica solo se sono soddisfatte tutte le seguenti condizioni:
1. Il controllo del blocco è impostato in modalità TotalGasBudgetWithCap:
Questo modello è stato abilitato brevemente nella versione del protocollo 63 e poi revocato, per essere riabilitato successivamente nella versione 68 con il programmatore cumulativo.
2. La rete ha ricevuto transazioni che soddisfano contemporaneamente le seguenti condizioni:
Input di oggetti condivisi variabili
Zero istruzioni MoveCall
Quando la rete riceve transazioni di questo tipo, tutti i nodi di validazione vanno immediatamente in crash.
Cos'è il controllo del blocco?
L'architettura basata su oggetti della rete Sui supporta l'elaborazione parallela su larga scala di transazioni utente diverse, cosa che non è possibile nella maggior parte delle altre reti. Tuttavia, se più transazioni scrivono contemporaneamente sullo stesso oggetto condiviso, queste transazioni devono essere eseguite in sequenza e c'è un limite alla quantità di elaborazione delle transazioni che coinvolgono quell'oggetto specifico.
Il sistema di controllo del blocco impedisce al network di sovraccaricarsi a causa di checkpoint con tempi di esecuzione troppo lunghi, limitando il tasso di transazioni che scrivono sullo stesso oggetto condiviso.
Abbiamo recentemente aggiornato il sistema di controllo del blocco per migliorare l'utilizzo degli oggetti condivisi stimando più accuratamente la complessità delle transazioni. Tuttavia, c'è un bug nel codice del nuovo modello TotalGasBudgetWithCap che ha causato questo problema.
Come risolvere il problema?
Dopo aver stabilito il problema, la correzione del codice è stata piuttosto diretta (vedi PR #20365). Questa correzione è stata distribuita sulla rete principale (v1.37.4) e sulla rete di test (v1.38.1).
PR #20365: modificare bump_object_execution_cost per utilizzare l'addizione saturata e consentire transazioni a costo zero.
🌟 Mainnet v1.37.4:
https://github.com/MystenLabs/sui/releases
Grazie alla reazione attiva della comunità dei nodi di validazione, ci sono voluti solo 15 minuti dalla pubblicazione della correzione al ripristino normale della rete Sui.
Cosa abbiamo imparato?
Il sistema di rilevamento e risposta agli eventi funziona bene: gli allarmi automatici e i rapporti della comunità si attivano quasi simultaneamente, e mobilitiamo rapidamente le risorse del team per la diagnosi e la riparazione.
La comunità dei nodi di validazione ha dato prova di grande competenza: dopo la pubblicazione della correzione, la rete Sui è tornata quasi immediatamente alla normalità.
Misure preventive
Migliorare il sistema di test: aggiungere più tipi di transazioni antagoniste simili che hanno innescato questo crash per scoprire potenziali problemi.
Ottimizzare il processo di build: aumentare la velocità di generazione dei file binari per il debug e la pubblicazione, riducendo ulteriormente il tempo di risposta agli eventi. Una parte del tempo durante questo processo di interruzione è stata dovuta all'attesa per la costruzione della versione pubblicata.
Grazie al supporto della comunità e dei nodi di validazione, abbiamo assicurato un rapido ripristino della rete Sui!