链接:https://eth.wiki/en/fundamentals/rlp
RLP(递归长度前缀)的目的是对二进制数据的任意嵌套数组进行编码,而RLP是在以太坊中序列化对象的主要编码方法。RLP的唯一目的是对结构进行编码。编码特定的数据类型(例如,字符串,浮点数)由更高阶的协议决定;但是正RLP整数必须以大尾数二进制形式表示,且不包含前导零(因此使整数值零等于空字节数组)。具有前导零的反序列化正整数必须视为无效。字符串长度的整数表示形式以及有效载荷中的整数也必须采用这种方式进行编码。其他信息可以在以太坊黄皮书附录B中找到。
如果希望使用RLP对字典进行编码,则建议的两种规范形式是按字典顺序将[[k1,v1],[k2,v2] ...]与键结合使用,或使用更高级别的Patricia树以太坊进行编码
定义:
RLP编码功能接收一个项目。一个项目定义如下:
- 字符串(即字节数组)是一项 项目
- 列表是一个项目
例如,一个空字符串是一个项目,包含单词“ cat”的字符串,包含任意数量的字符串的列表以及更复杂的数据结构(例如,["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]。
RLP编码定义如下:
- 对于值在[0x00,0x7f]范围内的单个字节,该字节是其自己的RLP编码
- 否则,如果字符串的长度为0-55个字节,则RLP编码由一个值为0x80的单个字节加上该字符串的长度()组成。因此,第一个字节的范围是[0x80,0xb7]。55的16进制是0x37。
- 如果字符串的长度超过55个字节,则RLP编码由一个值为0xb7的字节加上二进制形式的字符串长度的以字节为单位的长度(也即长度的长度,存储字符串长度数据的字节数),其后为字符串的长度,然后为字符串.例如,长度为1024的字符串将被编码为\ xb9 \ x0