区块链 什么是RLP编码
  DJsdk34H4Gbu 2023年11月02日 114 0


RLP(Recursive Length Prefix):

递归长度前缀编码,是一种用长度作为前缀标明编码对象中元素个数的编码方法。

它是以太坊序列化所采用的编码方式,RLP主要用于以太坊中数据的网络传输和持久化存储。


JSON编码

type Student struct{
Name string `json:"name"`
Sex string `json:"sex"`
}
s := Student{Name:"icattlecoder",Sex:"male"}
bs,_ := json.Marsal(&s)
print(string(bs))
// {"name":"icattlecoder","sex":"male"}

变量​​s​​​序列化的结果是​​{"name":"icattlecoder","sex":"male"}​​​,字符串长度35,实际有效数据是​​icattlecoder​​​ 和​​male​​,共计16个字节,我们可以看到JSON的序列化时引入了太多的冗余信息


RLP编码

type Student struct{
Name string
Sex string
}
s := Student{Name:"icattlecoder",Sex:"male"}
buff := bytes.Buffer{}
rpl.Encode(&buff, &s)
print(buff.Bytes())
// [210 140 105 99 97 116 116 108 101 99 111 100 101 114 132 109 97 108 101]


如下图所示,RLP编码的开头即是此编码中的对象个数(Object num)。

在个数后,是相应个数的对象(Object)。


递归地,每个对象,也是RLP编码,其格式也与下图相同。


需要特别注意的是,在RLP编码中。每个Object的字节大小是不固定的,Object num只表示Object的个数,不表示Object的字节长度。


区块链 什么是RLP编码_序列化


RLP通过一种长度前缀与递归结合的方式,理论上可编码任意个数的对象。

下图是一个区块的RLP编码,在对区块进行编码时,先递归至最底层,对多个sealer进行编码,多个sealer被编码并加上长度前缀后,编码成为一串RLP编码(sealerList),此编码又作为一个对象,被编入上层的一串RLP编码(blockHeader)中。此后层层递归,最后编码成为区块的RLP编码。

由于RLP编码是递归的,在编码前,无法获知编码后的长度。


区块链 什么是RLP编码_序列化_02




RLP编码定义与规则



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
DJsdk34H4Gbu