以太坊-RLP

广告位

以太坊-RLP

原地址:https://github.com/ethereum/wiki/wiki/RLP

内容定义示例RLP解码实现RLP是递归长度前缀的第一个字母的缩写,什么译法合适?递归长度前缀?慢慢来。

RLP的目的是什么?程序员可能听说过序列化。为了方便数据在网络之间的传输,数据往往是序列化的,这实际上是一种编码。那么RLP的目的也是序列化,就是编码任何嵌套的二进制数据数组。在以太坊中,这个RLP主要用于序列化数据对象。RLP的唯一目的是编码数据结构;特定数据类型(比如字符串和浮点数)的编码是留给高层协议的(注:我不明白,什么高层协议?高阶协议);但是,正RLP整数数据由大端二进制形式表示,并且删除了高阶冗余零。(这就让整数0和空字节数组一样了,想想吧。)用高位0反序列化正整数数据将被视为无效。数据中的字符串长度和整数也是按照这种方法编码的。附件信息请参考以太坊黄皮书附录B。

如果想用RLP编码字典,建议用两种经典的方法,一种是[[k1,v1],[k2,v2].],其中键按字典顺序排列。或者使用另一个,像以太坊,使用更高层次的帕特里夏夏树编码。

简而言之,RLP就像是JSON的二进制编码,假设JSON仅限于存储字符串和数组类型的数据。

定义RLP编码功能以接收项目(如何翻译项目?),该项定义如下:

字符串(包括字节数组)是一个项目,项目列表是一个项目。比如一个空字符串就是一个项,就像一个字符串包含单词“猫”一样,一个列表包含任意数量的字符串,或者更复杂的数据结构,比如[“猫”、[“小狗”、“奶牛”]、“马”,[注意,在本文后面的部分,一个字符串是一定数量的二进制数据字节;没有使用特殊的编码程序,也不知道字符串的内容。

RLP编码定义如下:

对于单个字节的数据,其值在[0x00,0x7f]之间,那么RLP编码的结果就是它本身。否则,如果字符串的长度在0到55之间,RLP编码包含单个字节,其值等于0x80加上字符串的长度,后跟字符串本身。第一个字节的取值范围为[0x80,0xb7] (0xb7=0x80 55)。如果一个字符串的长度大于55,RLP编码包含一个字节,这个字节的值等于0xb7加上二进制形式的字符串长度,然后是字符串的长度,最后是字符串本身。例如,长度为1024的字符串以\\xb9\\x04\\x00\\ string本身的形式编码,(0xb9=0xb7 2 (2是1024的长度),0x0400是1024)。第一个字节的取值范围为[0xb8,0xbf]。如果一个链表的整个字节长度(即RLP编码后每一项的长度之和)为0~55字节,则RLP编码包含单个字节,其值为0xc0加上链表的长度,后面是所有项的RLP编码。第一个字节的取值范围是[0xc0,0xf7],(0xf7=0xc0 55)如果一个列表的字节长度超过55,则RLP码包含一个字节,其值是0xf7加上二进制形式的列表本身的长度,然后是列表的长度,最后是所有项的RLP码的串接。第一个字节的取值范围为[0xf8,0xff]。代码实现是这样的。以Python为例:

示例字符串\” dog\”=[0x83,' d '' o '' g']

List ['猫''狗']=[0xc8,0x83,' c '' a '' t '0x83,' d '' o '' g']

空字符串(' null')=[0x80]

空列表=[0xc0]

整数0=[0x80]

编码整数0 ('\\x00')=[0x00]

编码整数15 ('\\x0f')=[0x0f]

编码整数1024 ('\\ x04 \\ x00')=[0x82,0x004,0x00]

广告位
本文来自网络,不代表区块链网站|NFTS立场,转载请注明出处:https://www.qklwz.com/jzb/ytf/58521.html

作者: 小王聊区块

上一篇
下一篇

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部