附A:以太坊区块链技术解析-RLP编码

Recursive Length Prefix, 递归长度前缀编码。在以太坊中所有的区块以及交易都需要先经过RLP编码之后才存到数据库里,是以太坊数据序列化的主要方法。主要用于编码具有嵌套结构的二进制数据,之所以是用新的数据结构,是因为它比之XML、JSON之类的序列化方法更为简洁,更适用于区块链环境下容量有限的区块;同时,它可以解决结构体的编码问题,区块链应该要求数据结构尽量单纯,对原子数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议,这也有利于区块链的安全。

方式:

rlp编码的对象有一个byte、string与string list三种。

一个空的string是一个item,“cat”也是一个item。包含任意个string的list(例如,["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"])也是一个item。

原理如下:

 1.对于byte

 如果一个字节在[0x00, 0x7f],那么这个字节的rlp编码就是本身。


2.对于string

 2.1如果是一个0-55字节的字符串str,rlp编码由prefix+str两部分表示,prefix占一个字节,内容是(0x80+字符串长度);str是字符串。由于str的长度是[0,55],所以前面的prefix取值范围就是[0x80,0xb7]。

 2.2如果是一个大于55个字节的字符串str,rlp编码由prefix+length+str三部分表示。prefix占一个字节,内容是(0xb7+length占几个字节);length是str的长度;str是字符串。举个例子,1024字节的字符串的length是0x0400,占两个字节,preifix就是0xb7+2=0xb9,最后的前缀就是0xb9 0x04 0x00。prefix取值范围是[0xb8,0xbf]。


3.对于string list:

 3.1如果string list中所有string编码后的长度总和(也叫payload)为0-55个字节,rlp编码由totalprefix+[prefix1+str1]+[prefix2+str2]...。totalprefix占一个字节,内容是(0xc0+payload长度);后面的prefix+str与上面string中的情况1一致。举个例子,RLP([“cat”,“dog”])= [ 0xc8, 0x83, 'c', 'a', 't', 0x83,

'd', 'o', 'g' ]。totalprefix范围是[0xc0,0xf7]。

 3.2如果一个list的payload的长度大于55,其RLP编码是list的item的RLP编码的串联,前面加上一个表示payload长度的字节,前面再加上一个payload长度的二进制表示的字节长度。



reference:

翻译自etheream wiki

你可能感兴趣的:(附A:以太坊区块链技术解析-RLP编码)