DEV Community

Cover image for Demystifying Bitcoin Transaction Fees: How Explicit Fee Selection Works
VICTOR KIMUTAI
VICTOR KIMUTAI

Posted on

Demystifying Bitcoin Transaction Fees: How Explicit Fee Selection Works

If you are new to building on the Bitcoin network or diving into raw transaction construction, one core concept you must master is how transaction fees are paid. Unlike some account-based chains with fixed gas costs, Bitcoin uses a UTXO model where you explicitly calculate and set your fee rate.

How the Math Works

Bitcoin transaction fees are not based on the amount of money you send. Instead, they are calculated based on the physical data size of your transaction measured in virtual bytes (vbytes).

Total Fee=Fee Rate (sat/vB)×Transaction Size (vBytes) \text{Total Fee} = \text{Fee Rate (sat/vB)} \times \text{Transaction Size (vBytes)}

When building a raw transaction, the fee is implicitly determined by subtracting the total value of your outputs from the total value of your inputs. Whatever satoshis are left over that do not go to a destination or a change address go straight to the miner.

Setting Fees in Code

When working with bitcoin node RPCs or libraries, you define this explicitly. For example, specifying a fee rate using sat/vB looks conceptually like this:

{
  "inputs": [{ "txid": "...", "vout": 0 }],
  "outputs": [{ "address": "...", "value": 50000 }],
  "fee_rate_sat_per_vbyte": 5
}
Enter fullscreen mode Exit fullscreen mode

Best Practices for Devs

  • Dynamic Estimation: Always query a mempool API or your local node's fee estimator dynamically rather than hardcoding sat/vB values. Network congestion changes block by block.
  • Handle RBF (Replace-By-Fee): Implement RBF signaling where appropriate so users can bump their fee if a transaction gets stuck in a congested mempool.
  • Watch out for Dust Limits: Ensure your explicit fee and output values do not fall below the minimum relay threshold, or your transaction will be dropped by the network nodes.

Have you built a custom fee-estimation tool into your app yet? Let me know your approach in the comments!

Top comments (0)