P2sh

非典型scriptSig的驗證

  • December 14, 2018

我希望能夠使用執行多重簽名的腳本以及額外的檢查來兌換 P2SH 輸出。因此scriptSig,要兌換此輸出必須提供足夠的簽名以及一些特定數據,然後將其與兌換腳本中的內容進行比較。據我了解,scriptSig這樣的一個不能使用 建構signrawtransaction,而是需要手動組合在一起。但是這樣就很容易出錯……還有沒有簡單的方法可以檢查這個自建的scriptSig的正確性?就像對驗證函式的 RPC 呼叫一樣,礦工在驗證交易時會呼叫嗎?

假設您能夠自己創建原始贖回交易,則可以將簽名交易傳遞給比特幣核心signrawtransaction(或signrawtransactionwithwallet在新版本中),以及描述被贖回的 utxo 的 json,以驗證正確性。

在這個例子中,我設置了一個 json 來兌換一個p2wsh具有非常簡單的單一操作碼的 scriptpubkey CHECKSIG,其中輸入的金額是一個 BTC。本例中輸入的 txid 只是FFFF...FFFF.

'[{"txid":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF","vout":0,"scriptPubKey":"0020EE6BB86B44339392BAE631C8F61DD8F009243C635ADAB33C0B20923A2794BF22","redeemScript":"AC","amount":1}]'

我已經建立了兌換這個 utxo 的原始交易,即:

02000000000101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FDFFFFFF01F0B9F505000000002321027777777777777777777777777777777777777777777777777777777777777777AC0347304402203333333333333333333333333333333333333333333333333333333333333333022055555555555555555555555555555555555555555555555555555555555555550121030EFF833692060EB20ABF63FDE930AD0F59BFDDF3FAD321AA5C85435120306FD101AC00000000

要檢查此支出的有效性,請將 utxo 和交易都傳遞給比特幣核心signrawtransactionwithwallet

$ printf '%s\n%s\n' 02000000000101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FDFFFFFF01F0B9F505000000002321027777777777777777777777777777777777777777777777777777777777777777AC0347304402203333333333333333333333333333333333333333333333333333333333333333022055555555555555555555555555555555555555555555555555555555555555550121030EFF833692060EB20ABF63FDE930AD0F59BFDDF3FAD321AA5C85435120306FD101AC00000000 '[{"txid":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF","vout":0,"scriptPubKey":"0020EE6BB86B44339392BAE631C8F61DD8F009243C635ADAB33C0B20923A2794BF22","redeemScript":"AC","amount":1}]' | bitcoin-cli -stdin signrawtransactionwithwallet

{
 "hex": "02000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000fdffffff01f0b9f505000000002321027777777777777777777777777777777777777777777777777777777777777777ac0347304402203333333333333333333333333333333333333333333333333333333333333333022055555555555555555555555555555555555555555555555555555555555555550121030eff833692060eb20abf63fde930ad0f59bfddf3fad321aa5c85435120306fd101ac00000000",
 "complete": true
}

要檢查腳本的正確性,只需替換 utxo 中的相關值並建構支出交易。

在驗證相對和絕對時間鎖等約束時,情況會更複雜一些。為了獲得額外的保證,您可以使用 Regtest 和 Testnet 來試用您的腳本,即使這樣,如果腳本非常奇特(可能使用未定義的 op_nop 程式碼或其他形式的非標準性),交易很容易在regtest\testnet 但同時幾乎不可能在主網上兌換。

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