如何從 P2WPKH 輸出腳本導出 Bech32 地址?
我正在建構一個小腳本,將原始 coinbase 交易數據解碼為人類可讀的查看器,無需外部腳本,以更好地理解該主題。
我注意到事務中有許多不同類型的輸出腳本類型。(P2SH、P2PK(見於創世區塊)、P2PKH 等)
我無法掌握的一件事是如何在新的 SegWit P2WPK 和 P2WSH 類型中獲取 Base58 地址。
例如,Block #542748有這個coinbase 交易,我的腳本確定它需要付費見證公鑰 (P2WPK) 輸出,
97cfc76442fe717f2a3f0cc9c175f7561b661997
並將其作為公鑰散列。完整的輸出腳本:
0[] PUSHDATA(20)[97cfc76442fe717f2a3f0cc9c175f7561b661997]
傳統上,在 P2PK、P2PKH 和 P2SH 中,我使用了這個執行緒上的圖像,效果很好。
當我通過以下操作應用與 pubkeyhash (P2PKH) 相同的方法時,我得到一個完全不同的地址:
附加版本字節:
0097CFC76442FE717F2A3F0CC9C175F7561B661997
SHA-256 第 1 輪:
f756795a3b878d16bfa9e426a47d857830bb08a02e691f0487cbeac51b510f40
第 1 輪的 SHA-256 摘要:
ea7fe8c3b7680b79ff507c7d1b40bfc29ca8269bb1033cc84010506743cce404
附加校驗和 4 個字節:
0097CFC76442FE717F2A3F0CC9C175F7561B661997ea7fe8c3
Base58 編碼:
1EqhwhM5t5NxedLoSuJ6BtBvUMLhanBLxa
bc1qjl8uwezzlech723lpnyuza0h2cdkvxvh54v3dn
這與 blockchain.info 網站上列出的完全不同獲得他們列出的相同地址的最佳方法是什麼(從 bc1 開始)?
好的,所以我想我已經為其他想知道你必須做什麼才能從這種類型派生地址的人弄清楚了。
對於已經提到的交易(區塊 542748 的 coinbase),我們首先查看完整的解碼輸出腳本。
0 PUSHDATA(20) 97cfc76442fe717f2a3f0cc9c175f7561b661997
OP_0
解碼腳本中的第一個是witness version
- 然後我們獲取推送的數據(在我們的例子中
97cfc76442fe717f2a3f0cc9c175f7561b661997
)並將其轉換為二進制- 然後我們將二進製文件分成 5 位部分。在我們的例子中:
10010 11111 00111 11100 01110 11001 00010 00010 11111 11001 11000 10111 11110 01010 10001 11111 00001 10011 00100 11100 00010 11101 01111 10111 01010 11000 01101 10110 01100 00110 01100 10111
witness version
然後我們在 5 位中添加前綴00000
- 然後我們的二進制變成
00000 10010 11111 00111 11100 01110 11001 00010 00010 11111 11001 11000 10111 11110 01010 10001 11111 00001 10011 00100 11100 00010 11101 01111 10111 01010 11000 01101 10110 01100 00110 01100 10111
- 地址的第一部分被視為該
human readable
部分。這始終bc
在主網上和tb
測試網上1
始終是human readable
部分和其餘部分之間的分隔符或data
- 現在我們的地址以
bc1
(mainnet isbc
+ 分隔符1
)開頭- 現在我們將每 5 位映射到這裡的表中- 或者我創建的這個替代圖表
bc1
qjl8uwezzlech723lpnyuza0h2cdkvxvh
- 剩下的 6 個字元是校驗和
- 使用此處提供的 python 程式碼,我們可以使用
bech32_create_checksum
函式計算校驗和- 第一個參數是
human readable
不帶分隔符的字元串部分 (1)data
第二個參數是從我們的二進制部分轉換而來的整數數組我們的例子:
bech32_create_checksum("bc", [0, 18, 31, 7, 28, 14, 25, 2, 2, 31, 25, 24, 23, 30, 10, 17, 31, 1, 19, 4, 28, 2, 29, 15, 23, 10, 24, 13, 22, 12, 6, 12, 23] )
這給了我們:
[20, 21, 12, 17, 13, 19]
可以用我們的表映射到
54v3dn
最後,我們將
human readable
,seperator
,decoded data
和連接起來checksum
作為我們的最終地址:bc1qjl8uwezzlech723lpnyuza0h2cdkvxvh54v3dn