Address

校驗和 P2WSH 失敗

  • April 7, 2020

我的目標是複制與https://en.bitcoin.it/wiki/BIP_0173相同的 P2WSH

tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7

我能夠在校驗和之前生成“第一”部分。有我的二進制

00000 00011 00001 10001 10001 01000 01111 00000 10100 11000 10100 01011 00110 10000 00001 00101 11101 00011 00100 10000 00011 00110 10101 10110 11010 00010 01101 10110 01001 10000 10101 10011 11000 11001 10101 00110 10010 01111 01000 01101 11000 11000 11000 11001 01001 01100 00001 00100 10000 00110 01001 10001

以及它們在 base10 中的值

0, 3, 1, 17, 17, 8, 15, 0, 20, 24, 20, 11, 6, 16, 1, 5, 29, 3, 4, 16, 3, 6, 21, 22, 26, 2, 13, 22, 9, 16, 21, 19, 24, 25, 21, 6, 18, 15, 8, 13, 24, 24, 24, 25, 9, 12, 1, 4, 16, 6, 9, 17

之後我使用 Python 函式

python -c "import bech32; print bech32.bech32_create_checksum('tb', [0, 3, 1, 17, 17, 8, 15, 0, 20, 24, 20, 11, 6, 16, 1, 5, 29, 3, 4, 16, 3, 6, 21, 22, 26, 2, 13, 22, 9, 16, 21, 19, 24, 25, 21, 6, 18, 15, 8, 13, 24, 24, 24, 25, 9, 12, 1, 4, 16, 6, 9, 17] )"

我得到了這個結果:

[3, 1, 3, 10, 2, 25]

之後我可以映射到字元集(“qpzry9x8gf2tvdw0s3jn54khce6mua7l”)

最終結果是:我的地址是:

tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3rpr2ze

<https://en.bitcoin.it/wiki/BIP_0173>的地址

tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7

如您所見,問題只是校驗和,第一部分tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3是相同的。

好的,我找到了問題所在。

輸入有 52 個 5 位組。260 位。請記住,每個編碼都呼叫 convertBits 將 8 位組轉換為 5 位組。但是由字節組成的 260 位是不可能的!所以最初有 264 位,= 33 字節。264 位需要由 convertBits 填充(convertBits 可以/將在編碼時填充,但在解碼時不會)。所以我們有 265 位。53 個 5 位組。因此,您需要在輸入的末尾添加一個零以達到預期的結果。

解碼時,convertBits 會,直到位數為 8 的倍數,檢查最後一位是否為 0,將其丟棄。在您的情況下,最後一位不為零,因此不丟棄它的唯一方法是填充它,在解碼時不允許這樣做。

TLDR作為輸入的所有 5 位組都是從 8 位組轉換而來的(地址設計用於散列輸出,散列輸出完整字節)。如果解碼無法在沒有填充的情況下解碼為 8 位組,則認為該地址無效。


讓我們嘗試做 convertBits 解碼的工作!

首先,為了簡化忽略輸入中 40 位的前幾個倍數。剩下的最後幾位是:

10000 00110 01001 10001

Convertbits,解碼時從 5 轉換為 8:

10000001 10010011 0001

最後一組是否正好有 8 位?(在這種情況下,不需要進一步的操作)不。最後一組是否只有零?(在這種情況下,我們可以只刪除最後一組)不。拋出一個錯誤。我們要麼需要丟棄比特,要麼需要填充,這在解碼時是不允許的。

這就是您生成的地址無法解碼的原因。(試試看

引用自:https://bitcoin.stackexchange.com/questions/95146