Development

沒有 SegWit P2SH 字節結構

  • January 18, 2021

我正在golang開發一個比特幣區塊瀏覽器,我想在其中收集盡可能多的關於交易的資訊。

我能夠從每種類型的輸出中提取地址,並且主要是從每種類型的輸入中提取地址,但我正在努力尋找清晰的P2SH文件。

BIP16對非 SegWitP2SH字節結構沒有多說。我閱讀了許多範例,其中OP_0第一個字節是第一個字節,而不是P2WPKH in P2SHP2WSH in P2SH一個欄位是scriptSig的總長度,後跟0x0/ OP_0

據我了解,非 SegWitP2PH地址是通過對兌換腳本進行散列獲得的,但我需要一些東西來錨定,例如第一個字節是OP_0,然後是數據的大小(可能是簽名),循環直到找到,OP_TRUE然後是OP_PUSHDATA1

但這是獨特的標準格式嗎?

輸出上的 P2SH 鎖定腳本具有以下結構:

        Output (scriptPubKey)
--------------------------------
OP_HASH160 <scripthash> OP_EQUAL

這個地址來自於<scripthash>,創建一個“3address”。這是 P2SH 的標準格式,因此您可以辨識它並從那裡計算出地址。

這就是獲取地址所需的全部內容,但請進一步解釋……


有趣的是,<scripthash>可以是任何你喜歡的腳本的雜湊值。但是,它最常用於將 P2MS 的散列放在那裡。所以當你來解鎖這個腳本時,它scriptSig可能看起來像這樣:

         Input (scriptSig)
-------------------------------------------
OP_0 <signature> <signature> <redeemscript>

您在這裡看到的基本上是一個完整的腳本,它本來是經典的 P2MS scriptPubKeyscriptSig,其中<redeemscript>是帶有操作碼的普通腳本的數據推送。

         Input (scriptSig)
-------------------------------------------
             scriptSig       scriptPubKey (as a data push)
---------------------------- -------------- 
OP_0 <signature> <signature> <redeemscript>

使用 P2SH 就像您在 scriptSig 中包含一個完整的 scriptSig+scriptPubKey,並且它可以包含任何腳本,因此它沒有標準形式

無論如何,這個完整的 P2MS 腳本以 . 開頭OP_O,因為所有 P2MS scriptSigs 都必須以它開頭,因為OP_CHECKMULTISIG操作碼存在一個錯誤。這與OP_0您在 Segwit scriptPubKeys 中獲得的內容無關。

當此腳本執行時,<redeemscript>將首先對 進行雜湊處理並與<scripthash>輸出中的 進行比較以確保其匹配。如果是,<redeemscript>則反序列化以查看操作碼:

     Input (scriptSig)
-------------------------------------------
             scriptSig       scriptPubKey
---------------------------- -------------- 
OP_0 <signature> <signature> OP_2 <pubkey> <pubkey> <pubkey> OP_3 OP_CHECKMULTISIG

這就是您在經典 P2MS 輸出中看到的內容,但這恰好被包裝在 P2SH 腳本中,因為它對發送者來說更便宜。所以這是 P2MS 的標準格式:( OP_N <pubkeys...> OP_M OP_CHECKMULTISIG)。

這個特定的 scriptPubKey 實際上沒有地址。那裡<pubkeys>有,但說那些有“地址”在技術上是不正確<pubkeys>的,因為地址指的是特定的鎖定腳本模式,而不僅僅是任何<pubkey>.

例子:

連結:

  • <https://learnmeabitcoin.com/guide/p2sh>
  • <https://learnmeabitcoin.com/guide/p2ms>
  • <https://learnmeabitcoin.com/guide/address>

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