OP_EQUALVERIFY-Problem

Ich mache eine Full-Service-Wallet, ich habe bereits den UTXOs-Auswahlalgorithmus erstellt und jetzt möchte ich die Hex-Bytes der Transaktion pushen. Es funktioniert, wenn ich nur eine Transaktion mit nur 1 Eingabe pushe , aber wenn ich versuche, das Hex von einem tx zu pushen, das ich mit 2 Eingaben vom selben Konto gemacht habe, bekomme ich Folgendes:

OP_EQUALVERIFY: non-equal data

Hier ist mein decodiertes Hex:

{
   "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"
      }
   ]
}

Links zu den verwendeten Transaktionen:

Meine Adresse ist 1FebYgpxQ1exSNdJENkbmNPmSfsiP3kZiT.

Und mein Code, der die BitcoinJS-Bibliothek verwendet, ist der folgende:

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);

Also meine Fragen sind:

  1. Warum funktioniert das mit 1 Eingang von meiner Adresse und nicht mit 2 Eingängen?
  2. Wie kann ich die zweite Eingabe, von der ich annehme, dass sie die Fehlerursache ist, korrekt signieren?
Im Moment habe ich mir beide Quelltransaktionen angesehen und die Indizes wurden bereits ausgegeben. Hast du dein Problem erfolgreich gelöst?
@NayukiMinase ja. Danke. Ich werde meine eigene Antwort posten

Antworten (1)

Also... ich fand heraus, was los war. Das Problem war in diesem Teil des Codes, als ich die Eingaben hinzufügte. Ich habe jeder Eingabe einen Index hinzugefügt, basierend auf der Anzahl der Eingaben.

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

Aber der Index, den ich senden sollte, war eigentlich der Index der Transaktionsausgaben. also musste es so sein

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);
}

Der Index konnte von der API abgerufen werden, die mir alle Utxos für ein Konto zur Verfügung stellte. In diesem Fall wurde es aufgerufen nund befand sich innerhalb des Transaktionsobjekts selbst.