`

RLP编码

 
阅读更多

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(“递归长度前缀”)编码

    以太坊 RLP 编码 RLP(“递归长度前缀”)编码是以太坊中使用的主要序列化格式 有关详细信息,请参阅 。

    Python库 | rusty_rlp-0.1.14-cp37-none-win_amd64.whl

    总的来说,`rusty_rlp`是Python开发Ethereum相关应用时不可或缺的工具,它简化了RLP编码和解码的过程,提高了开发效率,同时也为开发者提供了与区块链交互的便捷途径。无论你是构建DApps、智能合约,还是进行...

    PyPI 官网下载 | rusty_rlp-0.1.11-cp36-cp36m-macosx_10_7_x86_64.whl

    总的来说,rusty_rlp是一个Python库,专注于提供RLP编码功能,主要面向Python 3.6的后端开发者,尤其是那些在以太坊或其他基于RLP协议的项目中工作的开发者。这个库的最新版本为0.1.11,可以从PyPI获取,并以.whl...

    rlp:JavaScript中的递归长度前缀编码

    Node.js的前缀编码。 安装 npm install rlp 如果要使用cli,请使用-g安装。 用法 import * as assert from 'assert' import * as rlp from 'rlp' const nestedList = [ [ ] , [ [ ] ] , [ [ ] , [ [ ] ] ] ] const...

    P2P协议.doc

    P2P 协议支持多种类型的 payload,例如 RLP 编码的 payload。 payload 的类型总是由 RLP 的第一个条目所决定。 子协议 P2P 协议支持任意的子协议(也称为能力),这些子协议可以在基本的 wire 协议之上进行扩展。...

    rlp.cr:一个纯库,实现纯水晶语言的递归长度前缀

    在RLP中,marshalling涉及将数据转换为RLP编码的字节流,而在接收端,这些字节流会被unmarshalling(反序列化)回原始数据结构。 **native-library** 指的是直接与操作系统交互的本地库,通常由C、C++或类似的低级...

    rlp.rar_matlab_meatqfu_rlp_全极点

    在IT领域,尤其是在信号处理和语音识别中,"rlp.rar_matlab_meatqfu_rlp_全极点"这个标题涉及到的是一个基于Matlab的算法实现,用于计算正规化线性倒谱功率(NLP)的一种特殊模型,即全极点模型。全极点模型是一种在...

    WeiWallet-iOS:Wei Wallet是适用于iOS的开源以太坊钱包

    它处理核心工作,例如RLP编码,签署交易和广播它们。贡献您可以通过多种方式为该项目做出贡献。 我们欢迎所有领域的贡献,并特别注意: Bug修复性能提升文档改进发现这个有趣的事情或建立合作伙伴关系? 通过电子...

    csharp-sdk:C#的FISCO BCOS客户端SDK

    FISCOBCOS C# Sdk 介绍 FISCOBCOS 区块链 C# Sdk,目前是采用Json RPC API 接口和区块链底层(标准版本)进行适配。...实现合约操作封装,如:合约部署、请求参数构建、交易签名、RLP编码转换等。 实现合约部署、

    ethereum_devp2p_wireshark_dissector:这是Wireshark的以太坊devp2p协议解剖器插件

    3. **RLP编码**:以太坊使用Recursive Length Prefix (RLP)编码规则来表示和序列化数据。插件会解析RLP编码的数据,使得非结构化的二进制数据变得可读。 4. **交易与区块传播**:在以太坊网络中,交易和区块信息是...

    ethereum-blockhashes:记录近期和历史街区哈希值的合同

    此方法需要儿童的RLP编码块头(通常〜476字节)作为一个字符串传递。 它重新计算头的哈希值,并检查它是否与合同存储中的哈希值匹配。 如果是这样,它将解析出父哈希(即标头的前32个字节)并将其存储。 通过调用...

    pyrlp:python RLP序列化库

    递归长度前缀编码(RLP)的Python实现。 您可以在找到该标准的规范,并在上此软件包的文档。 发布设置 对于类似Debian的系统: apt install pandoc 要发布新版本: make release bump= $$ VERSION_PART_TO_BUMP $...

    行业-电子政务-用于实现适合于有效的数据传输的无线电链路协议的方法.zip

    在优化数据传输方面,RLP可能会采用各种策略,如功率控制、信道选择和自适应调制编码。功率控制可以减少能源消耗并减小干扰;信道选择则是在多个可用信道间切换以寻找最佳传输路径;自适应调制编码根据无线信道的...

    图像压缩的源代码

    3. **熵编码**:在图像压缩中,熵编码如算术编码和游程长度预测编码(RLP)通常用于进一步提升压缩效果。它们都是基于概率模型的统计编码,通过对源符号的概率分布进行优化编码,达到更高效的编码效率。 4. **...

    行业资料-电子功用-动态容量无线数据信道的无线电链路协议增强的介绍分析.rar

    首先,我们要理解无线电链路协议(Radio Link Protocol, RLP)在无线通信系统中的核心作用。RLP是数据传输层的关键组成部分,它负责确保数据的可靠传输,通过错误检测和纠正机制来提高数据包的正确接收率。在动态...

    GSM full rate matlab

    RLS)算法相关的Matlab代码,因为RLP(Rate-P Pursuit)有时会被用来表示这种算法,它是信号处理中的一个常见算法,可能在这个GSM全速率编码的实现中用于滤波或参数估计。 GSM全速率编码的具体过程包括以下步骤: ...

    栉孔扇贝核糖体蛋白L24全长cDNA的克隆,序列特征及其性腺表达* (2011年)

    序列比对分析表明,栉孔扇贝rlp24基因编码的蛋白在不同物种之问同源性很高。通过荧光实时定量PCR(real-time PCR)技术,分析了该基因在扇贝性腺发育周期中的表达。结果显示rlp24基因的表达随着精巢发育的成熟而逐渐...

    pcie处理层协议中文详解

    2. **链路层**:这一层主要负责TLP和RLP的编码与解码,以适应不同的数据速率和信号质量。链路层由多个子层组成,包括Lane、Link Training and Status State Machine (LTSSM)等。Lane是数据传输的基本单位,一组Lane...

    CDMA2000 1x EV-DO组网及影响.pdf

    自适应调制编码技术能够根据信道质量调整调制和编码方式,提高数据传输速率和频谱利用率。EV-DO前向链路采用QPSK、8PSK和16QAM调制方式,而EV-DO Rev. A在反向链路使用了QPSK和8PSK,显著增强了反向链路的峰值速率和...

    GSM网络与GPRS

    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...

Global site tag (gtag.js) - Google Analytics