Sui peavõrgu töö katkes kolm korda 28. ja 29. mail pärast võrgu versiooni 1.72 väljalaset, mis paljastas erandjuhtumid gaasi tasumise ja valideerijate taaskäivitamise loogikas, teatas Sui Foundation postmortem’is. Fond teatas, et probleemid on nüüd lahendatud, võrgutegevus on taastunud ja „kasutajate vahendid ei olnud mingil juhul ohus.“
Esimesed intsidentid algasid neljapäeval, 28. mail, kui Sui peavõrk seiskus umbes kell 7:00 PT (Pacifič Time) ja jäi välja umbes kuni kell 13:30 PT. Teine seiskumine järgnes reedel hommikul umbes kell 5:00 PT ja lõppes umbes kell 8:30 PT. Kolmas seiskumine algas reedel pärastlõunal umbes kell 13:30 PT ja see lahendati umbes kell 19:20 PT.
Fondi sõnul tulenesid esimesed kaks seiskumist krahhi bugidest, mis olid seotud gaasi tasumise loogika ja Sui versiooni 1.72 uuenduse – mis sisaldas aadresside saldo funktsiooni – vastastikuse toimimisega. Kolmas seiskumine oli eraldi juhtum: see põhjustati planeeritud epohhivahetuse ajal, kui valideerijate taaskäivitamine paljastas varjatud vea juhuslikkuse oleku säilitamisel.
„Seiskumise ajal ei olnud kasutajate vahendid mingil juhul ohus ja võrgu taastumisel ei tühistatud ühtegi kinnitatud tehingut,“ ütles Sui Foundation. „Hetkel on valideerijad täielikult lahendanud nii originaalse gaasi tasumise vea kui ka juhuslikkuse oleku veaga seotud teadaolevad probleemid ja võrgutegevus on taastunud.“
Esimese probleemi keskpunktis oli Sui uus aadresside saldo funktsioon, mis võimaldab kasutajatel vahendeid hoida ja gaasi tasuda ilma, et nad peaksid selleks tuginema ainult mündiobjektidel. Sui tehingud võivad tasuda gaasi aadresside saldoga, mündiobjektidega või hübriidstruktuuriga, mis ühendab mõlemat.
Erandjuhtum ilmnes just selles hübriidgaasi tees. Kui tehing püüdis kulutada aadressi saldost, mis ei suutnud katta konkureerivaid tehinguid, tühistas scheduler selle õigesti veateatega InsufficientFundsForWithdraw. Kuid hiljem, gaasi „smashimise“ ajal – protsessis, kus sisendmündid ühendatakse üheks gaasi tasumiseks mõeldud müntiks – püüdis sama reservatsioon ikka veel vahendeid deebiteerida.
Fondi selgituse kohaselt ei toimunud krahhi otse gaasi „smashimise“ ajal, vaid arvestusperioodil, kui süsteemitehinguga korrastati saldo muutused. Negatiivne muutus rakendati nullsaldole, mis põhjustas alavoolu (underflow).
Kohene parandus oli mõistlikult lihtne: vältida gaasi „smashimist“, kui tehing tühistatakse veatega InsufficientFundsForWithdraw. Valideerijad rakendasid seda parandust neljapäeval ja taastasid nii võrgu töö. Siiski tunnistas fond, et see parandus oli ajutine meetme, mille valiti võrgu kiireks taastamiseks, samal ajal kui insenerid arendasid täielikumat lahendust.
„Gaasi loogika muutmine on delikaatne operatsioon,“ kirjutas fond. „Nagu eespool selgitatud, on aadresside saldode ja müntide vahel keerukad vastastikused seosed. Gaasi loogika muutuste puhul peavad muudatused lisaks vigade parandamisele säilitama kõik eelnevad käitumismustrid või kasutama sobivat versioonifiltrit (version gating).“
Selle ajutise parandusega oli seotud teadaolev nõrk koht. Kui tehingul oli mitu tühistamise põhjust, võis teine viga varjata tingimust InsufficientFundsForWithdraw. Sellisel juhul reedel hommikul oli ikka veel võimalik jõuda algsele alavoolu teele, mis põhjustas teise seiskumise.
Kolmas seiskumine toimus pärast seda, kui võrgu töö oli reedel hommikul taastunud. Järgmisel planeeritud epohhivahetusel ei suutnud valideerijad üleminekut lõpetada, kuna oli viga Sui jaotatud võtmete genereerimise protokollis (DKG), mis initsieerib juhuslikkuse tehingutele, mis sõltuvad ketil olevast juhuslikkusest.
Eelnevas taaskäivitusetsükli ajal ei olnud osalus järgmise epohhi DKG-protsessis piisavalt kõrge, mistõttu juhuslikkus oli kavatsetult keelatud. Probleem seisnes selles, et ebaõnnestumise otsus ei salvestatud ketile. Kui valideerijad taaskäivitusid, ei mäletanud nad enam, et DKG oli ebaõnnestunud.
„Kuna valideerijad ei mäletanud enam, et DKG oli ebaõnnestunud, ei saanud see juhuslikkuse taastamine toimuda, pausitud järjekord kasvas ja epohhi lõpuprotsess – mis peab enne sulgemist selle järjekorra tühjendama – ootas DKG-d, mis kunagi ei saabunud,“ ütles fond.
Parandus koosnes kahest osast: DKG-oleku püsiv salvestamine taaskäivituste vahel ning mehhanismi lisamine, mis võimaldas valideerijatel seiskunud epohhi koordineeritud kohas sulgeda. Seda mehhanismi kasutati ühe korra epohhi sulgemiseks, mille järel liikus võrk järgmisesse epohhi ja juhuslikkus taastus.
Postmortem kujutas seiskumisi laiemana inseneriteema Sui jaoks. Fond ütles, et epohhi lõpu vastupidavusele tuleb pöörata rohkem tähelepanu, eriti sujuva degradatsiooni ja operatsiooniliste sunnitud sulgemise mehhanismide arendamisele. Samuti ütles fond, et gaasi tasumisele tuleb pöörata sama rangelt tähelepanu kui Move VM-le või Mysticeti konsensusele, kuna see on seotud arvestusprotsessiga, ressursikontrollidega ja ajastamisega.
Artikli kirjutamise hetkel oli SUI hind $0.8798.


