RLP
** 原创勿转 **
这是在看devp2p时看到的,英文原文地址:https://github.com/ethereum/wiki/wiki/RLP
RLP: Recursive Length Prefix,中文直译“递归长度前缀”(很别扭有没有,不管叫什么,它就在那里)。 实际上就是一种数据编码方式,类似Base64之类的。
一. 推荐的两种编码形式
. 使用[[k1,vv1],[k2,v2]...], 其中k1,k2,... 是字典顺序
. 使用Patricia Tree, 以太坊中使用这种方式
二. 编码函数需要一个数据项(item)
对于item的定义:
. 串(比如字节数组, golang: []byte{}, java: byte[])是一个item
. item列表也是一个item
例:空string, 空列表[], "cat", 列表["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]
在原文中, string并不是一个字符串,是"a certain number of bytes of binary data"的同义词, 即某个特定长度的二进制数据, 对于具体的数据,长度是固定的。
可以理解为字节数组, 而不仅仅是字符串。
三. 具体的编码过程
其中第一个字节是特殊的,以byte0表示, byte0 按其值将[0x00,0xff]划分为5个部分: [0x00,0x7f], [0x80,0xb7], [0xb8, 0xbf], [0xc0, 0xf7], [0xf8, 0xff]
*** 这里的方括号表示区间, 同时编码结果也用方括号表示,比如[0x83, 'c','a','t'], 注意区分。
1. 单字节
单字节值的取值范围在[0x00, 0x7f]之间的数据,编码等于这个字节
生成数据的格式:[byte0], 所以 byte0的取值范围是[0x00, 0x7f]
比如: "A", 0x41, 编码就是[0x41]
对于[0x80, 0xff]的单字节,适用下一条规则
2. 0-55个字节的数据
这包括1里排除的[0x80, 0xff]单字节, 它的编码数据是这样产生的:
编码格式:[byte0, 原始数据]
byte 0 = 0x80 + 原始数据的长度, 所以byte0的取值范围就是0x80 + (0-55) = [0x80, 0x80+55] = [0x80, 0xb7] (0x80= 128,0xb7=183)
比如:
0x95, 长度为1, 那么byte0 = 0x80 + 1 = 0x81, 编码为[0x81, 0x95], 这个是1里排除的数据
"cat", 长度为3, 那么byte0 = 0x80 + 3 = 0x83, 编码为[0x83, 'c', 'a', 't']
string('null') = 0x00 = [0x80 + 0(长度为0, 空格按1规则编码)] = [0x80]
3. 对于长度大于55的数据
编码格式: [byte0, 长度(不一定几个字节), 原始数据]
byte0 = 0xb7 + 长度占用的字节。 长度是整数, 比如15,那么它占用1个字节,说得绕一点,就是长度的长度
长度:就是其二进制表示
比如:长度为1024的数据, byte0 = 0xb7 + 2 (1024的十六进制表示为0x0400, 所以占用两个字节) = 0xb9
整个数据的编码就是[0xb9, 0x04, 0x00, 原始数据]
长度既然是整数, 其在内存里最多占用8个字节, 所以byte0的取值范围:[0xb7 + (1-8)] = [0xb8, 0xbf]
4. 对于列表来说
(对于列表,我的理解应该算是串的数组吧。)
如果它的每个数据都被编码过了,而整个列表的数据长度是0-55, 那么
编码格式:[byte0,列表各项编码后的数据]
byte0 = 0xc0 + 列表所有数据的长度, 那么byte0 = 0xc0 + (0-55) = [0xc0, 0xc0 + 55] = [0xc0, 0xf7] (0xc0=192, 0xf7=247)
比如:"cat" = [0x83,'c','a','t'], "dog" = [0x83, 'd','o','g'], 这两个适用规则2
byte0 = 0xc0 + 8("cat"和"dog"编码后的总长度) = 0xc8
["cat", "dog"] = [0xc8, 0x83, 'c','a','t', 0x83, 'd','o','g']
5. 相对于规则4, 如果列表编码后数据总长度大于55
编码格式: [byte0, 长度,列表各项编码后数据]
byte0 = 0xf7 + 长度的长度, 所以byte0的取值范围:[0xf7 + (1-8)] = [0xf8, 0xff], 长度的长度取值是1个字节到8个字节
总的来说,对于超过55的长度, 要使用长度的长度。
解码是相反的过程,有时间再写吧。
RLP的更多相关文章
- RLP编码
RLP(Recursive Length Prefix, 递归长度前缀编码),是Ethereum中对象序列化的一个主要的编码方式,其目的是对任意嵌套的二进制数据的序列进行编码. RLP的目的仅仅是编码 ...
- 以太坊RLP用法-go-ethereum学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- RLP(转发注明出处)
目录 RLP序列化 什么是序列化? 为什么要序列化? RLP序列化处理的两项数据 RLP序列化采取的5项规则: 利用python写的RLP 实际中的使用是个怎么样子? RLP分析 参考目录 @ RLP ...
- 以太坊系列之一: 以太坊RLP用法-以太坊源码学习
RLP (递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经成为以太坊中对对象进行序列化的主要编码方式.RLP的唯一目标就是解决结构体的编码问题:对原子数据类型(比如,字符串,整数型, ...
- RLP序列化算法
RLP RLP(Recursive Length Prefix)递归长度前缀编码,是由以太坊提出的序列化/反序列化标准,相比json格式体积更小,相比protobuf对多语言的支持更强. RLP将数据 ...
- centos6.3与jexus5.4.4配置支持php(wordpress)
centos6.3与jexus5.4.4配置支持php,并搭建自己的wordpress博客,供那些在Linux平台下想让 php和asp.net一起跑的初学者参考. 1.搭建webserver 首先准 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- linux查看端口及端口详解
今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...
- js下载项目中的文件
项目中有一个连接是下载视频插件,放到服务器上,不能io输出,所以指定地址直接下载 <div id="objInfo"> <jsp:include page=&qu ...
随机推荐
- Windows下docker的安装,将ASP.NET Core程序部署在docker中
参考文章: https://www.cnblogs.com/jRoger/p/aspnet-core-deploy-to-docker.html https://www.cnblogs.com/jRo ...
- NS3网络仿真(10): 解析以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...
- uva11059(最大乘积)
Problem D - Maximum Product Time Limit: 1 second Given a sequence of integers S = {S1, S2, ..., Sn}, ...
- Zend_Json 简介 --(手冊)
1. 简单介绍 Zend_Json 提供一个方便的方式来串联(native的)PHP(的变量)和JSON,并将JSON(对象)解码到PHP中. 2. 基本使用方法 Zend_Json的使用包含使用 ...
- 腾讯云安全:移动 APP 安全行业报告
移动 APP 已逐步渗透入我们的生活,据统计,2016年,APP 发行数量仅电商.金融.游戏这三大类共计高达2万左右,国内移动互联网活跃用户数已经突破10亿,移动互联网这样快速的推移,移动互联网的安全 ...
- 第五章 使用 SqlSession
第五章 使用 SqlSession 原文链接; http://www.mybatis.org/spring/zh/sqlsession.html 在 MyBatis 中,你可以使用 SqlSessio ...
- java什么叫线程安全?什么叫不安全?
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫线程安全: 如果你的代码所在的 ...
- Python 3.6.3 利用Dlib 19.7库进行人脸识别
0.引言 自己在下载dlib官网给的example代码时,一开始不知道怎么使用,在一番摸索之后弄明白怎么使用了: 现分享下 face_detector.py 和 face_landmark_detec ...
- iOS 如何优化 App 的启动时间
App 运行理论 main() 执行前发生的事 Mach-O 格式 虚拟内存基础 Mach-O 二进制的加载 理论速成 Mach-O 术语 Mach-O 是针对不同运行时可执行文件的文件类型. 文件类 ...
- c#扩展方法的使用
"扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型." 1.为什么会有扩展方法 你一定很疑问什么是扩展方法!什么 ...