Ich habe die letzten ein paar Wochen damit verbracht, den TLV-Encoder in Rust zu studieren: Längenangabe und Werte – der älteste Trick zum Verpacken von Daten, damit sie wachsen können, ohne alte Leser zu beschädigen. Irgendwann dachte ich es für Dusk durch, und dann klickte der Grund. Eine Kette wie @Dusk bewegt fortwährend Nachrichten über den Draht, während Peers miteinander flüstern, Verträge abschließen, in Wallets anrufen und sich synchronisieren. Alles davon braucht ein Format, das überlebt, wenn jemand in zwei Jahren einfach noch ein neues Feld ergänzt.
Rust macht den nervigen Teil fast schon langweilig – und genau darum geht’s. Bounds-Checking. Ablehnen, einer Längen-Byte zu vertrauen, die behauptet, 4GB gelesen zu haben.
Ein Parser, der bei Müll-Eingaben panikt, ist ein Parser, den man nicht in einem Netzwerk betreiben kann, in dem zufällige Bytes ungebeten auftauchen. Ich bleibe bei einfachen &[u8]-Slicen, überspringe das Kopieren, bis ich es wirklich brauche, und setze bei dem Typ-Byte auf ein Enum, damit der Compiler jede Variante abfängt, die ich vergesse.
Nicht den hässlichen Code zum Byte-Schieben überspringen. Erst schreiben – und paranoid schreiben. Alles, was du danach baust, hängt davon ab, dass er dir nichts vormacht. #dusk
$DUSK
Rust macht den nervigen Teil fast schon langweilig – und genau darum geht’s. Bounds-Checking. Ablehnen, einer Längen-Byte zu vertrauen, die behauptet, 4GB gelesen zu haben.
Ein Parser, der bei Müll-Eingaben panikt, ist ein Parser, den man nicht in einem Netzwerk betreiben kann, in dem zufällige Bytes ungebeten auftauchen. Ich bleibe bei einfachen &[u8]-Slicen, überspringe das Kopieren, bis ich es wirklich brauche, und setze bei dem Typ-Byte auf ein Enum, damit der Compiler jede Variante abfängt, die ich vergesse.
Nicht den hässlichen Code zum Byte-Schieben überspringen. Erst schreiben – und paranoid schreiben. Alles, was du danach baust, hängt davon ab, dass er dir nichts vormacht. #dusk
$DUSK
