RLP

news/2024/12/13 2:33:49/

Contents

  • 定义
  • 例子

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

对于在 RLP 格式中对一个字典数据的编码问题,有两种建议的方式,一种是通过二维数组表达键值对,比如[[k1,v1],[k2,v2]...],并且对键进行字典序排序;另一种方式是通过以太坊文档中提到的高级的基数树 编码来实现。

定义

RLP 编码函数接受一个item。定义如下:

  • 将一个字符串作为一个item(比如,一个 byte 数组)
  • 一组item列表(list)作为一个item

例如,一个空字符串可以是一个item,一个字符串"cat"也可以是一个item,一个含有多个字符串的列表也行,复杂的数据结构也行,比如这样的["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"]。注意在本文后续内容中,说"字符串"的意思其实就相当于"一个确定长度的二进制字节信息数据";而不要假设或考虑关于字符的编码问题。

RLP 编码定义如下:

  • 对于 [0x00, 0x7f] 范围内的单个字节, RLP 编码内容就是字节内容本身。
  • 否则,如果是一个 0-55 字节长的字符串,则RLP编码有一个特别的数值 0x80 加上字符串长度,再加上字符串二进制内容。这样,第一个字节的表达范围为 [0x80, 0xb7].
  • 如果字符串长度超过 55 个字节,RLP 编码由定值 0xb7 加上字符串长度所占用的字节数,加上字符串长度的编码,加上字符串二进制内容组成。比如,一个长度为 1024 的字符串,将被编码为\xb9\x04\x00 后面再加上字符串内容。第一字节的表达范围是[0xb8, 0xbf]
  • 如果列表的内容(它的所有项的组合长度)是0-55个字节长,它的RLP编码由0xC0加上所有的项的RLP编码串联起来的长度得到的单个字节,后跟所有的项的RLP编码的串联组成。 第一字节的范围因此是[0xc0, 0xf7]
  • 如果列表的内容超过55字节,它的RLP编码由 0xf7 加上所有的项的RLP编码串联起来的长度的长度得到的单个字节,后跟所有的项的RLP编码串联起来的长度,再后跟所有的项的RLP编码的串联组成。 第一字节的范围因此是[0xf8, 0xff] 。

用Python代码表达以上逻辑:

def rlp_encode(input):if isinstance(input,str):if len(input) == 1 and chr(input) < 128: return inputelse: return encode_length(len(input),128) + inputelif isinstance(input,list):output = ''for item in input: output += rlp_encode(item)return encode_length(len(output),192) + outputdef encode_length(L,offset):if L < 56:return chr(L + offset)elif L < 256**8:BL = to_binary(L)return chr(len(BL) + offset + 55) + BLelse:raise Exception("input too long")def to_binary(x):return '' if x == 0 else to_binary(int(x / 256)) + chr(x % 256)

例子

字符串 "dog" = [ 0x83, 'd', 'o', 'g' ]

列表 [ "cat", "dog" ] = [ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]

空字符串 ('null') = [ 0x80 ]

空列表 = [ 0xc0 ]

数字15 ('\x0f') = [ 0x0f ]

数字 1024 ('\x04\x00') = [ 0x82, 0x04, 0x00 ]

The set theoretical representation of two, [ [], [[]], [ [], [[]] ] ] = [ 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' ]

 


http://www.ppmy.cn/news/203560.html

相关文章

Perl语言简述

1.Hello,World #!/usr/bin/perl -w print ( "hello,world!\n" ); #print "hello,world!\n";说明&#xff1a; &#xff08;1&#xff09;第一行指定解释器&#xff0c;-w参数表示提示警告&#xff08;或者使用use strict命令&#xff0c;执行 更严格的检…

Oracle / PLSQL: RPAD 函数的用法

Oracle / PLSQL: RPAD 函数的用法 1. Oracle/PLSQL RPAD 函数&#xff1a; 往源字符串的右侧填充一些字符 (字符串string1不能为空). 2. 语法格式&#xff1a; Oracle/PLSQL中RPAD 函数的 语法: RPAD( string1, padded_length [, pad_string] ) 3. 参数解释&#xff1a; …

perl语言介绍

Perl语言是一种高级动态编程语言&#xff0c;它是一种通用的脚本语言&#xff0c;常用于Web开发、系统管理、网络编程等领域。Perl语言由Larry Wall于1987年开发&#xff0c;它的设计理念是“简单、实用、灵活、有表现力”。Perl语言是一种自由软件&#xff0c;它的开发和使用都…

华为OD机试真题 Java 实现【工作安排】【2023Q1 100分】

一、题目描述 小明每周上班都会拿着自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内完成工作收入最大化。 二、输入描述 输入的第一…

Character.AI成为新晋AI聊天应用爆款;谷歌推出 Google Slides AI 图像生成

&#x1f989; AI新闻 &#x1f680; Character.AI&#xff1a;首周下载量超越ChatGPT&#xff0c;成为新晋AI聊天应用爆款 摘要&#xff1a;Character.AI是一款受欢迎的人工智能聊天应用&#xff0c;用户可以自由创建AI角色&#xff0c;并与它们聊天。该应用于2023年5月23日…

常用的两款 爱普生epson L801(L系列)清零软件 废墨重置软件 免分下载 内附清零软件使用方法

两款软件&#xff0c;第一款其实是L系列都可以用的&#xff0c;亲测是没问题的。 都是城通网盘下载&#xff0c;我不喜欢百度云&#xff0c;还要登陆&#xff0c;速度也不行。太麻烦&#xff0c;这种不大的下载&#xff0c;城通还算比较方便的。 不需要积分下载的&#xff0c…

相片打印机原理_照片打印机有哪些特点 照片打印机多少钱【详解】

照片打印机打印出来的照片一般能保证细致的打印效果和明显的层次感&#xff0c;所以深受现代年轻人的追捧&#xff0c;它可以完成数码直打操作&#xff0c;用起来也非常的方便。那么&#xff0c;照片打印机的特点有哪些&#xff1f;照片打印机价格是多少呢&#xff1f;今天小编…

1731_makefile编写小结1_编译同目录下的文件

全部学习汇总&#xff1a; GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and lets find an common way so we may dont need to touch makefile code any more! (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是…