Base58Check 前綴字元預測如何工作?
我正在嘗試將 Base58Check 實現為一項學習練習,並且遇到了此處總結的不同類型的前綴。
然而,我想知道如何從前綴字節中獲得預期的前綴字元。為什麼相同的字節會導致不同的字元,以及這些字元是如何產生的。
我最初的假設是第一個字元是前綴字節的 Base58 編碼,但這似乎是錯誤的,地址字節 0x00 映射到“1”,因為它是前導零,但是 P2SH 的第二個範例與 0x05 應該映射到 char “ 6”,但它映射到“3”。即使前綴相同,0x80 的 WIF 前綴也可以映射到“5”(未壓縮)、“K”或“L”(壓縮)。
同樣在我的測試中,映射似乎僅在我在數組末尾添加 4 字節校驗和後才起作用。如果我在沒有校驗和的情況下對數組進行編碼,則結果具有不同的前綴字元。
那麼,Base58Check 的預期前綴字元是如何從前綴中導出的呢?
這不是 Base58 編碼所獨有的(也不是 Check 部分)。這是關於基本轉換:
十六進制的數字 13 是
0x0d
,十六進制的數字 18 是0x12
。即使十進制都以 1 開頭,但它們在十六進制中的第一個數字是不同的。事實上,在比特幣的地址格式中,與上面的範例不同,這將是比較d
而1
不是0
與,1
因為編碼的比特幣地址具有不同的長度。常見的是決定有效數字是有效數字的最大因素。這就是為什麼如果你想計算 Base58check 的幾個第一個字元而不是在最後添加 4 個字節校驗和,你可以添加 4 個空字節並且結果的第一個字元是相同的。大多數時候,(除非一個基數是另一個基數的冪,例如base-2和base-16。還要注意比特幣中地址前面的1是特殊處理的)輸入的長度應該相同才能計算相同的前幾個字元。
那麼,Base58Check 的預期前綴字元是如何從前綴中導出的呢?
我們還需要一個恆定長度的輸入(包括 4 個字節的 Base58check)。我假設我們有輸入的前幾個字節。我們用零填充其餘部分,然後 Base58 對其進行編碼。我們用 1s(如果字節為 255s)和 Base58 編碼填充其餘部分。
然後我們打開 Bae58 字母表:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
假設我們將 1FGMQ… 計算為較低範圍,將 1FJwz… 計算為較高範圍。只要輸入的長度相同,無論您在其餘字節中填寫什麼,編碼地址都將介於這兩者之間。