An unfortunate predicament for newcomers to Bitcoin is that most don’t have a technical background, CS degree or invested time to familiarise themselves with the underlying technology. But of course why should they?
Cryptocurrency is money and people should be able to use it as such, without the need to understand how it works. That was the case for sometime, before cryptos skyrocketed in popularity and with them the transaction fees particularly for bitcoin and ethereum transactions.
The fees situation
At the time of writing, the fastest and cheapest transaction fee is 490 satoshis/byte. This means that for the median transaction size of 226 bytes, this results in a fee of 110,740 satoshis or 15$. (If you didn’t understand anything, this is normal and I will explain how this is calculated in the next section).
For those of us that are not transferring thousands of dollars worth of bitcoin but we would like to use it for small transactions (I personally used to order Pizza paying exclusively in Bitcoin) these fees make Bitcoin unusable at the moment.
There are certain reasons why this is happening and I will list them below but to cut to the chase, I don’t recommend using Bitcoin for transferring small amounts at the moment. Bitcoin Cash, ZCash or Litecoin work just fine and make more sense right now to facilitate these types of transactions. But if you still need to transact in Bitcoin or move funds between your accounts, then this guide is for you.
How bitcoin fees are calculated, what is the transaction size and why do we measure it in bytes?
First of all I think it’s important to understand why transaction fees are so high at the moment.
The most important thing to note is that your transaction size is not related to the amount of money you are sending. As an example, If your transaction is 250 bytes, you'll have to pay the same fee whether you're transferring 0.001 bitcoins or 1 million bitcoins.
Bitcoin is a blockchain-based asset. As such, every new bitcoin transaction is broadcasted to the network and eventually collected into blocks of 1Mb in size, that are included in the blockchain by the miners. An important think to notice is that since we’re using the blockchain, any new bitcoin transaction typically references previous transaction outputs as new transaction inputs and dedicates all input Bitcoin values to new outputs. Simply put, an input is where the coin value is coming from (usually a previous transaction’s output) and an output where the value is going to. Outputs from one transaction can be used as inputs in a new transaction, creating a chain of ownership as the value is moved from address to address on the blockchain.
The thing is that the more small amounts (inputs) of bitcoin you accumulate to your account over time, the bigger is going to be the transaction size when you decide to send (output) these bitcoins to another address.
Below you can see two examples that illustrate this case:
In the first example someone received a transaction (just one input) and then send this bitcoin to some other address. This whole transaction is 225 bytes in size.
In the second case, the person received 17 different transactions over time and then decided to send these bitcoin to some other address. Since in the blockchain "any bitcoin transaction typically references previous transaction outputs as the inputs for the new transactions, the bitcoin network has to process all these many inputs to produce these few outputs and the resulting size of the transaction is 10X more at 2584 bytes (2.5kb!).
Since each block in the Bitcoin’s blockchain is being validated roughly every 10 minutes and has limited space (1MB), for this transaction to be included in the blockchain it would mean that many smaller transactions would have to wait. And since the bitcoin miners can include a finite amount of transactions in each block, they will inevitably prioritise the transactions with the highest fee. Because of this, with todays standards for this second transaction to go through would require a fee of around 150$, independently of the value it represents!
How to find the ideal fee for your transaction
The ideal fee depends mainly on two factors, the network congestion at the moment where you plan to move your bitcoin and the size of your transaction in bytes. Unfortunately many wallets don’t tell you the size of your transaction before you send it but fortunately some others give you the option to specify the fee-per-byte you are willing to use.
In the end it comes down to the wallet that you use, so make sure to do your research before receiving any bitcoin to your address. Personally I believe that the 3 most important features in a bitcoin wallet is to use SegWit addresses, the flexibility to adjust your own fees and finally the freedom to export your private keys.
Although most wallets don’t tell you the size of your transaction in bytes, many allow you to specify a custom fee based on how many satoshi/byte you want to spend, and then will then give you the total fee based on that value.
Warning: be careful, as some wallets only let you enter the number of satoshis/byte or bitcoins/kilobyte. If you enter the fixed fee described above into a per-byte field, you'll probably pay more than 200 times more fee than necessary! The good thing is that most wallets should also display that value in USD
Before making a Bitcoin transaction, here’s what to do to save on fees:
1. Use bitcoinfees.earn.com
Before I make a transaction, I always visit bitcoinfees.earn.com to check the state of the network. On the right you can see the time estimations for the avarage transaction to go through, based on the range of the fees-per-byte (satoshi per byte) on the left. The bars represent the number of the transactions that are competing to be included in a block. Generally speaking, if you want to have the fastest possible confirmation in the fairest price, go with the recommended satoshi per byte fee. Otherwise you can experiment (for example when you are transferring bitcoin between your own addresses) and use lower fees based on the confirmation time estimations on the right and how many other transactions with the same fee range are competing for being included in a block.
If your wallet doesn’t provide any info about your transaction’s size or allows you to select a custom fee per byte but allows you to specify a different fee in USD than the default one, you can again use bitcoinfees.earn.com to calculate the optimal transaction fee. For example, if the recommended fee on earn is 110 satoshis/byte and the median byte size is 226 bytes, that's 226 * 110 = 24860 satoshi. Use that and unless you have a really big transaction size, you should be good to go.
2. Use SegWit
Always use a wallet that supports SegWit addresses and try to send money to people that have SegWit addresses. SegWit transactions are around 75% smaller in size compared to non-SegWit transactions and this can have a huge impact on your transaction’s size in bytes and subsequently your transaction fees. It’s not easy to tell which address is a SegWit address but it’s definitely easier though to know which wallets support it.
For those wallets that support it, these will be the default addresses generated by these wallets, so you don’t have to do anything at all to use SegWit are reap all the benefits that come with it.
Also I would recommend to monitor bitcoinfees.earn.com during weekend and use an opportunity when the mempool is quite, to move any bitcoin you might own to segwit addresses. If you bought bitcoin on Coinbase for example or any other major exchange it’s almost certain that your bitcoin live in a legacy address.
Here’s a few of my favourite Bitcoin wallets that support SegWit:
- Bitcoin core (desktop wallet)
- Trezor (hardware wallet)
- Ledger (hardware wallet)
- Green Address – mobile wallet (hot wallet)
- Samurai wallet – Android only (hot wallet)
Before moving on, I’d like to add that it’s darn difficult to find mobile wallets that support segwit at the moment. Most of the hardware and desktop wallets (ex. Electrum) support Segwit but not so many in the mobile space. I think this is an oxymoron since most of the users will use a hot/ mobile wallet for small transactions where the fees are devastating. On a different note, if you haven't heard of Green Address, the team was recently acquired by Blockstream and Green Address is now officially a Blockstream product. This proves it’s legitimacy and probably I'll start using it as a hot/ mobile wallet from now on.
3. Do batching
Since the early days of the bitcoin client, it has been possible to combine multiple bitcoin payments into a single transaction, significantly reducing overhead. Making one transaction that pays from one address to many is a very simple function that can save you a lot of money since the cost of adding an output to a transaction is much lower than the cost of adding an input (making a whole new transaction).
A number of wallets support batching, most notably:
- Electron desktop wallet
- Bitcoin core CLI wallet
I am not aware of any other mobile wallet except Samurai supporting batching at the moment
4. Use a wallet that supports Replace-By-Fee
Basically wallets that support Replace-By-Fee allow you to assign a variable fee to your transaction, so if you see that the transaction doesn’t get through fast, you can selectively pay more. This allow you to experiment with lower fees and adjust as needed in case of a sudden surge etc.
Replace by fee is supported in:
- Bitcoin core CLI wallet
I am not aware of any mobile wallets except Samurai offering this function right now, and even most desktop wallets don’t as it’s not a popular feature. The difficulty in its implementation is mainly due to the UX design implications that most wallet developers tend to avoid. It’s no common secret that the UX sucks in this field and there many more talented backend or low level developers that UI/ front-end developers in the space. Hopefully great products in the space like Samurai will set the market standard and we’ll start seeing more wallets and especially mobile wallets offering such batching, replace-by-fee and full fee customisation.
5. Do you really need to have a transaction validated asap?
Some providers (ex. BitPay) will wait for at least 1 confirmation because they don’t want to risk double spending. This sucks, mainly because you’ll need to include a high fee (since you want your transaction to be included in a block asap). Otherwise you are risking waiting several minutes for your pizza order to be placed which is nothing to mess up with. Moreover, I believe that BitPay hasn’t implemented segwit yet, so these fees are much more expensive than it should be.
But in many other cases when you don’t necessarily need a transaction to happen in a timely manner, it just doesn’t make sense to include high fees; for example when paying contractors for services or moving funds between your accounts, from cold storage to your hot wallets etc. These transactions will eventually get through and even if they don’t you can try again anytime.
What to expect in the future
Perhaps the most important reason why fees are increasing is that most wallets and users alike tend to inflate them. For a wallet developer it’s easier to just suggest a high fee that offers better user experience than confuse new users with more options and user flows. I follow the wallet makes quite closely and this situation doesn’t seem to change for now although there’re some promising projects in the space (suggested fees based on machine learning etc.)
Also right now only 12% of the transactions on the network are segwit transactions. As more wallets and exchanges start to implement segwit the fees will decrease although since their implementation roadmaps are in many cases unclear, the burden to find a segwit compatible wallet will still fall to the user.
Finally the lighting network is expected to be implemented in bitcoin in 2018 but it’s still unclear if the big exchanges will be able to embrace and rip the low fees benefits for their user base because of it’s privacy characteristics that conflict with their “know your customers” regulations and operational framework.