My Question is why you would want to sign a cold-wallet owned Transaction
on your watching wallet?
Why don't you generate the transaction from the cold wallet directly and
sign it from there before handling the serialized raw data back to the
watching wallet for final submission?
R
On Tuesday, November 7, 2017 at 7:38:21 PM UTC+8, Emanuele Pagliara wrote:
>
> 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.