一般理解rlp你會找到這兩篇筒扒。
https://github.com/ethereum/wiki/wiki/%5B%E4%B8%AD%E6%96%87%5D-RLP
https://github.com/ethereum/wiki/wiki/RLP
RLP編碼算法:
(1)單字節(jié)值在[0x00,0x7f]之間的,編碼就是自身即0-127
(2)如果一個string長度在0-55之間,編碼結(jié)果的第1個字節(jié)為0x80+string的長度,后面跟著string墓拜。因此第1個字節(jié)范圍在[0x80,0xb7]。
(3)如果一個string長度超過了55個字節(jié),編碼結(jié)果的第1個字節(jié)為0xb7+string的長度值(字節(jié)表示)的長度,后跟著string的長度,后跟著string滞谢。
比如string長度為1024(0x0400),0x0400的長度為2,因此第1個字節(jié)為0xb9,后面跟著0x0400,再后面跟著string。第1個字節(jié)的范圍是[0xb8,0xbf],因此string長度值最大是8,
string的長度最大是2**64-1,這是一個非常大的數(shù)字。
(4)如果一個數(shù)組中所有元素的長度之和在0-55之間,編碼結(jié)果的第1個字節(jié)為0xc0+所有元素的長度,后面跟著list中元素的編碼串,因此第1個字節(jié)的范圍在[0xc0,0xf7]偏瓤。
(5)如果數(shù)組中所有元素的長度超過55個字節(jié),編碼結(jié)果的第1個字節(jié)為0xf8+所有元素長度值(字節(jié)表示)的長度,后跟所有元素長度,后面跟著數(shù)組。第1個字節(jié)的范圍是[0xf8,0xff]椰憋。
一般要想學(xué)明白一個東西就是打開命令行或者IDE厅克,把他跑起來run一下。
#!/usr/bin/env python
# encoding=utf-8
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))