Wir haben die niedrigste mögliche Latenz angestrebt. Wir haben ein schlankes, neues Brieftaschen-Feature im Devnet von Midnight entwickelt, und der Code war wunderschön.
Wir hatten eine meisterhafte Architektur des Zustands entworfen – eine einzige, umfassende Karte, die alle Benutzerdaten enthielt. Sie war sauber. Sie war einfach. Sie war elegant.
Um 3:13 Uhr, während eines Stresstests, wurde diese Eleganz zu einer Haftung.
Die Leere
Wir haben zwei Überweisungen durchgeführt. Gleiche Brieftasche. Verschiedene Empfänger. In einer traditionellen Kette ist das kein Problem; die zweite wartet einfach auf ihre Reihe. Aber in Midnight's paralleler Ausführungsumgebung gab es keine Verzögerung.
Wir haben ein Vakuum erhalten.
Die erste Transaktion ergriff das Schreibschloss für den Zustand dieser Brieftasche. Die zweite Transaktion traf den Mempool, wurde als gültig erachtet und dann... eingereiht. Sie wartete auf ihre Gelegenheit zu schreiben, aber die Uhr tickte.
Das Slotfenster von Midnight – ein enges Zeitfenster von 150 ms – schloss sich, bevor die zweite Transaktion das Schloss erwerben und ausführen konnte.
Die Transaktion ist nicht mit einem Fehlercode fehlgeschlagen. Sie wurde nicht an den Absender zurückgesetzt. Sie ist einfach verdampft. Kein Alarm. Kein Eintrag im Block-Explorer. Nur eine gespenstische Lücke in unserer Sequenz, wo der Wert sich bewegen sollte.
Das war der Moment, in dem wir erkannten, dass bei Midnight der stille Killer nicht der Durchsatz ist. Es ist der Zustandskollisions.
Die Illusion des Erfolgs
Wir haben in dieser Nacht eine harte Wahrheit gelernt: In parallelen Ausführungsketten wie Midnight kann "Erfolg" genau wie "stiller Verlust" aussehen.
Wenn zwei Transaktionen dasselbe Konto innerhalb eines einzelnen Slots berühren, verschwindet eine von ihnen spurlos. Sie werden es nicht in den Protokollen finden. Das Netzwerk wird nicht schreien. Sie entdecken die Blutung nur, wenn Sie die Bilanz am frühen Morgen überprüfen und ein klaffendes Loch finden, wo Gelder sein sollten.
Das Problem war nicht unsere Logik; es war unsere Architektur. Indem wir den gesamten Benutzerzustand in eine riesige Karte gepackt haben, haben wir einen einzigen Streitpunkt geschaffen. Jede Transaktion wurde zu einem Flaschenhals, der um den Schreibzugriff auf denselben Datenblock kämpfte.
Die Lösung: Shard oder sterben
Um bei Midnight zu überleben, müssen Sie Ihre Denkweise über den Zustand ändern. Sie müssen annehmen, dass Kontention der Feind ist und Ihre Daten so gestalten, dass sie um jeden Preis vermieden wird.
1. Akzeptiere Fragmentierung
Hören Sie auf, den Benutzerzustand als eine einzige monolithische Entität zu betrachten. Zerlegen Sie ihn. Teilen Sie Ihren Benutzerzustand in isolierte, unabhängige Segmente auf. Wenn ein Benutzer mehrere Vermögenswerte oder Aktionen hat, sollten sie nicht alle unter einem Dach leben.
2. Nonce-Gruppierung ist Ihr Freund
Anstatt ein ganzes Benutzerprofil zu sperren, isolieren Sie den Zustand nach Nonce-Gruppen oder spezifischen operationale Bereichen. Ein Transfer sollte nur das spezifische UTXO oder den Balance-Eimer sperren, den es benötigt - nicht die gesamte Transaktionshistorie des Benutzers.
3. Verengen Sie den Schreibpfad
Überprüfen Sie jede Zeile Ihrer Interaktion mit dem Zustand. Wenn eine Transaktion nicht unbedingt auf ein Datenstück schreiben muss, lassen Sie es nicht damit berühren. Je enger der Schreibpfad, desto geringer die Wahrscheinlichkeit einer Kollision.
Das zweischneidige Schwert
Die Kraft von Midnight ist ihre parallele Ausführung, aber diese Kraft ist ein zweischneidiges Schwert. Sie belohnt diejenigen, die für Nebenläufigkeit entwerfen, und bestraft diejenigen, die monolithische, veraltete Kettenmentalitäten mitbringen.
Wir haben unser Zustandsmodell neu aufgebaut. Wir haben die monolithische Karte in feingliedrige Schlüssel aufgeteilt, die jeweils eine diskrete Ressource darstellen. Jetzt gleiten gleichzeitige Übertragungen, die denselben Benutzer anvisieren, in unterschiedliche Slots, ohne jemals um dasselbe Schloss zu kämpfen.
Auditieren Sie, bevor Sie bereitstellen
Überprüfen Sie Ihren Zustand, bevor Sie bereitstellen. Denn bei Midnight, wenn Sie die Slot-Zeit nicht respektieren, werden Ihre Transaktionen nicht nur fehlschlagen - sie werden verschwinden.
Und die Stille wird der teuerste Klang sein, den Sie niemals hören werden.
@MidnightNetwork $NIGHT #night
