沒有 SegWit P2SH 字節結構
我正在golang開發一個比特幣區塊瀏覽器,我想在其中收集盡可能多的關於交易的資訊。
我能夠從每種類型的輸出中提取地址,並且主要是從每種類型的輸入中提取地址,但我正在努力尋找清晰的
P2SH
文件。BIP16對非 SegWit
P2SH
字節結構沒有多說。我閱讀了許多範例,其中OP_0
第一個字節是第一個字節,而不是P2WPKH in P2SH
第P2WSH in P2SH
一個欄位是scriptSig的總長度,後跟0x0
/OP_0
。據我了解,非 SegWit
P2PH
地址是通過對兌換腳本進行散列獲得的,但我需要一些東西來錨定,例如第一個字節是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 scriptPubKey和scriptSig,其中
<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>
.例子:
- 內部帶有 P2MS 的 P2SH:https ://learnmeabitcoin.com/explorer/transaction/d3adb18d5e118bb856fbea4b1af936602454b44a98fc6c823aedc858b491fc13/output/0#scriptPubKey
- 內部帶有非標準腳本的 P2SH:https ://learnmeabitcoin.com/explorer/transaction/7d46745463a28049cb93d2c964320912d9c296c1038cb24cc3716255c397a87f/output/1#scriptPubKey
連結:
- <https://learnmeabitcoin.com/guide/p2sh>
- <https://learnmeabitcoin.com/guide/p2ms>
- <https://learnmeabitcoin.com/guide/address>