Not the same private key when signing transaction? - "Some inputs have not been fully signed"


#1

Hi, I’m trying to send some satoshis from an address I derived from an HDPrivateKey. But, the transaction is not signed and I get an error when trying to serialize it. Can anyone help me see what’s wrong here?

var HDPrivateKey = bitcore.HDPrivateKey,
Address = bitcore.Address,
Networks = bitcore.Networks,
Transaction = bitcore.Transaction,
UnspentOutput = bitcore.Transaction.UnspentOutput;

var hdPrivateKey = new HDPrivateKey(“specific key”).derive(0),
hdPublicKey = hdPrivateKey.hdPublicKey;

var firstAddress = new Address(hdPublicKey.publicKey, Networks.livenet),
secondAddress = new Address(hdPublicKey.publicKey, Networks.livenet);

var utxo = new UnspentOutput({
“txid” : “specific txid”,
“vout” : 0,
“address” : firstAddress.toString(),
“scriptPubKey” : “76a914087ddee66b47723d8fb865ef9b025869bead531488ac”,
“satoshis” : 97380
});

var fee = 5430;

var tx = new Transaction()
.from(utxo)
.to(“198Z9wd57VZiK54VT7MtGKswfjPuyQTHey”, utxo.satoshis-fee)
.change(secondAddress.toString())
.sign(hdPrivateKey.privateKey)
.fee(fee);

console.log("PrivateKey generates address in utxo: " + (firstAddress.toString() === new Address(hdPrivateKey.publicKey, Networks.livenet).toString()) )
console.log("transaction verified: "+tx.verify() );
console.log("Signature correct: "+tx.isFullySigned());

So, I’m thinking that since I used hdPrivateKey to create a public key, from which to create the address which has the unspent output, it should be this key to sign the transaction. But, it’s not working. Can anyone see why?

I got the transaction id and the script from blockchain.info’s site following this link https://blockchain.info/unspent?active=15jiupj1gHaGyJjYKC2rXo9dxQfEVWmEMb (but with another address). I have tried using both tx_hash and tx_hash_big_endian as values for txid.

I get this error message from running tx.serialize():

/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/transaction/transaction.js:170
throw serializationError;
^
Some inputs have not been fully signed
Error
at Error.NodeError (/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/errors/index.js:20:41)
at Transaction._isMissingSignatures (/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/transaction/transaction.js:268:12)
at Transaction.getSerializationError (/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/transaction/transaction.js:211:10)
at Transaction.checkedSerialize (/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/transaction/transaction.js:166:33)
at Transaction.serialize (/home/bob/Workspace/bitcore/node_modules/bitcore-lib/lib/transaction/transaction.js:150:17)
at Object. (/home/bob/Workspace/bitcore/test.js:45:16)
at Module._compile (module.js:556:32)
at Object.Module._extensions…js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)


#2

I got it working! The error was probably because I got something wrong from the transaction.

I got the utxo from Insight, that was described in a very good video here.

 var Insight = require('bitcore-explorers').Insight;
 var insight = new Insight('testnet');

 insight.getUnspentUtxos(address, function(err, utxos){
   if(err){
   }else{
     console.log(utxos)
     var satoshisOwned = utxos[0].toObject().amount * 100000000,
         fee = 15000;
     var tx = bitcore.Transaction();
     tx.from(utxos);
     tx.to(address2, satoshisOwned-fee);
     tx.change(address);
     tx.fee(fee);
     tx.sign(privateKey);
     console.log('transaction:');
     console.log(tx.toObject());
     tx.serialize();
         insight.broadcast(tx, function(err, returnedTxId){
       if(err){
         console.log(err)
       }else{
         console.log("succesful broadcast: " + returnedTxId)
       }
     })
   }
 })

Once I got the utxos this way, everything worked fine.