RLP(Recursive Length Prefix, 递归长度前缀编码),是Ethereum中对象序列化的一个主要的编码方式,其目的是对任意嵌套的二进制数据的序列进行编码。
RLP的目的仅仅是编码一些数据结构,而像string,int,float这些特定的原子数据类型就留给了更高阶的编码协议。在以太坊中,整形必须用没有前导0的大端格式编码(因此整数0则是一个空的数组)。
如果要编码一个字典,推荐使用两种规范的编码格式——一是通过key的字典序来组织字典[[k1,v1],[k2,v2]……],另一种是以太坊中使用的高层的Patricia Tree。
定义:
RLP编码接受一个item。Item的定义如下:
- 一个string(例如,byte array)是一个item
- Item的列表是一个item
例如一个空的string是一个item,同样一个单词“cat”也是一个item。包含任意个string的列表(例如,["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"])也是一个item。
RLP编码按一下定义:
- 对于值在[0x00,0x7f]范围内的单字节(ascii表定义的字符),其RLP编码就是其自身
- 否则,如果一个string的长度是0-55字节,那么他的RLP编码是在string开头加一个字节,这个字节的值是\x80加上string的长度,即[\x80, \xb7]。
- 如果一个string的长度大于55,那么RLP编码是在string开头加一个字节,这个字节的值等于\xb7加上string长度的二进制编码的字节长度,然后后面跟着string的长度。比如一个长度为1024字节的string,其长度位1024=\x04\x00,长度为2个字节,因此RLP编码头字节的值为\xb7+\x02=\xb9,跟着\x04\x00。String的RLP编码即\xb9\x04\x00(string)。第一个字节的范围为[0xb8,0xbf]
- 如果一个列表的总的payload(应该是它包含的所有item的编码后长度的和)的长度为0-55,那么list的RLP编码在其item的RLP编码的串联前加上一个字节,这个字节的值是0xc0加上列表的长度(item经过RLP编码后串联记起来的长度)。比如RLP([“cat”,“dog”])= [ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]。所以头字节的范围为[0xc0,0xf7]
- 如果一个list的payload的长度大于55,其RLP编码是list的item的RLP编码的串联,前面加上一个表示payload长度的字节,前面再加上一个payload长度的二进制表示的字节长度。
python代码如下:
#!/usr/bin/env python #encoding=utf-8 # Author: xuyuzhuang - xuyuzhuang@buaa.edu.cn # Last modified: 2016-06-06 22:16 # Filename: rlp_encoding.py # Description: Recursive Length Prefix def rlp_encode(input_): if isinstance(input_, str): if len(input_) == 1 and ord(input_) < 0x80: return input_ else : return encode_length(len(input_),0x80) + input_ elif isinstance(input_, list): output = '' for item in input_: output += rlp_encode(item) return encode_length(len(output),0xc0) + output def encode_length(L,offset): if L < 56: return chr(L + offset) elif L < 256**8: #(2**8)**8 BL = to_binary(L) return chr(len(BL) + offset + 55) + BL else: raise Exception("input to long!") def to_binary(x): if x == 0: return '' else: return to_binary(int(x/256))+chr(x%256) def my_print(string): for i in string: if ord(i) > 32 and ord(i) < 127: print i, else: print hex(ord(i)), if __name__ == "__main__": #string = "dog" string = ["cat", "dog"] #string = "Lorem ipsum dolor sit amet, consectetur adipisicing elit" my_print(rlp_encode(string))
对于“dog”,输出为
对于["cat", "dog"],输出为
对于"Lorem ipsum dolor sit amet, consectetur adipisicing elit",输出为
参考:https://github.com/ethereum/wiki/wiki/RLP
相关推荐
以太坊 RLP 编码 RLP(“递归长度前缀”)编码是以太坊中使用的主要序列化格式 有关详细信息,请参阅 。
总的来说,`rusty_rlp`是Python开发Ethereum相关应用时不可或缺的工具,它简化了RLP编码和解码的过程,提高了开发效率,同时也为开发者提供了与区块链交互的便捷途径。无论你是构建DApps、智能合约,还是进行...
总的来说,rusty_rlp是一个Python库,专注于提供RLP编码功能,主要面向Python 3.6的后端开发者,尤其是那些在以太坊或其他基于RLP协议的项目中工作的开发者。这个库的最新版本为0.1.11,可以从PyPI获取,并以.whl...
Node.js的前缀编码。 安装 npm install rlp 如果要使用cli,请使用-g安装。 用法 import * as assert from 'assert' import * as rlp from 'rlp' const nestedList = [ [ ] , [ [ ] ] , [ [ ] , [ [ ] ] ] ] const...
P2P 协议支持多种类型的 payload,例如 RLP 编码的 payload。 payload 的类型总是由 RLP 的第一个条目所决定。 子协议 P2P 协议支持任意的子协议(也称为能力),这些子协议可以在基本的 wire 协议之上进行扩展。...
在RLP中,marshalling涉及将数据转换为RLP编码的字节流,而在接收端,这些字节流会被unmarshalling(反序列化)回原始数据结构。 **native-library** 指的是直接与操作系统交互的本地库,通常由C、C++或类似的低级...
在IT领域,尤其是在信号处理和语音识别中,"rlp.rar_matlab_meatqfu_rlp_全极点"这个标题涉及到的是一个基于Matlab的算法实现,用于计算正规化线性倒谱功率(NLP)的一种特殊模型,即全极点模型。全极点模型是一种在...
它处理核心工作,例如RLP编码,签署交易和广播它们。贡献您可以通过多种方式为该项目做出贡献。 我们欢迎所有领域的贡献,并特别注意: Bug修复性能提升文档改进发现这个有趣的事情或建立合作伙伴关系? 通过电子...
FISCOBCOS C# Sdk 介绍 FISCOBCOS 区块链 C# Sdk,目前是采用Json RPC API 接口和区块链底层(标准版本)进行适配。...实现合约操作封装,如:合约部署、请求参数构建、交易签名、RLP编码转换等。 实现合约部署、
3. **RLP编码**:以太坊使用Recursive Length Prefix (RLP)编码规则来表示和序列化数据。插件会解析RLP编码的数据,使得非结构化的二进制数据变得可读。 4. **交易与区块传播**:在以太坊网络中,交易和区块信息是...
此方法需要儿童的RLP编码块头(通常〜476字节)作为一个字符串传递。 它重新计算头的哈希值,并检查它是否与合同存储中的哈希值匹配。 如果是这样,它将解析出父哈希(即标头的前32个字节)并将其存储。 通过调用...
递归长度前缀编码(RLP)的Python实现。 您可以在找到该标准的规范,并在上此软件包的文档。 发布设置 对于类似Debian的系统: apt install pandoc 要发布新版本: make release bump= $$ VERSION_PART_TO_BUMP $...
在优化数据传输方面,RLP可能会采用各种策略,如功率控制、信道选择和自适应调制编码。功率控制可以减少能源消耗并减小干扰;信道选择则是在多个可用信道间切换以寻找最佳传输路径;自适应调制编码根据无线信道的...
3. **熵编码**:在图像压缩中,熵编码如算术编码和游程长度预测编码(RLP)通常用于进一步提升压缩效果。它们都是基于概率模型的统计编码,通过对源符号的概率分布进行优化编码,达到更高效的编码效率。 4. **...
首先,我们要理解无线电链路协议(Radio Link Protocol, RLP)在无线通信系统中的核心作用。RLP是数据传输层的关键组成部分,它负责确保数据的可靠传输,通过错误检测和纠正机制来提高数据包的正确接收率。在动态...
RLS)算法相关的Matlab代码,因为RLP(Rate-P Pursuit)有时会被用来表示这种算法,它是信号处理中的一个常见算法,可能在这个GSM全速率编码的实现中用于滤波或参数估计。 GSM全速率编码的具体过程包括以下步骤: ...
序列比对分析表明,栉孔扇贝rlp24基因编码的蛋白在不同物种之问同源性很高。通过荧光实时定量PCR(real-time PCR)技术,分析了该基因在扇贝性腺发育周期中的表达。结果显示rlp24基因的表达随着精巢发育的成熟而逐渐...
2. **链路层**:这一层主要负责TLP和RLP的编码与解码,以适应不同的数据速率和信号质量。链路层由多个子层组成,包括Lane、Link Training and Status State Machine (LTSSM)等。Lane是数据传输的基本单位,一组Lane...
自适应调制编码技术能够根据信道质量调整调制和编码方式,提高数据传输速率和频谱利用率。EV-DO前向链路采用QPSK、8PSK和16QAM调制方式,而EV-DO Rev. A在反向链路使用了QPSK和8PSK,显著增强了反向链路的峰值速率和...
11.1.6 RLP协议 11.1.7 数据服务的发展 11.2 短消息服务 11.2.1 实施单元 11.2.2 层结构 11.2.3 发送过程 11.2.4 无线界面的发送 第12章 SIM卡 12.1 一般性能 12.1.1 幅面 12.1.2 安全特性 12.2 卡的寿命周期 12.2.1...