根据docs 这里的说法
对于值在0x00,0x7f范围内的单个字节,该字节是它自己的RLP编码。
我使用pyrlp运行了以下代码(类似于pyethereum 这里中的代码):
res = rlp.encode([1, 0])
print ':'.join(x.encode('hex') for x in res)并得到了c2:01:80的结果。c2引用列表标识符(以下2个元素的c0+2个字节)。01显然是数组(1)中的第一个元素,编码为它自己。然而,0编码为十六进制80,根据我对文档的理解,情况不应该是这样的。
在RLP wiki的示例中,我确实注意到空字符串编码为十六进制80,那么这是否考虑到了这一点呢?
发布于 2016-07-26 14:49:26
似乎编码整数0不再等同于\x00 (正如文档所暗示的那样)。在您的示例中和在无法解码的事实中都可以看到这一点:
>>> decode('\x00')
'\x00'
>>> decode('\x00', big_endian_int)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/rlp/codec.py", line 214, in decode
....我认为RLP编码的无型性意味着这不应该是一个问题。相反,您可以使用\x80和赛德斯对象来指定类型:
>>> decode('\x80')
''
>>> decode('\x80', big_endian_int)
0发布于 2018-10-22 23:30:56
RLP在白花黄纸中定义(附录A,第16页)。
有几句有趣的名言:
我们通过两个子函数将RLP函数定义为
RLP,第一个子函数在值为字节数组时处理实例,第二个子函数是字节数组包含小于56个字节的进一步值序列时,输出等于以字节数组长度为前缀的输入,加上128个如果RLP用于编码标量(仅定义为正整数(P或Px的任何x)),则必须指定为最短字节数组,以便大端字节对其的解释相等。
最后一个例子告诉我们,前导零字节需要从标量值的大端表示中修剪。
标量0是一种特殊情况-- 0的大端解释是由零组成的,所以经过修整后,我们得到了空字节数组.空字节数组的长度小于56,因此它的长度被编码为0+128,在十六进制中是0x80。
正如您从文档中引用的那样,由带有值0x00的单个字节组成的字节数组应该被编码为0x00。但标量0只是另一种情况。
https://ethereum.stackexchange.com/questions/7411
复制相似问题