以太坊之rlp

一般理解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)单字节值在[0x00,0x7f]之间的,编码就是自身即0-127
(2)如果一个string长度在0-55之间,编码结果的第1个字节为0x80+string的长度,后面跟着string。因此第1个字节范围在[0x80,0xb7]。
(3)如果一个string长度超过了55个字节,编码结果的第1个字节为0xb7+string的长度值(字节表示)的长度,后跟着string的长度,后跟着string。
比如string长度为1024(0x0400),0x0400的长度为2,因此第1个字节为0xb9,后面跟着0x0400,再后面跟着string。第1个字节的范围是[0xb8,0xbf],因此string长度值最大是8,
string的长度最大是2**64-1,这是一个非常大的数字。
(4)如果一个数组中所有元素的长度之和在0-55之间,编码结果的第1个字节为0xc0+所有元素的长度,后面跟着list中元素的编码串,因此第1个字节的范围在[0xc0,0xf7]。
(5)如果数组中所有元素的长度超过55个字节,编码结果的第1个字节为0xf8+所有元素长度值(字节表示)的长度,后跟所有元素长度,后面跟着数组。第1个字节的范围是[0xf8,0xff]。

一般要想学明白一个东西就是打开命令行或者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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,880评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,675评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,002评论 18 399
  • 从上次在西南边疆的匆匆一别,到今日,陆子岳坐在我面前,静静的笑,已经十载有余。 和子岳是挚友兼老友,因为,我们曾经...
    董墨冉阅读 3,921评论 1 3
  • 风儿呼啸着席卷山林 掠走了山神满窖的好酒 然后 花儿醉了,鸟儿醉了 鱼儿醉了,青草醉了 连看山的老人也醉了 醉了,...
    四月星子阅读 3,122评论 0 3