Zum Inhalt springen
buybitcoinsmart

Glossar / Entwicklerreferenz

Interne Byte-Reihenfolge

Was ist die interne Byte-Reihenfolge?
Die interne Byte-Reihenfolge ist die Anordnung, die Bitcoin innerhalb serialisierter Strukturen verwendet: ganze Zahlen werden mit dem niedrigstwertigen Byte zuerst geschrieben, und Hashwerte werden in der Reihenfolge geschrieben, in der SHA-256 sie erzeugt hat.

Unter einem Namen laufen zwei Konventionen zusammen. Jedes ganzzahlige Feld in einer Transaktion oder einem Blockkopf ist Little Endian, eine Versionsnummer 2 wird also als 02000000 geschrieben, und jeder 32-Byte-Hash steht in den Rohdaten genau so, wie die Hash-Funktion ihn ausgegeben hat. Werkzeuge für Menschen kehren diese Hashes um, bevor sie sie anzeigen. Das ist der häufigste Grund, warum ein von Hand geschriebener Parser mit einem Block-Explorer nicht übereinstimmt.

So funktioniert es

Die interne Byte-Reihenfolge lernt man am besten, indem man den 80-Byte-Blockkopf des Genesis-Blocks auseinandernimmt, denn jedes Feld darin ist klein genug, um es mit dem Auge zu prüfen.

Er beginnt mit 01000000, der Versionsnummer 1 in vier Little-Endian-Bytes. Dann 32 Null-Bytes, denn der erste Block hat keinen Vorgänger. Dann die Merkle-Wurzel, gespeichert als 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, also der Hash, den jeder Explorer als 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b anzeigt, Byte für Byte rückwärts geschrieben. Dann 29ab5f49, der Zeitstempel 1231006505, also 18:15:05 Uhr UTC am 3. Januar 2009. Dann ffff001d, das Schwierigkeitsfeld, dessen logischer Wert 0x1d00ffff ist. Dann 1dac2b7c, der Nonce 2083236893.

Beträge folgen derselben Regel. Ein Bitcoin ist 100.000.000 Satoshi, und eine Ausgabe, die genau das auszahlt, trägt die acht Bytes 00e1f50500000000.

Der Grund ist historisch und ziemlich alltäglich. Bitcoin wurde für x86-Maschinen geschrieben, die ganze Zahlen mit dem niedrigstwertigen Byte zuerst speichern, und der früheste Code schrieb Strukturen in der Anordnung aus, in der der Prozessor sie ohnehin hatte. Hashes wurden nie umgekehrt. Geändert hat sich die Anzeige, denn Bitcoin Core speichert einen Hash in einer Klasse, die ihn als eine einzige riesige Zahl behandelt, und Zahlen werden mit dem höchstwertigen Teil links angezeigt.

Wo Sie ihr begegnen

Die interne Byte-Reihenfolge erhalten Sie immer dann, wenn ein Werkzeug Ihnen rohe Bytes statt einer formatierten Antwort liefert.

Rufen Sie eine Transaktion mit getrawtransaction ohne das Flag verbose ab, oder einen Blockkopf mit getblockheader und verbose auf false gesetzt, so kommt alles darin in dieser Reihenfolge an. Dasselbe gilt für eine PSBT, die eine Hardware-Wallet exportiert, für den Hex-Code hinter dem Rohdaten-Tab eines Explorers und für die Blockdateien im Verzeichnis blocks eines Node.

Das Feld, über das Menschen stolpern, ist der Outpoint am Anfang jedes Eingangs. Er benennt die Transaktion, die ausgegeben wird, mit 32 Bytes, die als Umkehrung der Kennung zu lesen sind, die der Explorer angezeigt hat. Nichts ist beschädigt, wenn diese beiden Zeichenketten nicht übereinstimmen: Kehren Sie eine um, stimmen sie überein.

Interne Byte-Reihenfolge vs. RPC-Byte-Reihenfolge

Die interne Byte-Reihenfolge und die RPC-Byte-Reihenfolge beschreiben dieselben 32 Bytes in entgegengesetzter Richtung, und die Regel für die Umrechnung zwischen ihnen hat eine wichtige Ausnahme. Hashwerte werden auf dem Weg nach außen zu einem Menschen umgekehrt und auf dem Weg zurück erneut umgekehrt. Ganze Zahlen nicht. Eine Blockhöhe, ein Zeitstempel und ein Betrag in Satoshi werden alle als gewöhnliche Dezimalzahlen dargestellt, und eine davon beim Lesen oder Anzeigen umzukehren, ergibt schlicht einen falschen Wert statt eines anders geschriebenen. Kehren Sie Hashes um und sonst nichts, und die meisten Fehler bei der Byte-Reihenfolge verschwinden.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Warum wirken Hashes innerhalb einer Rohdaten-Transaktion umgekehrt?

Sie sind nicht umgekehrt, die angezeigte Fassung ist es. Ein Hash wird in der Reihenfolge gespeichert, in der SHA-256 ihn erzeugt hat, während Anzeigewerkzeuge ihn umkehren, weil Bitcoin Core einen Hash als eine große Zahl behandelt und den höchstwertigen Teil zuerst anzeigt.

Muss ich beim Parsen roher Bitcoin-Daten jedes Feld umkehren?

Nein. Ganze Zahlen sind Little Endian und werden als solche gelesen, und 32-Byte-Hashes sind die einzigen Werte, die umgekehrt werden, und das nur, wenn Sie sie mit dem vergleichen möchten, was ein Explorer oder ein RPC-Aufruf anzeigt.

Weiterlesen

Verwandte Begriffe

Mehr zum Thema Entwicklerreferenz

Diese Seite auf Englisch lesen