Der Satz, der Midnight für mich verändert hat, war deutlich: Eine Transaktion kann in der fehleranfälligen Phase fehlschlagen und trotzdem garantierte Effekte hinterlassen.
Als ich das las, konnte ich nicht mehr zu dem normalen Krypto-Denkmodell zurückkehren. Die Dokumente von Midnight sagen, dass Transaktionen durch eine Well-Formedness-Prüfung laufen, dann eine garantierte Phase, gefolgt von einer fehleranfälligen Phase. Wenn ein Fehler in der garantierten Phase auftritt, wird die Transaktion nicht einbezogen. Aber wenn der Fehler später auftritt, gelten die garantierten Effekte weiterhin und das Hauptbuch verzeichnet einen teilweisen Erfolg. Die Dokumente sagen auch, dass die Gebühren für alle Phasen in der garantierten Phase erhoben werden und verwirkt sind, wenn die fehleranfällige Phase fehlschlägt. Das bedeutet, dass ein Fehler bei Midnight nicht immer rückgängig gemacht werden kann. Manchmal bleibt er übrig.
Das ist eine viel größere Produktwahrheit, als es zunächst klingt.
Viele Menschen denken immer noch in einfachen Begriffen über Transaktionsfehler. Es hat funktioniert, oder es ist fehlgeschlagen und es ist nichts wirklich passiert. Midnight schwächt diese Abkürzung. Seine Semantik ist gestaffelt. Einige Teile der Aktion können real werden, bevor die späteren Teile erlaubt sind, zu scheitern. Die Dokumentation ist klar, dass die Phasenausführung Dinge wie das Einfügen von Verpflichtungen, das Einfügen von Nullifiern, das Überprüfen vergangener Wurzeln und das Aktualisieren des Satzes vergangener Wurzeln umfassen kann. Bis zu dem Zeitpunkt, an dem eine fehleranfällige Bedingung bricht, kann die Transaktion bereits den Hauptbuchstatus in einer Weise geändert haben, die die App nicht einfach ignorieren kann.
Die Gebühr ist auch schon weg.
Diese Kombination macht das Modell ernsthaft. Ein später Fehler ist nicht nur eine Fehlermeldung. Es kann ein fehlgeschlagener Plan sein, der auf einem erfolgreichen Präfix sitzt.
Der klarste Weg, das Problem zu erkennen, ist mit einem privaten Zugriffsfluss. Stellen Sie sich eine Midnight-App vor, in der ein Benutzer versucht, einige private Berechtigungen auszuüben. Die App möchte, dass die Aktion einfach erscheint. Der Benutzer drückt einmal und erwartet eine klare Antwort. Hinter dem Bildschirm kann die Transaktion jedoch die Formgültigkeit bestehen, in die garantierte Phase eintreten, Gebühren sammeln und die Effekte anwenden, die dort hingehören. Dann schlägt eine spätere fehleranfällige Bedingung fehl. Vielleicht wurde eine Geschäftsregel nicht erfüllt. Vielleicht konnte ein späterer Ast nicht abgeschlossen werden. Aus der Sicht des Benutzers ist die Aktion fehlgeschlagen. Aus der Sicht von Midnight kam der Fehler, nachdem das Hauptbuch bereits bewegt worden war.
Das ist kein winziger semantischer Grenzfall. Das ist Produktverhalten.
Und Midnight behandelt diese Trennung nicht als zufällig. Die Dokumentation sagt, dass wenn ein Vertragsaufruf sowohl garantierte als auch fehleranfällige Abschnitte enthält, der fehleranfällige Abschnitt mit ckpt beginnen muss. Ich mag dieses Detail, weil es die Architektur ehrlich macht. Die Grenze zwischen "dies muss überleben" und "dies kann immer noch abbrechen" ist explizit. Entwickler entscheiden nicht nur, was ihre private Logik tut. Sie entscheiden, was das System behalten darf, wenn die volle Absicht niemals ankommt.
Das ist der Punkt, an dem der Druck im Design beginnt.
Ein Entwickler kann einen Midnight-Vertrag ansehen, sehen, dass die Beweise korrekt sind, und dennoch die schwierigere Frage übersehen. Wenn diese Aktion spät fehlschlägt, was bereits wahr geworden ist. Wenn die Antwort "einige Verpflichtungen, einige Nullifier, die Gebühr und ein Teil-Erfolgsprotokoll" ist, dann kann die App nicht über Fehler sprechen, wie es ein normales Rollback-System tun würde. Die Logik zum erneuten Versuch ändert sich. Die Benutzerkommunikation ändert sich. Der Support ändert sich. Ein roter Fehlzustand kann nicht mehr "nichts ist passiert" bedeuten.
Das ist der echte Kompromiss. Midnight erhält ein ausdrucksstärkeres Transaktionsmodell. Garantierte Arbeiten können von späteren fehleranfälligen Arbeiten getrennt werden. Das ist nützlich. Es gibt Entwicklern mehr Kontrolle über die Ausführungsstruktur. Aber der Preis ist, dass Apps um Teilerfolge als ersten Zustand herum gestalten müssen. Kein Fehler. Kein Implementierungsunfall. Ein Zustand.
Wenn sie das nicht tun, beginnt das Produkt zu lügen.
Der Benutzer sieht "fehlgeschlagen". Das Hauptbuch sagt "teilweise abgeschlossen". Die Gebühr ist in jedem Fall weg. Diese Lücke ist der Ort, an dem Verwirrung beginnt. Ein Team kann es auch leicht falsch interpretieren. Sie können das Problem wie einen normalen Laufzeitfehler behandeln, während das eigentliche Problem darin besteht, dass das Transaktionsmodell einige Effekte absichtlich überleben ließ. Midnight hat das nicht vor ihnen verborgen. Die Dokumentation hat es ihnen gesagt. Der Fehler besteht darin, vorzugeben, dass die Benutzererfahrung alles oder nichts bleiben kann, nachdem die Semantik nicht mehr alles oder nichts war.
Deshalb denke ich, dass das Ausführungsmodell von Midnight mehr Aufmerksamkeit verdient, als es erhält. Die Leute werden über Datenschutz, selektive Offenlegung und was verborgen bleiben kann, reden. In Ordnung. Aber ein ernsthaftes Produkt wird nicht nur durch das definiert, was es verbergen kann. Es wird auch durch das definiert, was es bedeuten lässt, wenn etwas fehlschlägt. Midnight verändert diese Bedeutung auf eine sehr präzise Weise. Eine fehlgeschlagene private Aktion kann immer noch eine irreversible vordere Hälfte haben.
Der echte Bewertungsstandard kann nicht bei "verifiziert der Beweis" stoppen. Er muss auch fragen: Welche Effekte wurden in die garantierte Phase gesetzt, was überlebt einen späten Fehler und erklärt die App das ehrlich dem Benutzer? Bei Midnight sind das keine sekundären UX-Details. Sie sind Teil der Semantik.
Die stärksten Midnight-Apps werden die sein, die Teilerfolge von Anfang an wie einen echten Produktzustand behandeln. Die schwächeren werden es weiter als Fehler bezeichnen und hoffen, dass niemand bemerkt, dass das Hauptbuch bereits bewegt wurde.
@MidnightNetwork $NIGHT #night

