Bech32-Address

如何從 P2WPKH 輸出腳本導出 Bech32 地址?

  • August 10, 2021

我正在建構一個小腳本,將原始 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 is bc+ 分隔符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

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