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(“递归长度前缀”)编码是以太坊中使用的主要序列化格式 有关详细信息,请参阅 。
Node.js的前缀编码。 安装 npm install rlp 如果要使用cli,请使用-g安装。 用法 import * as assert from 'assert' import * as rlp from 'rlp' const nestedList = [ [ ] , [ [ ] ] , [ [ ] , [ [ ] ] ] ] const...
它处理核心工作,例如RLP编码,签署交易和广播它们。贡献您可以通过多种方式为该项目做出贡献。 我们欢迎所有领域的贡献,并特别注意: Bug修复性能提升文档改进发现这个有趣的事情或建立合作伙伴关系? 通过电子...
FISCOBCOS C# Sdk 介绍 FISCOBCOS 区块链 C# Sdk,目前是采用Json RPC API 接口和区块链底层(标准版本)进行适配。...实现合约操作封装,如:合约部署、请求参数构建、交易签名、RLP编码转换等。 实现合约部署、
此方法需要儿童的RLP编码块头(通常〜476字节)作为一个字符串传递。 它重新计算头的哈希值,并检查它是否与合同存储中的哈希值匹配。 如果是这样,它将解析出父哈希(即标头的前32个字节)并将其存储。 通过调用...
递归长度前缀编码(RLP)的Python实现。 您可以在找到该标准的规范,并在上此软件包的文档。 发布设置 对于类似Debian的系统: apt install pandoc 要发布新版本: make release bump= $$ VERSION_PART_TO_BUMP $...
序列比对分析表明,栉孔扇贝rlp24基因编码的蛋白在不同物种之问同源性很高。通过荧光实时定量PCR(real-time PCR)技术,分析了该基因在扇贝性腺发育周期中的表达。结果显示rlp24基因的表达随着精巢发育的成熟而逐渐...
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, ...文中对解的编码方式、遗传算子的定义及算法结构进行了描述 .通过对大量被普遍应用的标准问题的求解实验表明 ,遗传算法是求解 RLP的一种有效算法 .
等离子体MVP 实施注意: develop分支包含根链...根合同详细信息事务以以下形式编码: RLP_ENCODE([ [Blknum1, TxIndex1, Oindex1, DepositNonce1, Input1ConfirmSig, Blknum2, TxIndex2, Oindex2, DepositNonce2, In