标签:
RLP(Recursive Length Prefix, 递归长度前缀编码),是Ethereum中对象序列化的一个主要的编码方式,其目的是对任意嵌套的二进制数据的序列进行编码。
RLP的目的仅仅是编码一些数据结构,而像string,int,float这些特定的原子数据类型就留给了更高阶的编码协议。在以太坊中,整形必须用没有前导0的大端格式编码(因此整数0则是一个空的数组)。
如果要编码一个字典,推荐使用两种规范的编码格式——一是通过key的字典序来组织字典[[k1,v1],[k2,v2]……],另一种是以太坊中使用的高层的Patricia Tree。
定义:
RLP编码接受一个item。Item的定义如下:
例如一个空的string是一个item,同样一个单词“cat”也是一个item。包含任意个string的列表(例如,["cat",["puppy","cow"],"horse",[[]],"pig",[""],"sheep"])也是一个item。
RLP编码按一下定义:
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
标签:
原文地址:http://www.cnblogs.com/fengzhiwu/p/5565559.html