(八)以太坊RLP编码解码原理详解

1、什么是RLP编码

  • RLP(Recursive Length Prefix),叫递归长度前缀编码,是一种编码规则,主要用来序列化/反序列化数据,可用于编码任意嵌套的二进制数组数据。

  • RLP编码是以太坊数据序列化的主要编码方式,以太坊中的所有对象都会使用RLP编码序列化为字节数组。

  • RLP编码把数据分成两类,一类是字符串(字节数组)(e.g. hello world),一类是列表(e.g. [“hello”,“world”]) ,其中列表可以包含字符串和列表。其他数据类型可以根据自己的规则转换成这两类,比如struct可以转换成列表。

2、RLP编码的规则

一、字符串(字节数组)

  • 规则1: 对于值在[0, 127]之间的单个字节,其编码是其本身。

    例: a 的ASCII码是97,97在上述范围,因此其RLP编码是 97 。

  • 规则2: 如果byte数组⻓长度l <= 55,编码的结果是数组本身,再加上128+l作为 前缀。

    例: abc, a b c 各自的ASCII码分别是97 98 99,因此其RLP编码亦是自身,而abc的长度为3,则前缀为128 + 3 = 131,因此abc的RLP编码结果就是131 97 98 99。

  • 规则3: 如果数组长度大于55, 编码结果第一个是183加上字符串长度所占⽤的字节数,然后是数组长度的本身的编码,最后是byte数组的编码。

    1、如下⾯这段字符串:
    The length of this sentence is more than 55 bytes, I know it because I pre-designed it
    这段字符串长度为86,86占用一个字节,因此编码前缀为 183 + 1 = 184;86在[0, 127]之间,因此编码结果的第二个是861;编码结果后面就是按照规则1进行的编码,最终编码结果为:184 86 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116
    2、如果长度超过了127呢?如1024个a组成的字符串。
    由于长度1024占用2个字节,因此编码前缀为 183 + 2 = 185
    1024的二进制位0000 0100 0000 0000,拆分成2个字节就是0000 0100 和0000 0000,第一个字节的值为4,第二个字节的值为0,则编码前缀后面一次添加4和0,结果为185 4 0 97 97 97 97 97 97 ...。

二、列表

  • 规则4: 如果列表长度小于55,列表的总长度指的是它包含的项的数量加它包含的各项的长度之和,编码结果第一位是192加列表总长度,然后依次连接各⼦列表的编码。

    例:["abc", "def"],列表包含2项,每项包含3个子项,因此总长度为8,则编码前缀为192 + 8 = 200;abc的编码结果根据规则2可得出为131 97 98 99,def为131 100 101 102;则最终编码结果为200 131 97 98 99 131 100 101 102。

  • 规则5: 如果列表长度超过55,编码结果第⼀位是247加列表长度的编码⻓度所占⽤的字节数,然后是列表长度本身的编码,最后依次连接各子列表的编码。

    如:["The length of this sentence is more than 55 bytes, ", "I know it because I pre-designed it"]
    列表总长度为2 + 86 = 88,88占用1个字节,则编码前缀为247 + 1 = 248,后面连接的是88,在后面是各项的编码,结果为:248 88 179 84 104 101 32 108 101 110 103 116 104 32 111 102 32 116 104 105 115 32 115 101 110 116 101 110 99 101 32 105 115 32 109 111 114 101 32 116 104 97 110 32 53 53 32 98 121 116 101 115 44 32 163 73 32 107 110 111 119 32 105 116 32 98 101 99 97 117 115 101 32 73 32 112 114 101 45 100 101 115 105 103 110 101 100 32 105 116

3、RLP解码

解码时,⾸先根据编码结果第一个字节f的⼤小,执⾏行行以下的规则判断:

  • 如果f∈ [0,128), 那么它是一个字节本身。
  • 如果f∈[128,184),那么它是一个⻓度不超过55的byte数组,数组的长度 为 l=f-128
  • 如果f∈[184,192),那么它是一个⻓度超过55的数组,长度本身的编码长度l=f-183,然后从第二个字节开始读取⻓度为l的bytes,按照 BigEndian编码成整数l,l即为数组的长度。
  • 如果f∈(192,247],那么它是一个编码后总长度不超过55的列表,列表长度为l=f-192。递归使⽤用规则1~4进行解码。
  • 如果f∈(247,256],那么它是编码后长度大于55的列表,其长度本身的编 码长度l=f-247,然后从第二个字节读取长度为l的bytes,按BigEndian编码成整数l,l即为⼦列表长度。然后递归根据解码规则进行解码。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • RLP(Recursive Length Prefix),递归长度前缀编码,它是以太坊序 化所采取的编码方式。RL...
    WallisW阅读 2,927评论 5 4
  • 文章分为2部分, 第一部分是综合整理已有资料而生成的参考文档, 第二部分是python版以太坊代码中的源码实现分析...
    shi_qinfeng阅读 3,542评论 0 3
  • 管理学大师彼得·德鲁克说,人生最悲哀的,莫过于用最高效的方式去做错误的事情。 我们坚持做一件事情,往往是坚信,这样...
    SM十年一梦阅读 997评论 0 4
  • 今天美术老师教我们折船。我给它取名为“变身号”。它即能划水又能滑冰,而且还能变成房子。
    杨欣仪小朋友阅读 212评论 0 0
  • 其實非常不情願說《山中傳奇》的怪話,因為喜歡的導演近40年前的作品,仍不斷在海內外照成影響,還被重新以4K的最高標...
    肖檀阅读 1,659评论 0 0