Frage zur RLP-Decodierung

Ich versuche zu verstehen, was dies aus dem RLP-Whitepaper-Wiki bedeutet: "Der einzige Zweck von RLP besteht darin, die Struktur zu codieren; die Codierung bestimmter Datentypen (z.

Referenz: https://github.com/ethereum/wiki/wiki/RLP

Mein Verständnis davon ist, dass RLP nur die Struktur codiert und sich nicht mit den Daten befasst und die Interpretation des Datentyps einer benutzerdefinierten Funktion überlassen bleibt? kann mir jemand ein Beispiel für diese Eingabe geben, ist die folgende Struktur mit RLP-Codierung:

B.: [ "Katze",[[]],"Schwein",[""],"Schaf"]

Vielen Dank im Voraus, auch wenn es eine Videoreferenz nur für RLP gibt, wäre dies sehr hilfreich.

Antworten (1)

Aus der Dokumentation entnommen, haben Sie die folgenden Axiome:

Wenn eine Zeichenkette 0-55 Byte lang ist, besteht die RLP-Kodierung aus einem einzelnen Byte mit dem Wert 0x80 plus der Länge der Zeichenkette, gefolgt von der Zeichenkette. Der Bereich des ersten Bytes ist also [0x80, 0xb7].

Und

Wenn die Gesamtnutzlast einer Liste (dh die kombinierte Länge aller ihrer RLP-codierten Elemente) 0-55 Bytes lang ist, besteht die RLP-Codierung aus einem einzelnen Byte mit dem Wert 0xc0 plus der Länge der Liste, gefolgt von der Verkettung der RLP-Kodierungen der Items. Der Bereich des ersten Bytes ist also [0xc0, 0xf7].

Daher würde ["Katze",[[]],"Schwein",[""],"Schaf"] mit der folgenden Logik codiert werden:

Sie würden cat hinzufügen, als 0x83, 'c', 'a', 't'wäre „cat“ ein String, daher beginnen Sie bei 0x80 und addieren die Länge des Strings (3), sodass wir 0x83 erhalten, dann die Zeichen des Strings.

[[]] wäre 0xc1, 0xc0Dieses Array enthält EIN leeres Array.

Da 0xc1 die Länge des Arrays ist (das Array enthält ein Element, hier [] ), und 0xc0 die Länge des zweiten Arrays ist (leeres Element)

"Schwein" ist dasselbe wie "Katze", eine Zeichenfolge aus 3 Zeichen, also:0x83, 'p', 'i', 'g'

[""] ist ein Array von EINEM Element, das eine leere Zeichenfolge (0 Zeichen) ist, also würde es als 0xc1, 0x80(0xc0 + 1, 0x80 + 0) codiert werden.

"Schaf" ist eine 5-stellige Zeichenfolge, also würde es wie folgt codiert werden: 0x85, 's', 'h', 'e', 'e', 'p'(0x80 + 5, und jeder Buchstabe der Zeichenfolge)

Das gesamte Array enthält 18 Byte Wert, also würde es wie folgt codiert werden:

[ 0xd2, 0x83, 'c', 'a', 't', 0xc1, 0xc0, 0x83, 'p', 'i', 'g', 0xc1, 0x80, 0x85, 's', 'h', 'e', 'e', 'p'](0xd2 ist 0xc0 + 0x12, 0x12 ist 18 in Dezimalzahl)

Aus Gründen der Übersichtlichkeit wurden die Zeichen nicht hexadezimal codiert, aber die tatsächliche Codierung sieht folgendermaßen aus:

[0xd2, 0x83, 0x63, 0x61, 0x74, 0xc1, 0xc0, 0x83, 0x70, 0x69, 0x67, 0xc1, 0x80, 0x85, 0x73, 0x68, 0x65, 0x65, 0x70]

Vielen Dank für die Antwort. Ich werde die Antwort noch einmal durchgehen und sicherstellen, dass ich sie verstehe. noch ein e:g zum entschlüsseln zum aufklären bitte, e:g : [ 978,12, ["cat"], {"dog"} ]
978 ist 0x3D2also würde codiert als [0x82, 0x03, 0xd2], 12 ist nur ein Byte [0x0c], also sind Katze und Hund 3-Buchstaben-Wörter in einem Einzelelement-Array, also wird es wie oben codiert, also ist die endgültige Codierung [0xce, 0x82, 0x03, 0xD2, 0x0c, 0xc4, 0x83, "c", "a", "t", 0xc4, 0x83, "d", "o", "g"]( 0xceis 0xc0+ #NUMBER_OF_ELEMENT, was 15 in Dezimalzahl ist, was ist E in hexa)
Hat RLP im obigen Beispiel eine Codierungsregel für {}, sieht es so aus, als ob es {} als Liste konvertiert hätte. zB wie wird RLP [ {"Hund"} ] kodieren? Ich denke, RLP wird nur Listen, Strings, Zahlen verstehen.