区块链技术探索

以太坊 RLP详解

2018-09-11  本文已影响21人  hasika

RLP(Recursive Length Rrefix, 递归长度前缀)提供了一种适用于任意二进制数据数组的编码,RLP已经称为以太坊中对对象进行序列化的主要编码方式。RLP的唯一目标就是解决结构体的编码问题;对原子数据类型(比如:字符串,整数型,浮点型)的编码则交给更高层的协议;以太坊中要求数字必须是一个大端字节序的、没有零占位的存储的格式(也就是说,一个整数0和一个空数组是等同的)

下面详细介绍RLP编码的五个规则

RLP编码后的第一个字节很重要,根据输入的不同,第一个字节代表的含义也不同。

下表中列出了不同的规则对应的第一个字节的范围(tip: 一个字节8位,换成16进制是2位)

规则 规则一 规则二 规则三 规则四 规则五
范围 0x00~0x7f 0x80~0xb7 0xb8~0xbf 0xc0~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'](规则三)

总结

与其他序列化方法相比,RLP编码的优点在于使用了灵活的长度前缀来表示数据的实际长度,并且使用递归的方式能编码相当大的数据。只读取第一个字节,就可以知道数据的大小。

我正在「哈斯卡和他的朋友们」和朋友们讨论有趣的话题,你⼀起来吧 https://t.zsxq.com/iiMvfea
上一篇下一篇

猜你喜欢

热点阅读