Spending

如何測試交易是否可以花費現有的輸出?

  • September 4, 2018

假設我正在手動編寫一筆交易,該交易花費了我自己從另一個地址發送的現有 uspent 輸出。有沒有辦法在廣播之前測試交易是否真的可以花費該輸出?原因是,我想確定我是否正確生成了 sigScript。

編輯:我知道可以在語法上驗證交易,但我問是否存在諸如canSpend(myTransaction, unspentOutput). 理想情況下,這將執行腳本myTransaction.sigScriptunspentOutput.ScriptPubKey的組合併檢查結果是否為真。

如果你從 master 建構比特幣核心,你可以使用新的testmempoolacceptrpc 方法來檢查你的 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

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