Address

OP_EQUALVERIFY 問題

  • September 17, 2015

我正在製作一個全方位服務的錢包,我已經製作了 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 &lt; 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 &gt; 0) {
   tx.addOutput(from, change_amount);
}

for(var a = 0; a &lt; input_utxos.length; a++) {
   tx.sign(a, key);
}

result = tx.build().toHex();

console.log(result);

所以我的問題是:

  1. 為什麼這適用於我地址中的 1 個輸入而不適用於 2 個輸入?
  2. 如何正確簽署我認為是錯誤原因的第二個輸入?

所以…我發現出了什麼問題。當我添加輸入時,問題出在這部分程式碼中。我根據輸入的數量為每個輸入添加一個索引。

for(var a = 0; a &lt; input_utxos.length ; a++){
   tx.addInput(input_utxos[a].tx,a)
   sum_outputs+=parseInt(input_utxos[a].amount);
}

但我應該發送的索引實際上是交易輸出的索引。所以它必須是這樣的

for(var a = 0; a &lt; input_utxos.length ; a++){
   tx.addInput(input_utxos[a].tx,input_utxos[a].n)
   sum_outputs+=parseInt(input_utxos[a].amount);
}

該索引可從為我提供一個帳戶的所有 utxos 的 api 中獲取。在這種情況下,它被呼叫n並位於事務對象本身內部。

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