多重簽名腳本散列(p2sh):遺留和隔離見證之間的區別
前段時間我注意到,給定相同的輸入,
addmultisigaddress
比特createmultisig
幣核心的方法會生成不同的 p2sh(地址)。我四處打聽,一位來自比特幣開發者列表的使用者告訴我,這是因為:
“addmultisigaddress 使用錢包的預設地址類型,即 p2sh-segwit,createmultisig 使用預設地址類型 legacy”
這種行為的一個例子是:
bitcoin-cli addmultisigaddress 1 '["045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d","02ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831","0224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e07"]' { "address": "36ULucjWUTrDvaJzCyhFoVbDoNS6Zum2Du", "redeemScript": "5141045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d2102ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831210224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e0753ae" } bitcoin-cli createmultisig 1 '["045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d","02ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831","0224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e07"]' { "address": "3GiimyxF1R5VixfBFAbQZbuy9EesD2r6n1", "redeemScript": "5141045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d2102ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831210224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e0753ae" }
關鍵是,後來,我注意到使用某些公鑰,這兩種方法會生成相同的雜湊:
bitcoin-cli addmultisigaddress 1 '["03fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d7617631146","02ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd101","04633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac204"]' { "address": "32AVnYUUSvm4bGgEXoQ2zuFAJBPH4P31Gi", "redeemScript": "512103fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d76176311462102ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd1014104633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac20453ae" } bitcoin-cli createmultisig 1 '["03fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d7617631146","02ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd101","04633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac204"]' { "address": "32AVnYUUSvm4bGgEXoQ2zuFAJBPH4P31Gi", "redeemScript": "512103fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d76176311462102ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd1014104633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac20453ae" }
如果輸入和兌換腳本相同,我不明白這怎麼可能。
這兩種情況之間以及傳統的多重簽名交易和隔離見證之間有什麼區別?
從區塊鏈讀取原始交易數據,如何知道腳本是否需要使用 legacy 或 segwit 進行散列?
我相信您看到的行為實際上是一個錯誤。
預設情況下,
addmultisigaddress
使用 p2sh-segwit,這是錢包的預設地址類型。預設情況下createmultisig
使用舊版。這是兩種不同的地址類型,通常,您會得到兩個不同的地址。然而,segwit 不允許未壓縮的公鑰。因此,在創建兌換腳本時,如果檢測到未壓縮的公鑰,兩個 RPC 都將返回舊地址。這就是您在第二個範例中看到相同地址的原因。
但我相信有一個錯誤。您的第一個範例也應該提供相同的舊地址,但事實並非如此。我認為這是因為未壓縮的 pubkey 不是錢包的一部分,因此它沒有正確檢測到它是未壓縮的 pubkey。因此
addmultisigaddress
,遵循其預設設置為您提供 p2sh-segwit 地址,並createmultisig
遵循其預設設置為您提供舊地址。從區塊鏈讀取原始交易數據,如何知道腳本是否需要使用 legacy 或 segwit 進行散列?
對於 p2sh-segwit,redeemScript 實際上並不是您從 RPC 獲得的redeemScript。相反,它是 P2WSH 輸出的腳本。“redeemScript”實際上是 P2WSH 腳本的見證腳本,即實際的redeemScript。腳本類型(在 scriptPubKey 或redeemScript 中)確定該輸出是否為segwit。