以太坊ソースコード解析-RLP(理論)
5771 ワード
RLP(Recursive Length Prefix)は、太坊シーケンス化に用いられる符号化方式である再帰長プレフィックス符号化と呼ばれる.RLPは主にイーサー坊におけるデータのネットワーク転送と永続化ストレージに用いられる.
RLPは、実際には、以下の2種類のデータ符号化のみを行う. byte配列 byte配列の配列をリスト と呼ぶ
ルール1:値が[0,127]の間の単一バイトについて、その符号化はそれ自体である.
例:
ルール2:byte配列長l<=55の場合、符号化の結果は配列自体であり、128+lを接頭辞として付加する.
例:
ルール3:配列長が55より大きい場合、符号化結果の1つ目は183に文字列長を加えたバイト数であり、次いで配列長自体の符号化であり、最後にbyte配列の符号化である.
次の文字列をエンコードします.
この文字列は86バイトで、86の符号化には1バイトしか必要ありません.それはそれ自身です.そのため、符号化の結果は以下の通りです.
最初の3バイトは次のように計算されます.
1024回の「a」を繰り返す文字列が符号化され、その結果、
1024バイナリは10000000000で、1バイトは8ビットなので、1024のバイト数は2 4 0で配列長の符号化です
1024は2バイトを占有し、ルール1に従って1024を2バイトの
ルール4:リスト長が55未満の場合、符号化結果1位は192プラスリスト長の符号化の長さであり、各サブリストの符号化が順次接続される.
例6:[abc,def]の符号化結果は
ここで、
ルール5:リスト長が55を超える場合、符号化結果1位は247にリスト長を加えた符号化長が占めるバイト数であり、次にリスト長そのものの符号化であり、最後に各サブリストの符号化を順次接続する.
のエンコーディング結果は次のとおりです.
最初の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
復号時には、まず、符号化結果の1バイト目fの大きさに基づいて、以下のルール判定を実行する. f∈[0128]の場合、それはバイト自体です. f∈[128,184]の場合、それは55を超えない長さのbyte配列であり、配列の長さは である. f∈[184192]の場合、長さが55を超える配列であり、長さ自体の符号化長が f∈(192247)では、符号化後の総長が55を超えないリストであり、リスト長は f∈(247256)の場合、符号化後の長さが55より大きいリストであり、その長さ自体の符号化長が
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
定義#テイギ#
RLPは、実際には、以下の2種類のデータ符号化のみを行う.
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バイトの
00000100
と00000000
に分け、10進数に換算すると4
と0
になるリスト#リスト#
ルール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の大きさに基づいて、以下のルール判定を実行する.
l=f-128
ll=f-183
であり、2バイト目から長さがllのbytesが読み出され、BigEndianに従って整数l、lが配列の長さとなるように符号化される.l=f-192
である.再帰的にはルール1~4を用いて復号する.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