Address
OP_EQUALVERIFY 問題
我正在製作一個全方位服務的錢包,我已經製作了 UTXO 選擇算法,現在我想推送交易十六進製字節。當我只推送一個只有 1 個輸入的交易時,它可以工作,但是如果我嘗試從我用同一個帳戶的 2 個輸入創建的 tx 推送十六進制,我會得到:
OP_EQUALVERIFY: non-equal data
這是我解碼的十六進制:
{ "lock_time":0, "size":339, "inputs":[ { "prev_out":{ "index":0, "hash":"3a896625fce1f18ce4c3139863359631d5677cff4e4fd8dac25ca6327c0dadd8" }, "script":"473044022070f3b03cca6a75038ffe150be347a97d0e07adc857cc93e245739db55e3a6d36022051eb72b21e35a5e7309e1864f00e1b107a5b5262d80b1128e9fb45fbe7971c7b012102bb05325000709d3a3d8063f9913777859b8fa30b83e4c4f981bb2d9781b7c91a" }, { "prev_out":{ "index":1, "hash":"436094120d4412c32b97738f9051a32a237c037abe31cafbdc8a02d16f2a659c" }, "script":"483045022100da7abc59e24d2afea9219ee24d1f3df4e1b9a2efa154d9704ed903210abfdb40022015a8237d38e18f558172872af1aa5c244b38c3ad8f594463c0dcad18dbfcf5f5012102bb05325000709d3a3d8063f9913777859b8fa30b83e4c4f981bb2d9781b7c91a" } ], "version":1, "vin_sz":2, "hash":"c5991f9f044f9d829fc01eeda76f36a514271270f9f891ea7b584f504ed404ea", "vout_sz":1, "out":[ { "script_string":"OP_DUP OP_HASH160 7ff85ee854794422531b7b5c3d380c5f50011a4e OP_EQUALVERIFY OP_CHECKSIG", "address":"1CfeMTtDP9HNjc8vsuuHGgUfABexvW5Qkf", "value":350000, "script":"76a9147ff85ee854794422531b7b5c3d380c5f50011a4e88ac" } ] }
正在使用的交易連結:
- <https://blockchain.info/tx/3a896625fce1f18ce4c3139863359631d5677cff4e4fd8dac25ca6327c0dadd8>
- <https://blockchain.info/tx/436094120d4412c32b97738f9051a32a237c037abe31cafbdc8a02d16f2a659c>
我的地址是 1FebYgpxQ1exSNdJENkbmNPmSfsiP3kZiT。
我使用 BitcoinJS 庫的程式碼如下:
key = bitcoin.ECPair.fromWIF(privatekey); var tx = new bitcoin.TransactionBuilder() var sum_outputs = 0; var input_utxos = defineInputs(utxos, amount); for(var a = 0; a < input_utxos.length ; a++){ tx.addInput(input_utxos[a].tx,a) sum_outputs+=parseInt(input_utxos[a].amount); } tx.addOutput(to, parseInt(amount)); var change_amount = sum_outputs - parseInt(amount); if(change_amount > 0) { tx.addOutput(from, change_amount); } for(var a = 0; a < input_utxos.length; a++) { tx.sign(a, key); } result = tx.build().toHex(); console.log(result);
所以我的問題是:
- 為什麼這適用於我地址中的 1 個輸入而不適用於 2 個輸入?
- 如何正確簽署我認為是錯誤原因的第二個輸入?
所以…我發現出了什麼問題。當我添加輸入時,問題出在這部分程式碼中。我根據輸入的數量為每個輸入添加一個索引。
for(var a = 0; a < input_utxos.length ; a++){ tx.addInput(input_utxos[a].tx,a) sum_outputs+=parseInt(input_utxos[a].amount); }
但我應該發送的索引實際上是交易輸出的索引。所以它必須是這樣的
for(var a = 0; a < input_utxos.length ; a++){ tx.addInput(input_utxos[a].tx,input_utxos[a].n) sum_outputs+=parseInt(input_utxos[a].amount); }
該索引可從為我提供一個帳戶的所有 utxos 的 api 中獲取。在這種情況下,它被呼叫
n
並位於事務對象本身內部。