生成 P2WSH 原生
我想創建像<https://en.bitcoin.it/wiki/BIP_0173>這樣的 P2WSH 原生。我已經有一個腳本來生成 P2WPKH 並且它可以工作,感謝 python 部分並重新安排組字節工作。
我讀到 witnessScript (scriptPubKey) 是沒有 RIPEMD160 的 SHA256 雜湊。下面是我的一些程式碼。
PB=0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 #REDEEM SCRIPT <Public Key> OP_CHECKSIG SCRIPT=210279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798AC #SCRIPT HASH $ printf $SCRIPT | xxd -r -p | openssl sha256| sed 's/^.* //' 1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262 Convert scripthash to base 2
11000 01100 01100 01010 00011 11000 00101 00110 00101 00010 11001 10100 00000 01001 01111 01000 11001 00100 00000 11001 10101 01101 10110 10000 10011 01101 10010 01100 00101 01100 11110 00110 01101 01001 10100 10011 11010 00011 01110 00110 00110 00110 01010 01011 00000 01001 00100 00001 10010 01100 010
我需要在開頭添加兩個零,以便將這些位重新排列成 5 個組
00110 00011 00011 00010 10000 11110 00001 01001 10001 01000 10110 01101 00000 00010 01011 11010 00110 01001 00000 00110 01101 01011 01101 10100 00100 11011 01100 10011 00001 01011 00111 10001 10011 01010 01101 00100 11110 10000 11011 10001 10001 10001 10010 10010 11000 00010 01001 00000 01100 10011 00010
添加見證程序
00000 00110 00011 00011 00010 10000 11110 00001 01001 10001 01000 10110 01101 00000 00010 01011 11010 00110 01001 00000 00110 01101 01011 01101 10100 00100 11011 01100 10011 00001 01011 00111 10001 10011 01010 01101 00100 11110 10000 11011 10001 10001 10001 10010 10010 11000 00010 01001 00000 01100 10011 00010
將每個位轉換為base10
0, 6, 3, 3, 2, 16, 30, 1, 9, 17, 8, 22, 13, 0, 2, 11, 26, 6, 9, 0, 6, 13, 11, 13, 20, 4, 27, 12, 19, 1, 11, 7, 17, 19, 10, 13, 4, 30, 16, 27, 17, 17, 17, 18, 18, 24, 2, 9, 0, 12, 19, 2
使用 python 程式碼創建校驗和
15 29 21 28 10 6
我的結果是:
tb1qxrrzs7pf3gkdqzt6xfqxdtd5ymvnpt83n2dy7sm333jjczfqvnz0a4u2x
但 BIP 0173 中的結果是
tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7
我使用相同的腳本來生成您可以在 BIP_173 中找到的 P2WPKH,並且它可以工作。當然我用公鑰雜湊改變公鑰,但是創建5位組和python部分的邏輯是一樣的。
另一個問題:我可以從 bitcoin-cli 創建這些地址(P2WPKH 和 P2SH 本機)嗎?
除了校驗和之外,Bech32 編碼是將 base-256(8 位)轉換為 base-32(5 位)的簡單問題。Base-256 是您從散列函式獲得的字節數組(八位字節字元串)。只關注雜湊的前 3 個字節:
as hex = 0x18 0x63 0x14 as bytes = 24 99 20 as binary = 00011000 01100011 00010100
為了將上述 base-256(8 位)輸入轉換為 base-32(5 位),我們從最高有效位開始,一次選擇 5 位,直到用完。
12345123 45123451 23451234 ... 00011000 01100011 00010100 (00011) (00001) (10001) (10001) (0100 ...
對於 bech-32*地址,***在完成基本轉換後,**這裡還有一個額外的步驟。該步驟是將“見證版本”作為已轉換為 base-32 的值附加到該組的開頭(因為見證版本定義為從 0 到 16 包括在內,它已經在範圍內)。
[00000] (00011) (00001) (10001) (10001) (0100 ...
最終結果可以轉換為0 到 31 之間 的數字數組
0, 3, 1, 17, 17
要將這個“數字”數組轉換為人類可讀的格式,我們從 bech32 字元集中列印相應的字元 (
qpzry9x8gf2tvdw0s3jn54khce6mua7l
)0->q, 3->r, 1->p, 17->3, 17->3 ...
PS 為了簡單起見,我跳過了一個校驗和計算,但它只是我們在最後一步結束時附加的另一組 5 位值。