文档章节

RLP编码原理

dophin459
 dophin459
发布于 2017/05/06 21:56
字数 1068
阅读 3.1K
收藏 2

RLP(Recursive Length Prefix,递归长度前缀)是一种编码算法,用于编码任意的嵌套结构的二进制数据,它是以太坊中数据序列化/反序列化的主要方法,区块、交易等数据结构在持久化时会先经过RLP编码后再存储到数据库中。

定义

RLP编码的定义只处理两类数据:一类是字符串(例如字节数组),一类是列表。字符串指的是一串二进制数据,列表是一个嵌套递归的结构,里面可以包含字符串和列表,例如["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]就是一个复杂的列表。其他类型的数据需要转成以上的两类,转换的规则不是RLP编码定义的,可以根据自己的规则转换,例如struct可以转成列表,int可以转成二进制(属于字符串一类),以太坊中整数都以大端形式存储。

从RLP编码的名字可以看出它的特点:一个是递归,被编码的数据是递归的结构,编码算法也是递归进行处理的;二是长度前缀,也就是RLP编码都带有一个前缀,这个前缀是跟被编码数据的长度相关的,从下面的编码规则中可以看出这一点。

RLP编码规则

  • 对于单个字节,如果它的值范围是[0x00, 0x7f],它的RLP编码就是它本身。
  • 否则,如果一个字符串的长度是0-55字节,它的RLP编码包含一个单字节的前缀,后面跟着字符串本身,这个前缀的值是**0x80**加上字符串的长度。由于被编码的字符串最大长度是55=0x37,因此单字节前缀的最大值是0x80+0x37=0xb7,即编码的第一个字节的取值范围是[0x80, 0xb7]
  • 如果字符串的长度大于55个字节,它的RLP编码包含一个单字节的前缀,后面跟着字符串的长度,后面再跟着字符串本身。这个前缀的值是**0xb7**加上字符串长度的二进制形式的字节长度,说的有点绕,举个例子就明白了,例如一个字符串的长度是1024,它的二进制形式是10000000000,这个二进制形式的长度是2个字节,所以前缀应该是0xb7+2=0xb9,字符串长度1024=0x400,因此整个RLP编码应该是\xb9\x04\x00再跟上字符串本身。编码的第一个字节即前缀的取值范围是[0xb8, 0xbf],因为字符串长度二进制形式最少是1个字节,因此最小值是0xb7+1=0xb8,字符串长度二进制最大是8个字节,因此最大值是0xb7+8=0xbf
  • 如果一个列表的总长度(列表的总长度指的是它包含的项的数量加它包含的各项的长度之和)是0-55字节,它的RLP编码包含一个单字节的前缀,后面跟着列表中各元素项的RLP编码,这个前缀的值是**0xc0**加上列表的总长度。编码的第一个字节的取值范围是[0xc0, 0xf7]
  • 如果一个列表的总长度大于55字节,它的RLP编码包含一个单字节的前缀,后面跟着列表的长度,后面再跟着列表中各元素项的RLP编码,这个前缀的值是**0xf7**加上列表总长度的二进制形式的字节长度。编码的第一个字节的取值范围是[0xf8, 0xff]

RLP编码例子

  • 字符串 "dog" = [0x83, 'd', 'o', 'g' ] (规则二)
  • 列表 ["cat","dog"] = [0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ] (规则四)
  • 空字符串 "" = 0x80 (规则二)
  • 空列表 [] = [0xc0] (规则四)
  • 整数 15('\x0f') = 0x0f (规则一)
  • 整数 1024('\x04\00') = [0x82, 0x04, 0x00] (规则二)
  • 列表 [ [], [[]], [ [], [[]] ] ] = [0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0] (规则四)
  • 字符串 "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = [0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't'] (规则三)

本文大部分翻译自以太坊github wiki文档,并加入自己的理解。

参考资料:https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP

© 著作权归作者所有

dophin459
粉丝 11
博文 15
码字总数 15489
作品 0
西城
程序员
私信 提问
加载中

评论(0)

以太坊RLP(递归长度前缀)编码

RLP(Recursive Length Prefix)即递归长度前缀编码,RLP主要用于以太坊数据的网络传输和持久化存储。 说明:十六进制表示数字前面会加‘0x’, 十进制直接用数字表示,如和是一个数字的不同...

深入浅出区块链
2019/05/20
0
0
深入讲解以太坊的数据存储

前言:本文的目的是打算深入浅出讲讲以太坊的整体结构以及存储相关的内容,会聚焦在存储上,同时会结合源码讲解,整个过程也可以体会到作者的设计思想之精妙。 一,区块 block是最重要的数据...

2018/01/08
0
1
以太坊: ETH 发送交易 sendRawTransaction 方法数据的签名 和 验证过程

作者:林冠宏 / 指尖下的幽灵 掘金:juejin.im/user/587f0d… 博客:www.cnblogs.com/linguanh/ GitHub : github.com/af913337456… 腾讯云专栏: cloud.tencent.com/developer/u… 目录 前...

林冠宏
2018/09/07
0
0
Python从头实现以太坊(一):Ping

以太坊是一种可以在区块链上执行代码的加密货币。这个功能允许人们编写可以自动运行的“智能合约”。大概一年前,一个叫做DAO的智能合约炸锅了,有人找到方法操纵它去获取当时价值4100万美元...

JonHuang
2017/08/18
0
0
java 以太坊开发利器web3j

为了给希望使用web3j的开发人员提供更大的灵活性,项目由多个模块组成。 根据依赖顺序,列一下: org.web3j.utils :最小实用模块。 org.web3j.rlp :递归长度前缀(RLP)编码器。 org.web3...

智能合约
2018/07/03
173
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP——wampserver

<?php { echo "你好PHP"; echo "<br />"; echo date("Y-m-d H:i:s"); } ?> 上面这种语句块运行出现了图一这种情况:                     ......

osc_8ki1usvn
6分钟前
8
0
c++中的多态机制

目录   1 背景介绍   2 多态介绍     2-1 什么是多态     2-2 多态的分类     2-3 动态多态成立的条件     2-4 静态联编和动态联编     2-5 动态多态的实现原理   ...

osc_7z601p6x
8分钟前
17
0
break和continue 还有习题帅气的输出1到20

(44)break 可以跳出当前循环体,或者跳出switch (45)continue 进入下一次循环 (46)习题1,帅气的输出1到20 1 #include<stdio.h> 2 int main(void) 3 { 4 for(int i=1;i<=4;++...

osc_ow92sntn
8分钟前
18
0
2、Python与pycharmIDE安装

1、Python基础入门 1.1、Python简介 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号...

osc_sqtwbty4
9分钟前
17
0
(52)指针 (53)数组的增删改查

(52)指针 1. int * p定义一个指针 2. P=&a就能将指针指向变量a 3.定义一个赋值函数不能直接赋值需要用指针 1 #include<stdio.h> 2 void f1(int *b) 3 { 4 *b=10; 5 } 6 int mai...

osc_z7z4vuvs
10分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部