引介

以太坊-RLP

hpcoder   |     |   1029 次阅读

RLP用以对任意的二进制数据进行编码,是ETH中主要的序列化方式。有两点值得注意:
1)RLP只考虑二进制数据,strings、floats,ints等类型,需要用更高层的协议编码成byte(或byte array)。
2)RLP中整数使用big endian方式并且没有前导0,可使得整数0和一个空的byte array一样。

RLP规则很简单,总的思路是在原数据前面加上标记位来标记序列长度、长度的长度和类型的信息,RLP的编码规则针对两类数据结构进行描述,也就是使用RLP编码只接受这两种数据结构,如不是需要先用别的协议转换成这两种结构。为方便描述,定义满足这两种结构的结构为item:
1)byte array,是一个item,如[0xa0,0xa1]
2)item array,也是一个item 如[[0xa0,0xa1],[0xa0,0xa1]]

RLP编码规则如下:
为方便描述,首先定义:
L:item长度,如 [0xa0,0xa1] L=2
LByte : item长度所占用的字节数,如 L=2 LByte=1, L=256 LByte=2

  1. 如果item是一个byte,并且范围是[0x00, 0x7f],编码结果=item
  2. 如果item是byte array,且的长度在0-55,编码结果=[0x80+L,item],是在item前面加个前缀byte,前缀byte的范围[0x80,0xb7]
  3. 如果item是byte array,且长度大于55,编码结果=[0xb8+LByte,L,item],LByte的最大值是8,因此前缀byte范围[0xb8, 0xbf]
  4. 如果item是item array结构,由内到外对item进行编码,如array内数据RLP编码后的总长度是0-55,编码结果=[0xc0+L,item],RLP前缀byte范围[0xc0, 0xf7]
  5. 如array内数据RLP编码后的总长度大于55,编码结果=[0xf8+LByte,L,item]前缀byte范围[0xf8, 0xff]
 
0 人喜欢