Goog morning,

i'm trying to create an application with a watching wallet, connected to 
the blockchain, and another application with a wallet, with private key, 
not connected to it, in order to mantain the private key secret and 
offline. I choose bitcoinj as java library and i would like to create the 
transaction on the watching wallet's application, send it serialized in an 
hexadecimal string to the privat wallet's application, in order to be 
signed by it, here the code i use for the serialization of the transaction:

//tx is my raw transaction
String hexTx = DatatypeConverter.printHexBinary(tx.bitcoinSerialize());


The problem is that i can't sign the transaction i deserialized from the 
string, here the code i use for deserilize the string and for sign the 
retured transaction:

    
byte[] serializedTx = hexStringToByteArray(hexTx);

Transaction deserializedTx = new Transaction(params,serializedTx);

SendRequest req = SendRequest.forTx(tx);

//secret wallet with private key
coldWallet.signTransaction(req);


Where the method hexStringToByteArray(hexTx) is defined like this:

private static byte[] hexStringToByteArray(String s) {
     int len = s.length();
     byte[] data = new byte[len / 2];
     for (int i = 0; i < len; i += 2) {
         data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                 + Character.digit(s.charAt(i+1), 16));
     }
     return data;
 }


For a better understanding of the problem here the log of the transaction 
before the serializzation:

2017-11-06 17:56:31,248 INFO i.i.b.TestRawTransaction [main]  
 5c3996212e48725e69eadcef02b4ea2826e0198e14ed9dd2002d8db0b3e708c7
     in   <no scriptSig> 
          
outpoint:8bfcfba135101c5d15641602881acc4799069ea1885e93c6e6d9f07d2dd7802f:0 
hash160:984201354d5781a017d3be3a006ae6828c553844
     out  DUP HASH160 
PUSHDATA(20)[f0497fd691918563d96258eb7e7bdbf3f88a8452] EQUALVERIFY CHECKSIG 
959.9763362 BTC
     out  RETURN PUSHDATA(5)[68656c6c6f] 0.0000273 BTC
     fee  0.00495049 BTC/kB, 0.0005 BTC for 101 bytes
     prps USER_PAYMENT

When i deserialize the hex string back to a Transaction object i obtain 
this log:

2017-11-06 17:56:31,252 INFO i.i.b.TestRawTransaction [main] Transazione 
deserializzata:
  5c3996212e48725e69eadcef02b4ea2826e0198e14ed9dd2002d8db0b3e708c7
     in   <no scriptSig>
          
outpoint:8bfcfba135101c5d15641602881acc4799069ea1885e93c6e6d9f07d2dd7802f:0
     out  DUP HASH160 
PUSHDATA(20)[f0497fd691918563d96258eb7e7bdbf3f88a8452] EQUALVERIFY CHECKSIG 
959.9763362 BTC
     out  RETURN PUSHDATA(5)[68656c6c6f] 0.0000273 BTC
     prps UNKNOWN

I lost some data in the process but i can't say why, infact i compare the 
two byte[], the one after the serializzation with the one after the 
deserializzation, but they are identical.

When i try to sign the Transaction above with the method 
*coldWallet.signTransaction(req)*, the input is not signed and the 
transaction broadcasted on the blockchain is discarded.

*Why the wallet doesn't sign the transaction?* *Could it be caused by the 
lost of the data?* I rather think so becouse when i try to broadcast the 
transaction, *peerGroup.broadcastTransaction(req.tx)*, those data are 
recalculated.

*Could be that i used the wrong method of serialization/deserialization of 
the Transaction? There's another way of implement it?*

Thanks for support.

-- 
You received this message because you are subscribed to the Google Groups 
"bitcoinj" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to