為什麼 bech32 定義了一種新的 base32 編碼方案而不是使用現有的?
有多種現有的base32編碼(RFC 3548 /4648、z-base-32、Crockford 等)。為什麼 bech32 定義一個新的而不是使用現有的?
bech32 的設計有多個方面。有字元集的選擇(即,哪些字元包含在 32 個選項中,哪些字元被排除,因為它們在視覺上看起來像其他字元,例如 1,因為它看起來像 l),特定位到該字元集的映射,類型要使用的校驗和和最終地址結構。
BIP 173解釋了字元集的選擇。
根據該視覺相似性數據選擇字元集以最小化歧義,並選擇排序以最小化差異超過 1 位的相似字元對(根據相同數據)的數量。由於選擇校驗和是為了最大限度地提高對少量誤碼的檢測能力,因此這種選擇可以提高其在某些錯誤模型下的性能。
位到 bech32 字元的映射也包含在BIP中。
例如 11 個映射到 t(x 軸上 3 個,y 軸上 +8 個)和 30 個映射到 7 個(x 軸上 6 個和 y 軸上 +24 個)
請注意,雖然 1 作為分隔符包含在 bech32 地址中(請參閱此處),但字元 1 不包含在 bech32 的允許字元集中。此映射中沒有任何內容映射到 1。
Pieter Wuille在 2017 年 3 月的 SF Bitcoin Devs 上解釋了這一位到字元映射的基本原理:
這樣做的原因是我們能夠選擇我們的程式碼來優化低誤碼率。如果我們可以選擇字元集以使 1 位錯誤比非 1 位錯誤更有可能發生,那不是很好。這個字元集是另一年 CPU 時間為此優化的結果。我們在表格上找到了一堆關於各種字元之間相似性的資訊。您可以在這張幻燈片上看到,z 和 2 在某些字型或書寫中被認為是相似的。如您所見,它們相距8。一個是 2,另一個是 10,所以它們相差 1 位。r 和 t 相差 1 位。y 和 v 相差 1 位。x 和 k 相差 1 位。e 和 a 相差 1 位。s 和 5 相差 1 位。4 和 h 相差 1 位。您可以在此數據中查找更多類似的錯誤。它太酷了。我們製作了一個針對 1 位錯誤進行優化的字元集。因此,我們的程式碼對於 1 位錯誤是距離 6。如果您只查看這些 1 位錯誤,我們保證 5 個錯誤。如果你只犯這樣的錯誤,你可以檢測到 5。