RLP-Begründungsfrage

Ich versuche zu verstehen, warum RLP als internes Protokoll ausgewählt und entwickelt wurde. Ich bin über diesen Link gestolpert, der einige Einblicke bietet:

https://github.com/ethereum/wiki/wiki/Design-Rationale

Um den folgenden Abschnitt zu verstehen, wird eine detaillierte Erklärung sehr geschätzt.

„Die Alternative zu RLP wäre die Verwendung eines bestehenden Algorithmus wie protobuf oder BSON gewesen; wir bevorzugen jedoch RLP wegen (1) der einfachen Implementierung und (2) der garantierten absolut bytegenauen Konsistenz. Schlüssel/Wert-Karten in vielen Sprachen haben keine explizite Reihenfolge, und Gleitkommaformate haben viele Sonderfälle, die möglicherweise dazu führen, dass dieselben Daten zu unterschiedlichen Codierungen und damit zu unterschiedlichen Hashes führen.

Antworten (2)

Es sagt, dass RLP ist

  • einfach
  • eindeutig

Es ist einfacher als andere Algorithmen, da es keine anderen Datentypen als Bytes und Arrays definiert.

Es ist eindeutig, weil die gleichen Eingabedaten immer in die gleiche Folge von Bytes serialisiert werden.

In vielen Sprachen haben Schlüssel/Wert-Zuordnungen keine explizite Reihenfolge. Das bedeutet 2 Einträge:

key1: value1
key2: value2

könnte wie folgt serialisiert werden:

{
  "key1": "value1",
  "key2": "value2"
}

in einer Implementierung und

{
  "key2": "value2",
  "key1": "value1"
}

in einer anderen Implementierung. Dieselben Eingabedaten können unterschiedliche Serialisierungen ausgeben. Dies ist in Ethereum nicht akzeptabel.

Andererseits muss bei Verwendung von RLP die Zuordnung zuerst in Arrays konvertiert werden (diese Konvertierung liegt außerhalb des Bereichs von RLP) und dann zur Serialisierung an RLP übergeben. In unserem Beispiel lautet die Eingabestruktur für RLP:

[["key1", "value1"],["key2","value2"]]

wobei Zeichenfolgen in Anführungszeichen zuerst in Bytes konvertiert werden sollten (auch außerhalb des Geltungsbereichs für RLP).

Grundsätzlich versucht RLP, Mehrdeutigkeiten zu vermeiden, indem es die unterstützten Datentypen einschränkt.

Vielen Dank für die ausführliche Antwort von dem, was ich bekomme, ist 1) RLP ist einfach 2) versteht nur Bytes und Arrays. In Bezug auf die Zuordnung von Schlüssel->Wert-Paaren muss die Reihenfolge in chronologischer Reihenfolge erfolgen und um sicherzustellen, dass die Schlüssel [ ["Schlüssel1", "Wert1"], ["Schlüssel2", "Wert2"] ] wie in der serialisiert werden genaue Reihenfolge, wie sie als Eingabe gesendet wurden. Ich nehme an, dies dient dazu, die Reihenfolge aufrechtzuerhalten.
Das ist richtig.

RLP ist ein Codierungsschema, das von Ethereum-Entwicklern entwickelt wurde. Es ist ein speziell entwickeltes Verschlüsselungsschema, das in Ethereum verwendet wird, um binäre Daten für die Speicherung oder Übertragung über das Netzwerk zu serialisieren und auch den Zustand in einem Patricia-Baum auf Speichermedien zu speichern. Es ist ein deterministisches und konsistentes binäres Codierungsschema, das verwendet wird, um Objekte in der Ethereum-Blockchain zu serialisieren, wie z. B. Kontostatus, Transaktionen, Nachrichten und Blöcke. Es arbeitet mit Zeichenfolgen und Listen, um Rohbytes zu erzeugen, die für die Speicherung und Übertragung geeignet sind. RLP ist ein minimalistisches und einfach zu implementierendes Serialisierungsformat, das keine Datentypen definiert und Strukturen einfach als verschachtelte Arrays speichert. Mit anderen Worten, RLP codiert keine spezifischen Datentypen; Stattdessen besteht sein Hauptzweck darin, Strukturen zu codieren.

Warum brauchen wir ein neues Kodierungsschema, wenn bereits so viele verschiedene Serialisierungsformate verfügbar sind? Die Antwort auf diese Frage lautet, dass RLP ein deterministisches Schema ist, während andere Schemata für dieselbe Eingabe unterschiedliche Ergebnisse liefern können, was auf einer Blockchain absolut inakzeptabel ist. Selbst eine kleine Änderung führt zu einem völlig anderen Hash und zu Datenintegritätsproblemen, die die gesamte Blockchain unbrauchbar machen.