当前位置: 首页 > 编程日记 > 正文

以太坊RLP机制分析

目录

1 RLP 定义

2 RLP 编码规则

3 RLP 编码实例

4 RLP 分析

1 RLP 定义

RLP,即 Recursive Length Prefix, 递归长度前缀编码,是以太坊数据序列化的主要方法, 具有较好的数据处理效率,尤其是将长度和类型统一作为前缀,实际上 RLP 是基于 ASCII 编码的一种结构化扩充,既能表示长度还能表示类型,是一种非常紧凑的结构化编码方案。 该编码方案用于编码任意的嵌套结构的二进制数据,区块、交易等数据结构在持久化时会先 经过 RLP 编码后再存储到数据库中。RLP 的唯一目标就是解决结构体的编码问题;对原子 数据类型(比如,字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数 字必须是一个大端字节序的、没有零占位的存储的格式(也就是说,一个整数 0 和一个空数 组是等同的)。如果要编码一个字典,推荐使用两种规范的编码格式——一是通过 key 的字 典序来组织字典[[k1,v1],[k2,v2]……],另一种是以太坊中使用的高层的 Patricia Tree。

RLP 编码的定义只处理两类数据:

一类是字符串(例如字节数组),即一串二进制数据(strings);

一类是列表。即一个嵌套递归的结构,里面可以包含字符串和列表。

例如:[“cat”,[“puppy”,“cow”],“horse”,[[]],“pig”,[“”],“sheep”]

其他类型的数据需要转成以上的两类,转换的规则不是 RLP 编码定义的,可以根据自己的 规则转换,例如 struct 可以转成列表,int 可以转成二进制(属于字符串一类),以太坊中整 数都以大端形式存储。

从 RLP 编码的名字可以看出它的特点:

一是递归,被编码的数据是递归的结构,编码算法也是递归进行处理的;

二是长度前缀,即 RLP 编码都带有一个前缀,这个前缀是跟被编码数据的长度相关的。

2 RLP 编码规则

规则一:单字节值在[0x00,0x7f]之间的,编码就是自身。需要注意的是 0x7f 这个边界,因为 ASCII 编码最大值就是 0x7f(即二进制 1111,1111),也就是说在 0x7f 以内完全当做 ASCII 编码使用。

规则二:如果一个 string 长度在 0-55 之间,编码结果的为在 string 开头加一个字节,这个字 节的值是 0x80 加上 string 的长度。由于被编码的字符串最大长度是 55=0x37,因此单字节前 缀的最大值是 0x80+0x37=0xb7,即编码的第一个字节的取值范围是[0x80, 0xb7]。 (128—183)

(0x80+[string 的长度]) || string

规则三:如果一个 string 长度超过了 55 个字节,编码结果的第 1 个字节为 0xb7+string 的长度 值(字节表示)的长度,后跟着string的长度,后跟着string。所以第一个字节的范围为[0xb8,0xbf]。

(0xb7+string 长度值的长度) || (string 的长度) || string

比如某个 string 长度为 1024(0x0400),0x0400 的长度为 2,因此第 1 个字节为前缀应该是 0xb7+2=0xb9,后面跟着0x0400,再后面跟着string,即整个RLP编码应该是\xb9\x0400\string。 编码的第一个字节即前缀的取值范围是[0xb8, 0xbf],因为字符串长度二进制形式最少是 1个字节,因此最小值是 0xb7+1=0xb8,字符串长度二进制最大是 8 个字节,因此最大值是 0xb7+8=0xbf。(184—191)

规则四:如果一个数组中所有元素的长度之和在 0-55 之间,编码结果的第 1 个字节为 0xc0+ 所有元素的长度,后面跟着列表中各元素的编码串,因此第 1 个字节的范围在[0xc0,0xf7]。 [192—247]

(0xc0+列表元素总长度) || 列表各元素的编码串

规则五:如果数组中所有元素的长度超过 55 个字节,编码结果的第 1 个字节为 0xf7 加上所 有元素长度值(字节表示)的长度,后跟所有元素长度,后面跟着数组。第 1 个字节的范围是 [0xf8,0xff]。 [248—255]

(0xf7+所有元素长度值的长度) || 列表元素总长度 || 列表各元素的编码串

3 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’](规则三)

4 RLP 分析

RLP 编码的设计思想,就是通过首字节快速判断一串编码的类型,充分利用了一个字 节的存储空间,将 0x7f 以后的值赋予了新的含义。相比于 Unicode 的对指定长度字节进行 编码,处理这些编码时一般按照指定长度进行拆分解码,最大的弊端是传统编码无法表现一 个结构,即列表。RLP 最大的优点是在充分利用字节的情况下,同时支持列表结构,也就 是说可以很轻易的利用 RLP 存储一个树状结构。

程序处理 RLP 编码时也非常容易,根据首字节就可以判断出这段编码的类型,同时调用不 同的方法进行解码,类似于 json 结构, RLP 支持嵌套的结构,通过递归调用可以将整个 RLP 快速还原成一颗树,或者转译成一个 json 结构,便于其他程序使用。

RLP 使用首字节存储长度的位数,再用后续的字节表明整体字符串的长度,根据规则二计 算,RLP 可以支持的单个最大字符串长度为 2 的 64 次方,再加上嵌套规则,理论上 RLP 可 以编码任何数据。

原文链接:http://wangxiaoming.com/blog/2017/12/28/HPB-39-ETH-RLP/

转载于:https://www.cnblogs.com/blockchain/p/9397103.html

相关文章:

Android Studio导入Eclipse项目的两种方法

Android Studio导入Eclipse项目有两种方法,一种是直接把Eclipse项目导入Android Studio,另一种是在Eclipse项目里面进行转换,然后再导入Android Studio。 1. 直接导入 打开Android Studio,如果里面已经打开了项目,选择…

mediawiki java api_维基百科 MediaWiki API 解析

使用开放的 API 做一个自己的小项目,是一个很好的学习方法。但好像开放的 API 选择并不多。这里给大家多一个选择,简单介绍一下维基百科使用的 MediaWiki API。简介先简单介绍几个容易混淆的概念。WikiWiki 是一种在网络上开放且可供多人协同创作的超文本…

elasticdump安装_elasticsearch导出、导入工具-elasticdump

elasticsearch导出、导入工具-elasticdumpelasticsearch 数据导入到本地,或本地数据导入到elasticsearch中,或集群间的数据迁移,可以用elasticsearch的工具—elasticdumpelasticdump 可以用用npm安装本地运行,也可以用docker容器运…

mysql 无法登陆_MySQL root用户无法登录原因及解决办法

MySQL root密码正确,却怎么也bai无法du从本地登录MySQL登录提示ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)可能原因是mysql库中bai的user表缺少一个root指向host:localhost的数据项,只有一个root指向h…

Spring Boot启动过程(二)

书接上篇 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractApplicationContext类型并调用它的refresh方法。由于AnnotationConfigEmbeddedWebApplicationContext继承自EmbeddedW…

dom vue 加载完 执行_前端面试题——Vue

前言前几天整理了一些 html css JavaScript 常见的面试题(https://segmentfault.com/u/youdangde_5c8b208a23f95/articles),然后现在也是找了一些在 Vue 方面经常出现的面试题,留给自己查看消化,也分享给有需要的小伙伴。如果文章中有出现纰…

查看某个存储过程

show create procedure 存储过程的名称; ##主从同步是会同步存储过程的 转载于:https://www.cnblogs.com/yangxiaochu/p/9397108.html

java中的分页 效率考虑_面试官:数据量很大,分页查询很慢,有什么优化方案?...

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。准备工作为了…

dede 后台 mysql_织梦dedecms使用Mysql8.0无法登录后台的解决办法

1//只允许用户名和密码用0-9,a-z,A-Z,,_,.,-这些字符2$this->userName preg_replace("/[^0-9a-zA-Z_!\.-]/", , $username);3$this->userPwd preg_replace("/[^0-9a-zA-Z_!\.-]/", , $userpwd);4$pwd substr(md5($this->userPwd), 5, 20);56$d…

怎样对拍、如何对拍、对拍模板

我写了一个对拍模板,套上直接可以用,还有使用说明在里面,这里附上github网站。 对拍全套模板 转载于:https://www.cnblogs.com/yichuan-sun/p/9624162.html

二叉树线索化示意图_103-线索化二叉树思路图解

2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上…

linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):

Postgresql配置及osm2pgsql原始数据导入 2012年,Ubuntu 12.04LTS发布,又一个长效支持版,我们又该更新OpenStreetMap服务器了,这次,将详细在博客中记录配置过程。关于前面对OpenStreetMap的介绍,参考我的博文…

Java开发买低压本还是标压本_标压和低压,笔记本怎么选才最香?

华为最近发布了新款 MateBook 13/14 2020 锐龙版笔记本电脑,与之前的产品相比,它们都采用了 AMD 锐龙标压处理器。在体验这两款产品的同时,我一直在思考两个问题:它们与低压处理器相比强在哪里,以及是否值得购买。按照…

php mysql 备注_php,mysql备注信息1

/*---------------------------------------------------------------------------------------如何彻底地删除表?如果你不需要一个表了,你可以使用DROP.语法如下:DROP TABLE tablename例如:DROP TABLE employee_dataQuery OK,0 rows affected(0.01 sec);--------------------…

JSP和Servlet学习笔记1 - 访问配置

1. 访问 WebContent 目录下的 JSP 文件 在 WebContent 目录下的文件可以直接在浏览器中访问。新建一个 test.jsp 文件 <% page language"java" contentType"text/html; charsetISO-8859-1"pageEncoding"ISO-8859-1"%> <!DOCTYPE htm…

unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)

123 说&#xff1a;雨松大大&#xff0c;有个问题想请教一下&#xff0c;我用UNET构建了个小场景&#xff0c;在电脑上可以客户端可以连接到服务器&#xff0c;Windows和Linux都可以&#xff0c;发布到安卓缺连不了&#xff0c;这是问什么呢说&#xff1a;求教一下&#xff0c;…

博客园的第一篇博文

以后所有技术相关的文章都记录在博客园啦&#xff0c;加油&#xff01;转载于:https://www.cnblogs.com/dabenniu/p/6337549.html

java后台分页插件怎么写_Java分页技术(从后台传json到前台解析显示)

0 这是一篇我在初学习过程中&#xff0c;遇到的动态数据分页显示的问题&#xff0c;前台采用Ajax传给后台&#xff0c;后台在访问数据库取出分页数据再转换为json格式传递给前台&#xff0c;前台再解析显示到表格中。在此写出我在做的过程中遇到的问题&#xff0c;可以让其他人…

c 应用程序mysql_MySQL C 语言应用程序接口开发教程

从数据库中取回数据在这个实例中我们从表中取回数据。步骤&#xff1a;(1)创建连接(2)执行查询(3)获取结果集(4)提取所有可用的记录(5)释放结果集实例程序打印 writers 表中所有的记录(姓名)。#include #include int main(int argc, char * argv[]){MYSQL * conn;MYSQL_RES * r…

GreenPlum学习笔记:基础知识

一、介绍 GreenPlum分布式数据仓库&#xff0c;大规模并行计算技术。 无共享/MPP核心架构Greenplum数据库软件将数据平均分布到系统的所有节点服务器上&#xff0c;所以节点存储每张表或表分区的部分行&#xff0c;所有数据加载和查询都是自动在各个节点服务器上并行运行&…

java 套接字关联的通道_Java 通道教程 – NIO 2.0

# Java 通道教程 – NIO 2.0> 原文&#xff1a; [https://howtodoinjava.com/java7/nio/java-nio-2-0-channels/](https://howtodoinjava.com/java7/nio/java-nio-2-0-channels/)通道是继[**缓冲区**](//howtodoinjava.com/java-7/nio/java-nio-2-0-working-with-buffers/ &…

虚拟机ubuntu14.04系统设置静态ip

ubuntu14.04 设置静态ip vim /etc/network/interfaces 原来只有 auto lo iface lo inet loopback 修改成如下&#xff1a; auto lo iface lo inet loopbackauto eth0 iface eth0 inet static #静态ip address 192.168.1.6 #要设置的ip gateway 192.168.1.1 #这…

高职信息安全比赛攻防思路_30.LNGZ2020-30:2020年辽宁省职业院校技能大赛(高职组)“信息安全管理与评估”赛项规程...

12020年辽宁省职业院校技能大赛(高职组)信息安全管理与评估赛项规程一、赛项名称赛项编号&#xff1a;LNGZ2020-30赛项名称&#xff1a;信息安全管理与评估英文名称&#xff1a;Information Security Management and Evaluation赛项组别&#xff1a;高职组赛项归属&#xff1a;…

oracle rac对心跳要求_关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)...

关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)问&#xff1a;假设如下场景&#xff1a;4个节点rac&#xff0c;心跳线走的是千m网络交换机&#xff0c;若是该千M网络交换机断电&#xff0c;我想知道crs的驱逐节点的算法是怎么样的&#xff1f;Oracle 大连 GCS 答复&am…

php 字符串数组转数组对象_php怎么将数组转成对象?

php将数组转成对象的方法&#xff1a;1、使用数据类型转换&#xff0c;在数组变量前添加“(Object)”来将数组转成对象。2、先使用json_encode()函数将数组转换为json字符串&#xff1b;然后使用json_decode()函数将json字符串转换成对象。php将数组转成对象有时候数组要转为对…

如何在Win7电脑上增加新磁盘分区?

我们在重装好系统Win7系统后有时会碰到需要新建磁盘分区的情况&#xff0c;这时我们再重装系统进行磁盘分区就有些过于麻烦了&#xff0c;其实我们可以利用Win7系统自身的磁盘管理功能来新建一个磁盘分区。下面好系统重装助手就来介绍一下好系统Win7系统电脑磁盘新建分区的方法…

WIn7下Ubuntu 14.04 安装

1. 在Windows下下载Ubuntu14.04的ISO镜像&#xff0c;解压 2. 打开wubi.exe&#xff0c;填写用户名&#xff0c;密码等相关信息&#xff0c;在这里需要注意的是&#xff0c;磁盘空间最好选到最大&#xff08;30G&#xff09;&#xff0c;执行安装 3. 按照提示&#xff0c;重启系…

cimiss数据_CIMISS,你太优秀了!

原标题&#xff1a;CIMISS&#xff0c;你太优秀了&#xff01;本周二的时候小据给大家带来了一位新朋友那便是CIMISS你真的了解它吗&#xff1f;一文读懂CIMISS(戳上面的链接进行回顾)今天我们继续了解一起探讨它能够为我们带来哪些好处天气业务“一站式”数据供给自2014年8月以…

python3 tkinter电子书_python3 tkinter实现添加图片和文本

本文在前面文章基础上介绍tkinter添加图片和文本&#xff0c;在这之前&#xff0c;我们需要安装一个图片库&#xff0c;叫Pillow&#xff0c;这个需要下载exe文件&#xff0c;根据下面图片下载和安装。下载完后直接双击安装exe&#xff0c;默认点击下一步&#xff0c;直到安装完…

序列化和反序列化实现

1. 什么是序列化&#xff1f; 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中&#xff0c;然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化&#xff08;serialization&#x…