Thanks to visit codestin.com
Credit goes to ethereum.org

Přejít na hlavní obsah
Change page

Serializace rekurzivního délkového prefixu (RLP)

Poslední aktualizace stránky: 15. dubna 2026

Serializace rekurzivního délkového prefixu (RLP) se hojně používá v exekučních klientech Etherea. RLP standardizuje přenos dat mezi uzly v prostorově úsporném formátu. Účelem RLP je kódovat libovolně vnořená pole binárních dat a RLP je primární metodou kódování používanou k serializaci objektů v exekuční vrstvě Etherea. Hlavním účelem RLP je kódovat strukturu; s výjimkou kladných celých čísel RLP deleguje kódování specifických datových typů (např. řetězců, čísel s plovoucí desetinnou čárkou) na protokoly vyššího řádu. Kladná celá čísla musí být reprezentována v binární formě big-endian bez úvodních nul (takže celočíselná hodnota nula je ekvivalentní prázdnému poli bajtů). Deserializovaná kladná celá čísla s úvodními nulami musí být jakýmkoli protokolem vyššího řádu používajícím RLP považována za neplatná.

Více informací v Ethereum yellow paper (Dodatek B) (opens in a new tab).

Pro použití RLP ke kódování slovníku jsou dvě navrhované kanonické formy:

  • použijte [[k1,v1],[k2,v2]...] s klíči v lexikografickém pořadí
  • použijte kódování Patricia Tree na vyšší úrovni, tak jak to dělá Ethereum

Definice

Kódovací funkce RLP přijímá položku. Položka je definována následovně:

  • řetězec (tj. pole bajtů) je položka
  • seznam položek je položka
  • kladné celé číslo je položka

Například všechny následující jsou položky:

  • prázdný řetězec;
  • řetězec obsahující slovo "cat";
  • seznam obsahující libovolný počet řetězců;
  • a složitější datové struktury, jako je ["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"].
  • číslo 100

Všimněte si, že v kontextu zbytku této stránky „řetězec“ znamená „určitý počet bajtů binárních dat“; nepoužívají se žádná speciální kódování a nepředpokládá se žádná znalost o obsahu řetězců (kromě toho, co vyžaduje pravidlo proti neminimálním kladným celým číslům).

Kódování RLP je definováno následovně:

  • U kladného celého čísla se toto převede na nejkratší pole bajtů, jehož interpretace big-endian je dané celé číslo, a poté se zakóduje jako řetězec podle níže uvedených pravidel.
  • Pro jediný bajt, jehož hodnota je v rozsahu [0x00, 0x7f] (desítkově [0, 127]), je tento bajt svým vlastním kódováním RLP.
  • Jinak, pokud je řetězec dlouhý 0–55 bajtů, kódování RLP se skládá z jednoho bajtu s hodnotou 0x80 (des. 128) plus délka řetězce, po níž následuje samotný řetězec. Rozsah prvního bajtu je tedy [0x80, 0xb7] (des. [128, 183]).
  • Pokud je řetězec delší než 55 bajtů, kódování RLP se skládá z jednoho bajtu s hodnotou 0xb7 (des. 183) plus délka délky řetězce v bajtech v binární formě, následovaná délkou řetězce a samotným řetězcem. Například řetězec dlouhý 1024 bajtů by byl zakódován jako \xb9\x04\x00 (des. 185, 4, 0) a za ním by následoval řetězec. Zde je 0xb9 (183 + 2 = 185) jako první bajt, po němž následují 2 bajty 0x0400 (des. 1024), které označují délku skutečného řetězce. Rozsah prvního bajtu je tedy [0xb8, 0xbf] (des. [184, 191]).
  • Pokud je řetězec dlouhý 2^64 bajtů nebo více, nesmí být kódován.
  • Pokud je celková datová část seznamu (tj. kombinovaná délka všech jeho položek kódovaných pomocí RLP) dlouhá 0–55 bajtů, kódování RLP se skládá z jediného bajtu s hodnotou 0xc0 plus délka datové části, po níž následuje zřetězení kódování RLP jednotlivých položek. Rozsah prvního bajtu je tedy [0xc0, 0xf7] (des. [192, 247]).
  • Pokud je celková datová část seznamu delší než 55 bajtů, kódování RLP se skládá z jednoho bajtu s hodnotou 0xf7 plus délka délky datové části v bajtech v binární podobě, následovaná délkou datové části a zřetězením kódování RLP jednotlivých položek. Rozsah prvního bajtu je tedy [0xf8, 0xff] (des. [248, 255]).

V kódu to vypadá takto:

Příklady

  • řetězec "dog" = [ 0x83, 'd', 'o', 'g' ]
  • seznam [ "cat", "dog" ] = [ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]
  • prázdný řetězec ('null') = [ 0x80 ]
  • prázdný seznam = [ 0xc0 ]
  • celé číslo 0 = [ 0x80 ]
  • bajt '\x00' = [ 0x00 ]
  • bajt '\x0f' = [ 0x0f ]
  • bajty '\x04\x00' = [ 0x82, 0x04, 0x00 ]
  • teoreticko-množinová reprezentace (opens in a new tab) trojky, [ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]
  • řetězec "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = [ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]

Dekódování RLP

Podle pravidel a postupu kódování RLP je vstup pro dekódování RLP považován za pole binárních dat. Proces dekódování RLP je následující:

  1. podle prvního bajtu (tj. prefixu) vstupních dat a dekódování datového typu, délky skutečných dat a offsetu;

  2. podle typu a offsetu dat dekódujte data odpovídajícím způsobem, přičemž respektujte pravidlo minimálního kódování pro kladná celá čísla;

  3. pokračujte v dekódování zbytku vstupu;

Pravidla pro dekódování datových typů a offsetu jsou následující:

  1. data jsou řetězec, pokud je rozsah prvního bajtu (tj. prefixu) [0x00, 0x7f], a řetězec je přesně samotný první bajt;

  2. data jsou řetězec, pokud je rozsah prvního bajtu [0x80, 0xb7] a za prvním bajtem následuje řetězec, jehož délka se rovná prvnímu bajtu mínus 0x80;

  3. data jsou řetězec, pokud je rozsah prvního bajtu [0xb8, 0xbf] a za prvním bajtem následuje délka řetězce, jejíž délka v bajtech se rovná prvnímu bajtu mínus 0xb7, a za délkou řetězce následuje samotný řetězec;

  4. data jsou seznam, pokud je rozsah prvního bajtu [0xc0, 0xf7] a za prvním bajtem následuje zřetězení kódování RLP všech položek seznamu, jejichž celková datová část se rovná prvnímu bajtu mínus 0xc0;

  5. data jsou seznam, pokud je rozsah prvního bajtu [0xf8, 0xff] a za prvním bajtem následuje celková datová část seznamu, jejíž délka se rovná prvnímu bajtu mínus 0xf7, a za celkovou datovou částí seznamu následuje zřetězení kódování RLP všech položek seznamu;

V kódu to vypadá takto:

Další čtení

Byl tento článek užitečný?