以太坊ソースコード解析-RLP(理論)


RLP(Recursive Length Prefix)は、太坊シーケンス化に用いられる符号化方式である再帰長プレフィックス符号化と呼ばれる.RLPは主にイーサー坊におけるデータのネットワーク転送と永続化ストレージに用いられる.

定義#テイギ#


RLPは、実際には、以下の2種類のデータ符号化のみを行う.
  • byte配列
  • byte配列の配列をリスト
  • と呼ぶ

    byte配列


    ルール1:値が[0,127]の間の単一バイトについて、その符号化はそれ自体である.
    例:aの符号化は97である.
    ルール2:byte配列長l<=55の場合、符号化の結果は配列自体であり、128+lを接頭辞として付加する.
    例:abc符号化結果は131,97,999であり、そのうち131=128+len(「abc」)であり、97,999はa b cの順である
    ルール3:配列長が55より大きい場合、符号化結果の1つ目は183に文字列長を加えたバイト数であり、次いで配列長自体の符号化であり、最後にbyte配列の符号化である.
    次の文字列をエンコードします.
    The length of this sentence is more than 55 bytes, I know it because I pre-designed it

    この文字列は86バイトで、86の符号化には1バイトしか必要ありません.それはそれ自身です.そのため、符号化の結果は以下の通りです.
    184 86 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116

    最初の3バイトは次のように計算されます.184 = 183 + 1は、配列長86が符号化された後、1バイトしか占有しないためである.86すなわち配列長86 84はTの符号化である
    1024回の「a」を繰り返す文字列が符号化され、その結果、185 4 0 97 97 97 97 97 97 ...となる.
    1024バイナリは10000000000で、1バイトは8ビットなので、1024のバイト数は2 4 0で配列長の符号化です185=183+2、配列長1024は2バイトを占有
    1024は2バイトを占有し、ルール1に従って1024を2バイトの0000010000000000に分け、10進数に換算すると40になる

    リスト#リスト#


    ルール4:リスト長が55未満の場合、符号化結果1位は192プラスリスト長の符号化の長さであり、各サブリストの符号化が順次接続される.
    例6:[abc,def]の符号化結果は200 131 97 98 99 131 100 101 102である.
    ここで、abcの符号化は131 97 98 99であり、defの符号化は131 100 101 102である.2つのサブ文字列の符号化後の総長は8であるため、符号化結果の1番目の計算は192 + 8 = 200である.
    ルール5:リスト長が55を超える場合、符号化結果1位は247にリスト長を加えた符号化長が占めるバイト数であり、次にリスト長そのものの符号化であり、最後に各サブリストの符号化を順次接続する.
    ["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]

    のエンコーディング結果は次のとおりです.
    248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116

    最初の2バイトは次のように計算されます.
    リスト長88=86+2であり、ルール3の例では長さ86であるが、この例では2つのサブ文字列があるため、各サブ文字列自体の長さの符号化が1バイトずつであるため、合計2バイトを占める.
    リスト長の符号化長は1バイト目が248=247+1バイト目が88
    3バイト目179ルール2による179=128+51 55バイト目163同様ルール2による163=128+35

    RLP復号


    復号時には、まず、符号化結果の1バイト目fの大きさに基づいて、以下のルール判定を実行する.
  • f∈[0128]の場合、それはバイト自体です.
  • f∈[128,184]の場合、それは55を超えない長さのbyte配列であり、配列の長さはl=f-128
  • である.
  • f∈[184192]の場合、長さが55を超える配列であり、長さ自体の符号化長がll=f-183であり、2バイト目から長さがllのbytesが読み出され、BigEndianに従って整数l、lが配列の長さとなるように符号化される.
  • f∈(192247)では、符号化後の総長が55を超えないリストであり、リスト長はl=f-192である.再帰的にはルール1~4を用いて復号する.
  • f∈(247256)の場合、符号化後の長さが55より大きいリストであり、その長さ自体の符号化長がll=f-247であり、その後、2バイト目から長さがllのbytesを読み出し、BigEndianにより整数l、lがサブリスト長となるように符号化した.その後、復号ルールに従って再帰的に復号する.
  • ASCII


    ASCII値
    コントロールキャラクタ
    ASCII値
    コントロールキャラクタ
    ASCII値
    コントロールキャラクタ
    ASCII値
    コントロールキャラクタ
    0
    NUT
    32
    (space)
    64
    @
    96

    1
    SOH
    33
    !
    65
    A
    97
    a
    2
    STX
    34

    66
    B
    98
    b
    3
    ETX
    35
    #
    67
    C
    99
    c
    4
    EOT
    36
    $
    68
    D
    100
    d
    5
    ENQ
    37
    %
    69
    E
    101
    e
    6
    ACK
    38
    &
    70
    F
    102
    f
    7
    BEL
    39
    ,
    71
    G
    103
    g
    8
    BS
    40
    (
    72
    H
    104
    h
    9
    HT
    41
    )
    73
    I
    105
    i
    10
    LF
    42
    *
    74
    J
    106
    j
    11
    VT
    43
    +
    75
    K
    107
    k
    12
    FF
    44
    ,
    76
    L
    108
    l
    13
    CR
    45
    -
    77
    M
    109
    m
    14
    SO
    46
    .
    78
    N
    110
    n
    15
    SI
    47
    /
    79
    O
    111
    o
    16
    DLE
    48
    0
    80
    P
    112
    p
    17
    DCI
    49
    1
    81
    Q
    113
    q
    18
    DC2
    50
    2
    82
    R
    114
    r
    19
    DC3
    51
    3
    83
    S
    115
    s
    20
    DC4
    52
    4
    84
    T
    116
    t
    21
    NAK
    53
    5
    85
    U
    117
    u
    22
    SYN
    54
    6
    86
    V
    118
    v
    23
    TB
    55
    7
    87
    W
    119
    w
    24
    CAN
    56
    8
    88
    X
    120
    x
    25
    EM
    57
    9
    89
    Y
    121
    y
    26
    SUB
    58
    :
    90
    Z
    122
    z
    27
    ESC
    59
    ;
    91
    [
    123
    {
    28
    FS
    60
    <
    92
    /
    124
    |
    29
    GS
    61
    =
    93
    ]
    125
    }
    30
    RS
    62
    >
    94
    ^
    126
    `
    31
    US
    63
    ?
    95
    _
    127
    DEL