Author

Topic: How to take a BTC out of a cold storage wallet safely (Read 1116 times)

legendary
Activity: 3038
Merit: 4418
Crypto Swap Exchange
Thanks, that is making more sense.

So, do you send the change back to the same address? Or to a different one? Is this what is referred to as a 'return address'?
It's your preference. For the maximum privacy, I would send it to a new address.

I don't understand. Is it not extremely imortant to know which inputs are about to be used so that you can set the correct change payment and the correct fee payment? If you don't know EXACTLY what inputs are about to be used then you cannot do this accurately, no?
It is definitely extremely important to know which inputs you are using. Most desktop clients and wallet clients will choose the inputs for you so you don't have to worry about it. The selection of inputs depends on what each wallet would think is optimal for the transaction. If the wallet wants the fees to be the lowest, it would gather the input such that the number of inputs used will be the lowest.
I am confused. This sounds very complex. Will my private keys be exposed to coinb?
No. You are only providing your address and creating a transaction using the UI provided by coinb.in. As long as you follow my steps, you will be fine. The private keys will not be in contact with the internet.
And, if I dont do this, then the entire contents of my wallet will be sent each time I spend a buck?
As far as I can tell, yes. You have to manually remove the inputs.
I've briefly watched it. It has a good explanation.
newbie
Activity: 50
Merit: 0
Thanks, that is making more sense.

So, do you send the change back to the same address? Or to a different one? Is this what is referred to as a 'return address'?

Quote
1 If I had received lets say 100 different payments to a wallet, all varying amounts, which one of those blocks/inputs would the payment im trying to send come out of? The largest or smallest? Or the first or last?

It really depends on what wallet you are using. Generally, IMO, the lesser inputs used the better.
I don't understand. Is it not extremely imortant to know which inputs are about to be used so that you can set the correct change payment and the correct fee payment? If you don't know EXACTLY what inputs are about to be used then you cannot do this accurately, no?

Quote
I was referring to coinb.in. Bitcoin Core will select the inputs for you automatically. If you want to do it yourself, go to Send>Coin Control.
Quote from: jefferson7 on Today at 01:56:28 PM
4 Coinb will use the whole contents of the wallet? Not just a receipt payment block/input? So the whole content of the wallet must be sent out and received back every time you want to spend a Satoshi?
By default, yes. You can, of course modify which inputs to use. Just click the inputs tab and you can choose which inputs to exclude.
Quote from: jefferson7 on Today at 01:56:28 PM
6
Quote
Yeah. Its like a how you would be paying $1 million for a candy just to receive a $999,999 change. The cycle will continue.
Just so that I can be sure - You mean that YES, you would have to keep sending the whole contents of the wallet just to spend one satoshi? Surely that cant be correct?
Just to be clear, you have to spend the whole inputs everytime.

I am confused. This sounds very complex. Will my private keys be exposed to coinb? And, if I dont do this, then the entire contents of my wallet will be sent each time I spend a buck?

I thought this explained it well, do you agree?
https://www.youtube.com/watch?v=q7CVfucFhNI

and this
https://www.youtube.com/watch?v=Em8nJN8IEes
legendary
Activity: 3038
Merit: 4418
Crypto Swap Exchange
Thanks again. This is getting complex! surely this will never catch on! ;-)

So, is it correct to say that the transactions received to a wallet, are like blocks (an input) of BTC? Where each block (input) must be used in its entirety if you want to spend a little? In other words, you cannot just take out a little from that block, or input, you have to send it all at once and make sure you ask for change by sending the change back to the same wallet, same address? Or different address?
Yes. No worries, you will learn a lot more by asking around or just browsing the forum. Smiley
A few other things I didn't understand -

