Rlp

列表的 RLP 解碼

  • July 15, 2019

在許多標准文件和許多部落格中,我找到了帶有兩個字元串的列表範例,如下所示

$$ “cat”, “dog” $$-> C8 83 636174 83 646F67 這就是它的解碼方式 1)檢索第一個字節:0xc8 2)找到第一個字節所在的最接近的字節範圍;在這種情況下,第一個字節落在範圍內

$$ 0xc0 .. 0xf7 $$因此數據是一個列表。3)創建一個空列表$$ $$累積 4) 列表的長度,$$ 0xc8 -0xc0 $$= 8 5) 在 c8 之後開始解密以從 List 中獲取編碼數據,直到 List 結束。C8 83 63 61 74 83 64 6F 67 我們知道我們有一個清單

$$ and it has eight elements $$,現在讓我們看看 List 裡面有什麼。 6) 計算長度為:第一個字節範圍,0x83–0x80 = 3 7) 數據類型為 String,長度為 3 8) 解析並破譯接下來的 3 個字節 0x63, 0x61, 0x74 9) 重複步驟 6通過 8 直到列表末尾的下一組字節導致 0x83、0x64、0x6f、0x67

  1. 計算Length並解釋數據,本例中數據為0x64,0x6f,0x67。

根據 RLP 文件,每件事看起來都不錯但是

我想知道如果範例如下所示,我們將如何解碼

$$ 131, “dog”, “cat” $$

  1. 它是一個列表,所以從 0xc0 開始 2) 131 → 0x83 , 3) dog to byte string →

$$ 0x80+3, 0x63, 0x61, 0x74 $$ 4) cat 到字節串 →$$ 0x80+3, 0x64, 0x6F, 0x67 $$ 最終編碼 → [0xc7 , 0x83, 0x83 , 0x63, 0x61, 0x74, 0x83 , 0x64, 0x6F, 0x67]

現在在解碼過程中 → 0xc7 — 表示它是一個列表 → 列表長度為 7 (0xc7–0xc0) → 現在應該假設什麼 0x83 它可以表示它是一個長度為 3 的字節字元串,或者它是一個具有十六進制的數字 131值 0x83 →

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編碼是:

0xca818383646f6783636174

請注意8183,這是項目131的編碼方式。

編輯

在原始問題中,“dog”和“cat”在列表中被顛倒進行編碼,或者一些輸出被顛倒。上面我用過[131, "dog", "cat"],但現在我想它可能是相反的。:-)

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