我试图从RLP白皮书wiki中理解这意味着什么:“RLP的唯一目的是对结构进行编码;对特定的数据类型(例如字符串、浮点数)进行编码是留给高阶协议的;”
参考资料:https://github.com/ethereum/wiki/wiki/RLP
根据我的理解,RLP只是对结构进行编码,而不处理数据,而数据类型的解释则由自定义函数处理。有人能给我举个例子,说明这个输入是使用RLP编码的如下结构:
e:g:[“猫”,[],“猪”,“”,“羊”]
谢谢事先,如果有任何视频参考,仅为RLP将是非常有帮助的。
发布于 2018-03-08 14:24:36
从文档中摘取,您有以下公理:
如果字符串长度为0-55字节,则RLP编码由一个值为0x80的字节加上字符串的长度与字符串后面的字符串组成。因此,第一个字节的范围是0x80,0xb7。
和
如果列表的总有效载荷(即所有被RLP编码的项的合并长度)为0-55字节,则RLP编码由一个值为0xc0的字节加上列表的长度,然后连接这些项的RLP编码。因此,第一个字节的范围是0xc0,0xf7。
因此,[“猫”、[[]]、“猪”、““””、“羊”)的编码逻辑如下:
您会选择像0x83, 'c', 'a', 't'一样的cat "cat“是一个字符串,因此从0x80开始并添加字符串(3)的长度,这样它就给出了0x83,然后是字符串的字符。
[[]]是0xc1, 0xc0 --这个数组包含一个空数组。
因为0xc1是数组的长度(数组包含一个元素,此处[] ),而0xc0是第二个数组的长度(空元素)
“猪”和“猫”一样,一个由三个字符组成的字符串:0x83, 'p', 'i', 'g'。
“”是一个由一个元素组成的数组,它是一个空字符串(0字符),因此它将编码为0xc1, 0x80 (0xc0 +1,0x80 + 0)
“绵羊”是一个5个字符的字符串,因此它将编码为:0x85, 's', 'h', 'e', 'e', 'p' (0x80 + 5,以及该字符串的每个字母)。
整个数组包含18个字节的值,因此它将编码为:
[ 0xd2, 0x83, 'c', 'a', 't', 0xc1, 0xc0, 0x83, 'p', 'i', 'g', 0xc1, 0x80, 0x85, 's', 'h', 'e', 'e', 'p'] (0xd2为0xc0 + 0x12,0x12为十进制中的18 )
为了清晰起见,没有用十六进制编码字符,但真正的编码如下所示:
[0xd2, 0x83, 0x63, 0x61, 0x74, 0xc1, 0xc0, 0x83, 0x70, 0x69, 0x67, 0xc1, 0x80, 0x85, 0x73, 0x68, 0x65, 0x65, 0x70]
https://ethereum.stackexchange.com/questions/42125
复制相似问题