1 If I had received lets say 100 different payments to a wallet, all varying amounts, which one of those blocks/inputs would the payment im trying to send come out of? The largest or smallest? Or the first or last?
It really depends on what wallet you are using. Generally, IMO, the lesser inputs used the better.
2 What do you mean by 'save space'? Space in what?
Of a transaction. Transactions do occupy space in the mempool and blockchain. The more inputs and/or outputs you have, the larger your transaction. The larger your transaction, the more fee you will pay.
3 I dont have an Inputs tab, what software are you using? I have qt.
I was referring to coinb.in. Bitcoin Core will select the inputs for you automatically. If you want to do it yourself, go to Send>Coin Control.
4 Coinb will use the whole contents of the wallet? Not just a receipt payment block/input? So the whole content of the wallet must be sent out and received back every time you want to spend a Satoshi?
By default, yes. You can, of course modify which inputs to use. Just click the inputs tab and you can choose which inputs to exclude.
6
Quote
Yeah. Its like a how you would be paying $1 million for a candy just to receive a $999,999 change. The cycle will continue.
Just so that I can be sure - You mean that YES, you would have to keep sending the whole contents of the wallet just to spend one satoshi? Surely that cant be correct?
Just to be clear, you have to spend the whole inputs everytime. I was assuming the scenario below.

Eg. I received 1BTC from John
 I'm sending 0.01BTC to Jack.
 -----> 0.01BTC to jack
 ----->0.98BTC to myself.  (0.01BTC is used as fee.)


Next, I want to send 0.02BTC to Sally.
 -----> 0.02BTC to Sally
 -----> 0.95BTC to myself. (0.01BTC used as fee).
newbie
Activity: 50
Merit: 0
Thanks again. This is getting complex! surely this will never catch on! ;-)

So, is it correct to say that the transactions received to a wallet, are like blocks (an input) of BTC? Where each block (input) must be used in its entirety if you want to spend a little? In other words, you cannot just take out a little from that block, or input, you have to send it all at once and make sure you ask for change by sending the change back to the same wallet, same address? Or different address?

A few other things I didn't understand -

1 If I had received lets say 100 different payments to a wallet, all varying amounts, which one of those blocks/inputs would the payment im trying to send come out of? The largest or smallest? Or the first or last?

2 What do you mean by 'save space'? Space in what?

3 I dont have an Inputs tab, what software are you using? I have qt.

4 Coinb will use the whole contents of the wallet? Not just a receipt payment block/input? So the whole content of the wallet must be sent out and received back every time you want to spend a Satoshi?

5
Quote
most people shouldn't try to script their own transaction unless they know what they are doing.
Oh sh*t!

6
Quote
Yeah. Its like a how you would be paying $1 million for a candy just to receive a $999,999 change. The cycle will continue.
Just so that I can be sure - You mean that YES, you would have to keep sending the whole contents of the wallet just to spend one satoshi? Surely that cant be correct?
legendary
Activity: 3038
Merit: 4418
Crypto Swap Exchange
That is amazing. If you had not warned me about that I could have lost most of my btc!
What is this called so that I can study this and understand it properly?
This is called the change. Its just like how when you give $10 to the cashier for a bar of chocolate that costs $1, you would expect $9 back.
In your example, if you wanted to send 1.6 to sally, would you need to send:
1.6 to sally
0.3999999999 to yourself
0.0000000001 as the fee

Is that correct?
It depends on the inputs used. In most (pretty much all) cases, one input=one transaction sent to the wallet. If you received only 2BTC in a transaction to the address, thats pretty much what you can do in the scenario described above. Unfortunately, AFAIK, coinb.in uses all of your inputs in a transaction and this can be a waste of space. Most desktop would select according to how old the inputs is and how much is being spent. Eg. to save space, I'll spend a 1BTC input for a 1BTC transaction, as opposed to 10 X0.1BTC inputs for a 1BTC transaction.

You can manually include or exclude inputs by going to the "inputs" tab.
I can only guess at how much money has been lost in fees by people not aware of this.
Theres a lot of cases. This is why most people shouldn't try to script their own transaction unless they know what they are doing.
What would happen if you has a wallet with thousands of btc in it that you received in one payment? Would you have to keep sending millions of dollars of value just to spend a little? Am I misunderstanding this?
Yeah. Its like a how you would be paying $1 million for a candy just to receive a $999,999 change. The cycle will continue.
newbie
Activity: 50
Merit: 0
That is amazing. If you had not warned me about that I could have lost most of my btc!
What is this called so that I can study this and understand it properly?

