首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表的RLP解码

列表的RLP解码
EN

Ethereum用户
提问于 2019-07-10 04:38:43
回答 1查看 1.1K关注 0票数 1

在许多标准文档和博客中,我找到了包含两个字符串的列表示例,如下所示

“猫”,“狗” -> C8 83 636174 83 646F67

1)检索第一个字节: 0xc8 )查找第一个字节所在的最接近的字节范围;在本例中,第一个字节位于0xc0 .0xf7范围内,因此数据是一个列表。3)创建一个空列表[]以累积列表的长度,0xc8 -0xc0 =8.5)在c8之后开始解密,从列表中获取编码的数据直到列表结束。C8 83 63 61 74 83 64 6F 67

我们知道我们有一个列表它有八个元素,现在让我们看看列表中的内容。

6)计算出长度,即:第一个字节范围,0x83-0x80=3 7)数据类型是字符串,它的长度是3)分析和解码接下来的3字节0x63,0x61,0x74 9)重复步骤6到8,直到下一组字节列表的末尾,产生0x83,0x64,0x6f,0x67。

10)计算长度并解释数据,在这种情况下,数据为0x64,0x6f,0x67。

根据RLP文档,每件事看起来都很好,但是

我在想,如果这个例子如下所示,我们将如何解码?

131号,“狗”,“猫”

( 1)它是一个列表,因此启动0xc0 2) 131 0x80+3,0x63,0x61,0x74 0x83,3)狗到字节字符串→→4)猫到字节字符串→0x80+3,0x64,0x6F,0x67

最终编码→[0xc7,0x83,0x83,0x63,0x61,0x74,0x83,0x64,0x6F,0x67]

现在在解码→0xc7时, - 表示它是一个列表→列表长度是7(0xc7-0xc0),现在应该假定它是0x83,它可以指示它是一个长度为3的字节字符串,还是一个十六进制值为0x83→的数字131

EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-07-10 20:39:14

131不能被编码为0x83。来自https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP

对于值在0x00,0x7f范围内的单个字节,该字节是它自己的RLP编码。

0x83超出了这个范围,所以不能使用这种“自编码”。

否则,如果字符串长度为0-55字节,则RLP编码由一个值为0x80的字节加上字符串的长度与字符串后面的字符串组成。因此,第一个字节的范围是0x80,0xb7。

因此,我们需要将代码编码为0x81 (字符串由1字节组成)和0x83 (即1字节)。

所以正确的RLP编码是:

代码语言:javascript
复制
0xca818383646f6783636174

注意8183,这是项131的编码方式。

编辑

在最初的问题中,“狗”和“猫”在列表中被反向编码,或者部分输出被反转。上面我使用了[131, "dog", "cat"],但现在我认为它可能是相反的。:-)

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/72759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档