Pyethereum

RLP 編碼為 0

  • October 22, 2018

根據這裡的文件,

對於其值在

$$ 0x00, 0x7f $$範圍,該字節是它自己的 RLP 編碼

我使用 pyrlp 執行了以下命令(類似於 pyethereum here中的程式碼):

res = rlp.encode([1, 0])
print ':'.join(x.encode('hex') for x in res)

並得到c2:01:80. c2指的是列表標識符(以下c02 個元素的 + 2 個字節)。01顯然是數組 (1) 中的第一個元素,編碼為自身。然而,0 被編碼為十六進制 80,根據我對文件的理解,不應該是這種情況。

我確實在 RLP wiki 上的範例中註意到空字元串編碼為十六進制 80,那麼這是否以某種方式影響了這一點?

似乎對整數進行編碼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 編碼的無類型意味著這不應該是一個問題。相反,您可以使用\x80sedes 對象來指定類型:

>>> decode('\x80')
''
>>> decode('\x80', big_endian_int)
0

引用自:https://ethereum.stackexchange.com/questions/7411