In your example, if you wanted to send 1.6 to sally, would you need to send:

1.6 to sally
0.3999999999 to yourself
0.0000000001 as the fee

Is that correct?

I can only guess at how much money has been lost in fees by people not aware of this. What would happen if you has a wallet with thousands of btc in it that you received in one payment? Would you have to keep sending millions of dollars of value just to spend a little? Am I misunderstanding this?
vh
hero member
Activity: 699
Merit: 666
Quote
4. IMPORTANT: Anything that is not spent is used as transaction fee. You have to send the coins back to an address that you control. For example, I know that 0.0008BTC will get me a confirmation with the transaction size I have, I'll send 0.046BTC to 192fqgb5aCKrjNkudGqSWR6Nuu4J8tEMB7 which is an address that I control.

I don't understand this part of your post. Do you mean that, if I tried to send 1 bitcoin, that the balance of my wallet would be sent as a fee? I really don't understand this at all. Could you say that again in a different way please?

Thanks for your post that was very helpful!

Say you receive 1btc+0.5btc+0.5btc = 2btc.
To send 1.2 btc to sally, you take two inputs (1btc+0.5btc = 1.5btc)
If you don't account for the full 0.3 remaining, it all goes to fee.
Send 0.2995btc back to yourself as a second output (change), and the remaining becomes the fee 0.0005.

Edit: inputs and outputs totals are always equal in all transactions.
newbie
Activity: 50
Merit: 0
Quote
4. IMPORTANT: Anything that is not spent is used as transaction fee. You have to send the coins back to an address that you control. For example, I know that 0.0008BTC will get me a confirmation with the transaction size I have, I'll send 0.046BTC to 192fqgb5aCKrjNkudGqSWR6Nuu4J8tEMB7 which is an address that I control.

I don't understand this part of your post. Do you mean that, if I tried to send 1 bitcoin, that the balance of my wallet would be sent as a fee? I really don't understand this at all. Could you say that again in a different way please?

Thanks for your post that was very helpful!
HCP
legendary
Activity: 2086
Merit: 4361
That is a very good tutorial! Well done... Smiley

Just one small thing to add... if your "offline" wallet is "locked", the signrawtransaction command might fail. You may need to use the following command in the "Debug->Console" section first:

Code:
walletpassphrase "YOURPASSPHRASEHERE" 60

This will unlock the wallet for 60 seconds so that you can sign the transaction...
legendary
Activity: 3038
Merit: 4418
Crypto Swap Exchange
I'm so sorry, I was bombarded by a lot of various unread threads and I didn't manage to reply to this.
Is the "raw unsigned transaction" just the send address? If not, what do I need to export to the USB?
Im not sure how to create an unsigned transaction?
Nope. The unsigned raw transaction is a string of words and letters that contains the inputs and the outputs with the criteria to spend it. It's basically the information of the transaction you are making.

Since I have sometime, I'll just do it step by step for you. I'm using coinb.in for simplicity, you can use a lot of different sites and clients.
1. Go to https://coinb.in/#newTransaction
2. Key your address into "Address, WIF key or Multisig Redeem Scripts" field and press load.

3. Key in your destination address and amount, for example if I want to send to 38ccq12hPFoiSksxUdr6SQ5VosyjY7s9AU with an amount of 0.003BTC:

4. IMPORTANT: Anything that is not spent is used as transaction fee. You have to send the coins back to an address that you control. For example, I know that 0.0008BTC will get me a confirmation with the transaction size I have, I'll send 0.046BTC to 192fqgb5aCKrjNkudGqSWR6Nuu4J8tEMB7 which is an address that I control.
5. Click submit and copy the entire string of words in the box.


And is the HEXSTRINGGOESHERE also the send address?


No. It's the string that we have created above.
6. Open your client up and go to Help>Debug log>Console.
7. Key in:
Code:
decoderawtransaction "Paste everything here"
Check that you are sending it to the correct address.


Oops, I forgot about this:
That is a very good tutorial! Well done... Smiley

