Secondo un'analisi post-mortem della Fondazione Sui, la mainnet di Sui ha subito tre interruzioni distinte tra il 28 e il 29 maggio, a seguito del rilascio della versione 1.72 che ha evidenziato dei casi limite nella logica di addebito del gas e di riavvio dei validatori. La fondazione ha affermato che i problemi sono stati risolti, l'attività di rete è ripresa e "nessun fondo degli utenti è stato a rischio".
Gli incidenti sono iniziati giovedì 28 maggio, quando la rete principale di Sui si è bloccata intorno alle 7:00 PT ed è rimasta fuori servizio fino alle 13:30 circa PT. Una seconda interruzione si è verificata venerdì mattina, a partire dalle 5:00 circa PT e terminando intorno alle 8:30 PT. La terza interruzione è iniziata venerdì pomeriggio intorno alle 13:30 PT ed è stata risolta intorno alle 19:20 PT.
Secondo la fondazione, le prime due interruzioni sono state causate da bug che provocavano arresti anomali legati all'interazione tra la logica di addebito del gas e l'aggiornamento 1.72 di Sui, che ha introdotto il bilanciamento degli indirizzi. La terza interruzione è stata separata, innescata durante un cambio di epoca programmato dopo che i riavvii del validatore hanno rivelato un bug latente nel modo in cui veniva preservato lo stato di casualità.
"Durante le interruzioni, nessun fondo degli utenti è stato a rischio e la rete non ha annullato alcuna transazione confermata al momento della ripresa del servizio", ha dichiarato la Fondazione Sui. "Ad oggi, i validatori hanno risolto completamente i problemi noti causati sia dal bug originale relativo al pagamento del gas che dal bug relativo allo stato casuale, e l'attività di rete è ripresa."
Bug di ricarica del gas Sui che innesca arresti iniziali
Il primo problema riguardava la nuova funzionalità di saldo degli indirizzi di Sui, che consente agli utenti di conservare fondi e pagare le commissioni di transazione (gas) senza dover dipendere esclusivamente dagli oggetti coin. Le transazioni su Sui possono essere pagate tramite saldo degli indirizzi, oggetti coin o una struttura ibrida che combina entrambi.
Il caso limite è emerso in quel percorso ibrido del gas. Quando una transazione ha tentato di spendere da un saldo di indirizzo che non era sufficiente a coprire le transazioni concorrenti, lo scheduler l'ha correttamente annullata con un errore InsufficientFundsForWithdraw. Ma in seguito, durante il gas smashing, ovvero il processo di combinazione delle monete in ingresso in un'unica moneta che paga gas, la stessa prenotazione poteva ancora tentare di addebitare nuovamente i fondi.
Secondo la spiegazione della fondazione, il crollo non si è verificato direttamente durante la fase di gas smashing, bensì durante la fase di regolamento, quando le differenze di saldo sono state riconciliate tramite una transazione di sistema. Un delta negativo applicato a un saldo pari a zero ha causato un underflow.
La soluzione immediata era concettualmente semplice: evitare il gas smashing quando una transazione viene annullata con InsufficientFundsForWithdraw. I validatori hanno adottato questa correzione giovedì, riportando la rete online. Tuttavia, la fondazione ha riconosciuto che la patch era una misura provvisoria, scelta per ripristinare la rete mentre gli ingegneri sviluppavano una soluzione più completa.
"Modificare la logica del gas è un'operazione delicata", ha scritto la fondazione. "Come spiegato in precedenza, esistono complesse interazioni tra i saldi degli indirizzi e le monete. Oltre alla correzione dei bug, le modifiche alla logica del gas devono preservare tutto il comportamento precedente o utilizzare un sistema di controllo delle versioni appropriato."
Quella patch provvisoria conteneva una vulnerabilità nota. Se una transazione presentava più motivi di annullamento, un altro errore poteva mascherare la condizione "InsufficientFundsForWithdraw" (Fondi insufficienti per il prelievo). Quando ciò è accaduto venerdì mattina, il percorso di underflow originale poteva ancora essere raggiunto, causando un secondo blocco.
Epoch Change ha esposto un bug di stato casuale
La terza interruzione si è verificata dopo che la rete aveva ripreso il normale funzionamento venerdì mattina. Al successivo cambio di epoca programmato, i validatori non sono riusciti a completare la transizione a causa di un bug legato al protocollo di generazione di chiavi distribuite di Sui, o DKG, che avvia la casualità per le transazioni che dipendono dalla casualità on-chain.
Durante il precedente ciclo di riavvio, la partecipazione non era sufficientemente elevata per il processo DKG dell'epoca successiva, quindi la casualità è stata disabilitata come previsto. Il problema è stato che il verdetto di fallimento non è stato scritto su disco. Quando i validatori si sono riavviati, sono ripartiti senza ricordare che DKG aveva fallito.
"Dato che i validatori non ricordavano più che DKG aveva fallito, nessuna delle due cose poteva accadere, la coda in pausa cresceva e la logica di fine epoca, che deve svuotare quella coda prima di chiudere, rimaneva in attesa di un DKG che non sarebbe mai arrivato", ha affermato la fondazione.
La soluzione consisteva in due parti: mantenere lo stato del DKG tra i riavvii e aggiungere un meccanismo che consentiva ai validatori di chiudere l'epoca bloccata in un punto coordinato. Tale meccanismo veniva utilizzato una sola volta per chiudere l'epoca interessata, dopodiché la rete passava all'epoca successiva e la casualità veniva ripristinata.
L'analisi post-mortem ha inquadrato le interruzioni come una lezione di ingegneria più ampia per Sui. La fondazione ha affermato che la resilienza di fine ciclo necessita di ulteriori investimenti, in particolare per quanto riguarda il degrado graduale e i meccanismi operativi di chiusura forzata. Ha inoltre affermato che la ricarica del gas merita lo stesso livello di rigore del consenso Move VM o Mysticeti, data la sua interazione con l'insediamento, i controlli di conservazione e la programmazione.
Al momento della pubblicazione, SUI era scambiato a 0,8798 dollari.
