Spending
如何測試交易是否可以花費現有的輸出?
假設我正在手動編寫一筆交易,該交易花費了我自己從另一個地址發送的現有 uspent 輸出。有沒有辦法在廣播之前測試交易是否真的可以花費該輸出?原因是,我想確定我是否正確生成了 sigScript。
編輯:我知道可以在語法上驗證交易,但我問是否存在諸如
canSpend(myTransaction, unspentOutput)
. 理想情況下,這將執行腳本myTransaction.sigScript和unspentOutput.ScriptPubKey的組合併檢查結果是否為真。
如果你從 master 建構比特幣核心,你可以使用新的
testmempoolaccept
rpc 方法來檢查你的 tx 是否會進入記憶體池。這將包括檢查簽名,並確保您的輸入實際上是未使用的。它不會將 tx 廣播添加到記憶體池中,而只是檢查它是否會被接受。
這個Python 庫有一個
verify()
方法可以執行腳本並執行一些簡單的檢查。from btctools import Transaction >>> tx = Transaction.from_hex('0100000000010153159b2a077d8dfbe4dca4b6b3a9e0ccedb4962ca73280526e6a1eeb1e8e9adc2a00000000ffffffff04a08f3e00000000001976a914de755835002260891962f1e671a2bf7605788d0f88ac0046c3230000000017a914c7c9b5f51244f39f81ec01146eb0d1d98d4bbd4c872052a6000000000017a91469f376599f0ffcaacd6a79854b1ee99513bb7b35870006f21600000000220020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d04004830450221009360af3ec3f9d4ae8acc3ab2213f3f9344cb322b4ea447490bb297a9a4c1d207022067027b032e54b3efb9e885604349ec4f1b6446eed8ed208c6fe6eeae9ace921a0148304502210097cf932eb37513c201b577472d70f1553f338d6439e9181607ec75f2e83fa148022052368c88085838521efc64cf509b95dd53d8c825089acd3ff681e74d3a2b4959016952210266edd4ef2953675faf0662c088a7f620935807d200d65387290b31648e51e253210372ce38027ee95c98cdc54172964fa3aecf9f24b85c139d3d203365d6b691d0502103c96d495bfdd5ba4145e3e046fee45e84a8a48ad05bd8dbb395c011a32cf9f88053ae00000000') >>> tx Transaction(inputs=1, outputs=4) >>> tx.verify() True >>> tx.outputs[0].json() {'scriptPubKey': {'address': '3KuQ2pyr5LHwiU1a2Rwrn9kGGMpUmHxLdm', 'asm': 'OP_HASH160 c7c9b5f51244f39f81ec01146eb0d1d98d4bbd4c OP_EQUAL', 'hex': 'a914c7c9b5f51244f39f81ec01146eb0d1d98d4bbd4c87', 'type': 'P2SH'}, 'value': 6.0} >>> tx.outputs[0].value += 1 >>> tx.verify() False