Just one small thing to add... if your "offline" wallet is "locked", the signrawtransaction command might fail. You may need to use the following command in the "Debug->Console" section first:

Code:
walletpassphrase "YOURPASSPHRASEHERE" 60

This will unlock the wallet for 60 seconds so that you can sign the transaction...
.
8. Next to sign your transaction, key in
Code:
signrawtransaction "paste everything here"

9. Copy everything as highlighted and go to coinb.in/#broadcast to broadcast.
10. Voila.
newbie
Activity: 50
Merit: 0

It's quite easy. Go to coinb.in or your desktop client and craft a raw unsigned transaction, transfer it to your USB and sign it on your offline computer by going to Help>Debug Window>Console and key in
Code:
signrawtransaction HEXSTRINGGOESHERE
. Copy the signed raw transaction back to your USB and you can broadcast it on your online wallet.

For the recent version of Bitcoin Core, you can have the xpub if you have the HD wallet feature. It isn't well polished though.

Anyhow, Bitcoin Core doesn't really go that well with offline storage. I would recommend Electrum or Armory. They both provide way better interface as compared to Bitcoin Core.


That sounds great. Just what Im looking for! Thanks for the tip.

Is the "raw unsigned transaction" just the send address? If not, what do I need to export to the USB?

Im not sure how to create an unsigned transaction?

And is the HEXSTRINGGOESHERE also the send address?

legendary
Activity: 3038
Merit: 4418
Crypto Swap Exchange
Hi all,
I have a few btc in cold storage and want to take 1 out safely without exposing the others to the dark side.
How can I do that? I'm using Bitcoin qt.

Do I need to export the encrypted wallet.dat file and import it in a hot wallet? That sounds like it defeats the purpose of the cold storage, never having been online, off line backup wallet

Can anyone help with that?

Thanks!
It's quite easy. Go to coinb.in or your desktop client and craft a raw unsigned transaction, transfer it to your USB and sign it on your offline computer by going to Help>Debug Window>Console and key in
Code:
signrawtransaction HEXSTRINGGOESHERE
. Copy the signed raw transaction back to your USB and you can broadcast it on your online wallet.

For the recent version of Bitcoin Core, you can have the xpub if you have the HD wallet feature. It isn't well polished though.

Anyhow, Bitcoin Core doesn't really go that well with offline storage. I would recommend Electrum or Armory. They both provide way better interface as compared to Bitcoin Core.
hero member
Activity: 630
Merit: 500
You need the private key to sign transactions, it creates an exposure point.

You can create a transaction in isolation (off-line), sign it, write the resulting raw tx on a piece of paper, walk over to an online system with a browser and broadcast the raw tx.

The math required to sign a transaction will likely require some computing assistance.

The closest you can get is to create a new off net system that you can leverage, expose the key to temporarily (while off-net), and then destroy immediately when you have the raw tx.



pytools and other tools can do this too but requires some time and effort.

Otherwise, you must connect the privkey to a wallet to have it make an online transaction for you.

Best bet, create a new cold storage address, and put the wallet.dat of your first address into the client and let it sync. Send TWO amounts out in ONE transaction, 1 coin to where you want to use it, and the rest to the new cold storage.

One time deal, old cold storage burned, new intact and 1 BTC liquid.
vh
hero member
Activity: 699
Merit: 666
You need the private key to sign transactions, it creates an exposure point.

You can create a transaction in isolation (off-line), sign it, write the resulting raw tx on a piece of paper, walk over to an online system with a browser and broadcast the raw tx.

The math required to sign a transaction will likely require some computing assistance.

The closest you can get is to create a new off net system that you can leverage, expose the key to temporarily (while off-net), and then destroy immediately when you have the raw tx.

newbie
Activity: 50
Merit: 0
Hi all,
I have a few btc in cold storage and want to take 1 out safely without exposing the others to the dark side.
How can I do that? I'm using Bitcoin qt.

Do I need to export the encrypted wallet.dat file and import it in a hot wallet? That sounds like it defeats the purpose of the cold storage, never having been online, off line backup wallet

Can anyone help with that?

Thanks!
Jump to: