目录

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

以太坊RLP机制分析相关推荐

  1. 以太坊源码分析-交易

    以太坊源码分析-交易 机理 先说一点区块链转账的基本概念和流程 用户输入转账的地址和转入的地址和转出的金额 系统通过转出的地址的私钥对转账信息进行签名(用于证明这 笔交易确实有本人进行) 系统对交易信 ...

  2. php区块链以太坊,兄弟连区块链教程以太坊源码分析CMD深入分析(一)

    兄弟连区块链教程以太坊源码分析CMD深入分析. cmd包分析 cmd下面总共有13个子包,除了util包之外,每个子包都有一个主函数,每个主函数的init方法中都定义了该主函数支持的命令,如 geth ...

  3. kademlia java_死磕以太坊源码分析之Kademlia算法

    死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询 ...

  4. 以太坊RLP编码规则

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链中以太坊RLP编码规则! RLP(Recursive Length Prefix,递归长度前缀)编码算法,是以太坊 ...

  5. 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  6. 以太坊:RLP机制分析

    目录 1 RLP 定义 2 RLP 编码规则 3 RLP 编码实例 4 RLP 分析 1 RLP 定义 RLP,即 Recursive Length Prefix, 递归长度前缀编码,是以太坊数据序列 ...

  7. 以太坊源码分析之随心笔记

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 以太坊索引 table.go 定期随机选取一些节点找他们要他们的节点,放到本地,也就是一个随机找节点的table 里头的 ...

  8. go-ethereum-code-analysis 以太坊源码分析

    分析go-ethereum的过程,我希望从依赖比较少的底层技术组件开始,慢慢深入到核心逻辑. 目录 go-ethereum代码阅读环境搭建 以太坊黄皮书 符号索引 rlp源码解析 trie源码分析 e ...

  9. Merkle Patricia Tree (MPT) 以太坊merkle技术分析

    转载自:https://blog.csdn.net/zslomo/article/details/53434883 一 传统merkle树缺陷 我的这篇博客merkle tree 分析 详细解释了me ...

最新文章

  1. sql 脚本编写之路 常用语句(一) 1.用一个表中的某一列更新另外一个表的某些列:...
  2. BUUCTF-Reverse:reverse2
  3. StoryBoard概览
  4. xp 硬盘安装linux双系统,WinXP硬盘安装Ubuntu 11.10双系统全程图解
  5. 突发!吴恩达确诊新冠,46岁生日还有不到3个月
  6. 使用 CoreDNS sidecar 来优化 Kubernetes Pod dns 性能
  7. 成绩表格模板MySQL_Mysql数据统计脚本模板
  8. Mask R-CNN抢车位,快人一步!
  9. web服务器 apache_如何配置Apache Web服务器
  10. 协议实现objective C 协议的实现
  11. 问题 I: 简单的整数排序
  12. java字符串元素置于最前_java_java编程常用技术(推荐),一:将String字符串放在最前面 - phpStudy...
  13. vue过滤器微信小程序过滤器和百度智能小程序过滤器
  14. Python 三级菜单-字符编码和转码-集合的操作-文件的操作
  15. jquery 获取 选中的radio的值
  16. Modbus 调试工具: Modbus poll与Modbus slave下载与使用(上)
  17. python echarts接口_GitHub - jllan/pyecharts: Python Echarts Plotting Library
  18. 三星官宣所有5G设备信息图 看完有何感想
  19. 加密项目是否采用DAO模式 首先考量这8个因素
  20. 【Swagger】配置信息详解(涉及源码分析)

热门文章

  1. 如何使用JPA注解标注多对多的关系
  2. 简单是可靠的先决条件
  3. javascript对象之window对象详解
  4. android google 下拉刷新 csdn,android SwipeRefreshLayout google官方下拉刷新控件
  5. usaco shuttle puzzle(dfs剪枝)
  6. m.pythontab.com_python字符串连接的三种方法及其效率、适用场景详解
  7. 商品详细信息的代码html_电商网站的商品详情页系统架构
  8. cpu计算机兼容,电脑升级之CPU篇:给CPU升级主要是兼容性问题,其他方法也用不上...
  9. java单循环 比较得分_java – 为什么两个单独的循环比一个快?
  10. java methode_Java Method.getTypeParameters方法代码示例