Transaction fees are the price you pay to get scarce block space (or execution capacity) when many people want to use the same blockchain at the same time. The tricky part is that “the fee” is rarely a single number: different networks split it into components (base fee, tip, priority fee, data fee), and wallets often hide the moving pieces behind a simple slider. In this article, I’ll break down how fees are formed on major blockchain networks, why they fluctuate, and which levers you can realistically use to lower cost without gambling on stuck transactions.
At the root, fees exist because blockchains have hard limits: blocks can only include so much data, and virtual machines can only execute so much work per block. When demand exceeds that capacity, users compete. That competition is expressed as a fee market: you attach a payment to your transaction, and block producers (validators/miners) prioritise the transactions that maximise their revenue under the network’s rules.
This is why fees behave differently across networks. A chain that prices “bytes” (how much data your transaction takes) will push you to make transactions smaller. A chain that prices “compute” (how much processing your transaction needs) will push you to limit heavy instructions. And networks that separate execution from data availability can end up with two distinct fee markets running side by side.
In practice, most fee spikes come from one of three things: a sudden surge of users (airdrop claims, popular token mints), a market move that triggers exchange and arbitrage flows, or application behaviour (bots, liquidations, MEV strategies) that aggressively bids for inclusion. The user experience is the same either way: you’re competing for limited capacity, and the “going rate” changes minute by minute.
Fees are dynamic because the backlog is dynamic. When there are more pending transactions than the next few blocks can absorb, wallets raise suggested fees. When the backlog clears, the suggested fee drops quickly. This is also why weekends, nights, or off-peak hours can be cheaper on many networks: fewer users are competing at the same time.
Your own transaction also matters. On UTXO-based networks like Bitcoin, the fee is usually proportional to size in virtual bytes, so spending many small inputs can be significantly more expensive than spending one large input. On account-based networks like Ethereum, the cost is driven by gas: simple transfers are relatively cheap, while complex contract calls can be orders of magnitude more expensive because they consume more gas.
Finally, confirmation targets change the price. Paying “just enough” for the next block is typically more expensive than paying for a confirmation within, say, 30–60 minutes. The hidden optimisation is choosing a confirmation window that matches your real need, rather than reflexively selecting the fastest option.
Ethereum’s modern fee logic is built around EIP-1559. Instead of a pure first-price auction, each block has a protocol-defined base fee that adjusts up or down with congestion. You still can add a priority tip (often called a “tip”) to encourage faster inclusion, but the base fee is not paid to validators: it is burned by the protocol, reducing the circulating supply of ETH.
Practically, that means your total cost is commonly described as: gas used × (base fee + priority fee). During normal conditions, the base fee is the main driver. During highly competitive moments (high MEV, liquidations, NFT mints), the priority portion can jump because users outbid one another for immediate inclusion.
Since 2024, Ethereum also has a major new dimension for scaling via rollups: EIP-4844 (proto-danksharding) introduced blob-carrying transactions, and blob data is priced in a separate fee market from regular execution gas. The key idea is that rollups can post data in blobs that are kept temporarily, reducing long-term storage pressure and typically lowering the data-posting cost compared with older approaches that relied heavily on permanent calldata.
The first lever is your priority fee. If your wallet lets you set it manually, you can often reduce overpayment by using a modest tip during moderate congestion and only increasing it when you truly need next-block inclusion. For many everyday transfers, you can accept a slower confirmation and shave cost by not bidding aggressively against bots and arbitrage flows.
The second lever is timing and batching. If you’re sending multiple transfers, batching them in a single contract call (or using an application that batches internally) can reduce the total gas overhead versus many separate transactions. Similarly, if your use case supports it, moving activity to a reputable rollup can drastically reduce end-user fees because rollups amortise Layer 1 costs across many Layer 2 transactions.
The third lever is avoiding “gas traps”: repeated failed contract calls, underestimating gas limits, or interacting with congested contracts at peak times. Failed calls still consume gas for the work performed before the revert. A careful approach—checking current fee levels, using reputable interfaces, and avoiding spammy approvals—often saves more money than any exotic fee trick.
Bitcoin fees are a market for block space measured largely by transaction size. Miners generally select transactions that pay the highest fee rate, commonly expressed in satoshis per virtual byte (sat/vB). When the mempool is crowded, low fee-rate transactions can sit for hours or longer because higher-paying transactions keep jumping the queue.
Unlike gas-based networks, Bitcoin does not price “compute” in the same way; the key driver is how large your transaction is and how urgently you want it confirmed. This is why wallet hygiene matters: if you previously received many small UTXOs, spending them together creates a large transaction and you effectively pay for all that accumulated “dust” when fees are high.
Most modern wallets estimate fees using current mempool conditions and recent blocks, then present targets like “next block”, “within 30 minutes”, “within a few hours”. The important point is that these are probabilities, not guarantees. If the fee environment shifts suddenly, a fee that looked fine five minutes ago may become uncompetitive.
The best lever is choosing the right fee rate for your real urgency. If you do not need immediate confirmation, selecting a slower target can cut cost materially. Another practical lever is timing: broadcasting when the mempool is lighter often reduces the fee rate required for the same confirmation window.
If you do get stuck, Bitcoin offers two widely-used mechanisms. Replace-By-Fee (RBF) lets you re-broadcast the same transaction with a higher fee, effectively “bumping” it. Child-Pays-For-Parent (CPFP) lets you spend an unconfirmed output in a new transaction with a high fee, incentivising miners to include both together. The exact availability depends on wallet support and how the original transaction was created.
For longer-term savings, consider UTXO management. Consolidating small UTXOs into a single larger one when fees are low can reduce the size (and cost) of future spends when fees spike. This is not glamorous, but it’s one of the most reliable ways to control Bitcoin fee exposure over time.

Some high-throughput networks price transactions differently from Ethereum and Bitcoin. On Solana, for example, fees include a base component and can include priority fees that help your transaction land faster during congestion. A major concept is compute units: transactions that do more work require more compute, and heavy transactions may need explicit compute budgeting to succeed reliably.
This changes the optimisation mindset. It’s not only “how much do I pay”, but also “how much compute do I request” and “how do I avoid wasting compute with failed simulations”. Many developer tools and wallets estimate priority fees dynamically based on recent network conditions, then apply only what’s needed for a chosen speed level.
In 2026, the most practical take-away is that congestion management often lives at the application layer: smart clients simulate first, set realistic compute budgets, and add a priority fee only when competing transactions are likely to crowd the same slots.
For everyday users, the simplest lever is allowing your wallet to use dynamic priority fee estimation and not forcing “max speed” when it’s unnecessary. If your wallet offers fee presets, treat them as a trade-off: faster confirmation costs more, and during calm periods the difference between “normal” and “fast” can be negligible.
For builders, the best lever is transaction efficiency: reduce compute where possible, avoid redundant account reads/writes, and split heavy workflows into multiple steps when that improves success rates. Failed transactions are expensive in a different way: not always in absolute fees, but in user friction and repeated retries that add cost over time.
Finally, during hot periods (popular mints, volatile markets), priority fees behave like a micro-auction. Setting a priority fee slightly above recent medians can be more cost-effective than blindly overbidding. The goal is not “pay the most”, but “pay just enough to match your latency requirement”.