`

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

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

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

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

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

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

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

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

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

    pyrlp:python RLP序列化库

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

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

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

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

    论文研究-一种求解工程调度中资源水平问题的遗传算法.pdf

    论文研究-一种求解工程调度中资源水平问题的遗传算法.pdf, ...文中对解的编码方式、遗传算子的定义及算法结构进行了描述 .通过对大量被普遍应用的标准问题的求解实验表明 ,遗传算法是求解 RLP的一种有效算法 .

    plasma-mvp-rootchain:根据Plasma MVP规范执行智能合约

    等离子体MVP 实施注意: develop分支包含根链...根合同详细信息事务以以下形式编码: RLP_ENCODE([ [Blknum1, TxIndex1, Oindex1, DepositNonce1, Input1ConfirmSig, Blknum2, TxIndex2, Oindex2, DepositNonce2, In

Global site tag (gtag.js) - Google Analytics