MASTERING-BITCOIN · Interactive Practice

Every Satoshi Has a Price: Dust Policies and Full Nodes

IKey Reference

Concept Value / Rule Description
Satoshi 1 BTC=108 sats1 \text{ BTC} = 10^8 \text{ sats} Smallest representable unit
Dust threshold (default) 546546 satoshis Outputs below are not relayed by default
Uneconomical output fee to spend>output value\text{fee to spend} > \text{output value} Output not worth ever spending
OP_RETURN data limit 8080 bytes (standard) Provably unspendable, not in UTXO set
Output anatomy amount (8 bytes)+script (variable)\text{amount (8 bytes)} + \text{script (variable)} Two components per output

Important: Dust thresholds are relay policy, not consensus rules. A miner can include a sub-dust output in a valid block — most nodes simply will not propagate the transaction.

IIInteractive Visualizations

Visualization 1: When Does an Output Become Uneconomical?

An output is uneconomical when the fee required to spend it exceeds its value. As fee rates climb, more and more low-value outputs cross from "spendable" to "permanent dead weight" in the UTXO set.

A typical input that spends a P2WPKH output costs roughly 68 virtual bytes. So the fee to spend one such output is approximately:

spend fee68fee_rate (sat/vB)\text{spend fee} \approx 68 \cdot \text{fee\_rate (sat/vB)}

Adjust the fee rate slider and the output value slider to see whether the output is economical, dust by Bitcoin Core's default rule, or uneconomical given current fees.

⚙ interactive visualization — coming to this page format soon

Notice: Push the fee rate up to 50 or 100 sat/vB. The orange "spend fee" line slides right and can easily exceed 546 sats — meaning that even outputs above Bitcoin Core's static dust threshold can become uneconomical in practice. The 546-sat default assumes a low fee environment; in a high-fee market, the effective dust threshold is much higher.

Visualization 2: How Dust Accumulates in the UTXO Set

Every full node stores the entire UTXO set. Spendable outputs eventually leave the set when their owners spend them. Uneconomical outputs never leave — they are dead weight forever.

Adjust the slider to set the fraction of created outputs that are uneconomical, then watch how the UTXO set composition evolves as time passes.

⚙ interactive visualization — coming to this page format soon

Reflect: Even a small percentage of uneconomical outputs causes a steadily growing red region — because that region never shrinks. Spendable outputs cycle through the set; uneconomical ones accumulate forever. This is precisely why Bitcoin Core blocks dust at the relay layer rather than waiting for users to "clean up" later.

Visualization 3: OP_RETURN vs. Normal Output

A normal output sits in the UTXO set until it is spent. An OP_RETURN output is provably unspendable — its script fails immediately on execution — so nodes do not add it to the UTXO set at all.

Choose how many of each output type a hypothetical batch of transactions produces and compare the long-term UTXO-set impact.

⚙ interactive visualization — coming to this page format soon

Reflect: Set OP_RETURN outputs to 1000 and normal outputs to 0. The UTXO set sees no growth at all — every byte of data is recorded in the blockchain's transaction history, but no node has to keep tracking unspendable entries. This is why setting the OP_RETURN amount to 0 satoshis is the correct, intended use: no bitcoin is destroyed and no UTXO bloat is created.

IIIQuiz Questions

Question 1

Bitcoin Core's default dust threshold is 546 satoshis. An output below this value is treated as dust by default policy.

What does this mean exactly?

Correct! Dust is a relay/standardness rule, not consensus.

Not quite. Re-read the script's emphasis: "a miner could include a 100-satoshi output in a valid block." That tells us this isn't a consensus rule.

Show solution

Solution:

The dust threshold is a relay (or "standardness") policy, not a consensus rule.

  • Consensus rules define what makes a block valid. Every node must agree.
  • Relay policies are individual choices each node makes about what transactions to gossip across the peer-to-peer network.

A transaction creating a 100-sat output is perfectly valid by consensus. But because most nodes won't relay it, it is unlikely to ever reach a miner. A miner with direct submission (or one running modified policy) can still mine it, and the resulting block is valid for everyone.

This split between consensus and policy is fundamental to Bitcoin's governance: relay rules are voluntarily enforced by node operators and can evolve without a hard fork.

Question 2

Suppose the prevailing fee rate is 30 sat/vB, and spending a single P2WPKH input costs approximately 68 vB.

A user is considering an output worth 1,500 sats. From the network's UTXO-burden perspective, which statement is most accurate?

Correct! 68 × 30 = 2,040 sats > 1,500 sats, so it is uneconomical.

Not quite. Compute the spend fee: 68 vB × 30 sat/vB. Then compare it to the output's value. The 546-sat threshold is a floor, not a guarantee of economic viability.

Show solution

Solution:

Calculate the spend fee: spend fee68 vB×30 sat/vB=2,040 sats\text{spend fee} \approx 68 \text{ vB} \times 30 \text{ sat/vB} = 2{,}040 \text{ sats}

Compare to the output value: 2,040 sats (fee)>1,500 sats (value)2{,}040 \text{ sats (fee)} > 1{,}500 \text{ sats (value)}

So this output is uneconomical: a rational user would never spend it because spending costs more than the satoshis recovered. It will sit in the UTXO set permanently, even though 1,500 sats is well above Bitcoin Core's static 546-sat threshold.

This is exactly the limitation of a fixed dust threshold: in a high-fee market, the effective dust level is much higher than 546, and many "above-dust" outputs become economic dust.

Question 3

True or False: A zero-satoshi OP_RETURN output destroys bitcoin and bloats the UTXO set, so users should avoid using it.

Correct! Zero-sat OP_RETURN outputs destroy no bitcoin and bypass the UTXO set entirely.

Not quite. OP_RETURN is provably unspendable, which is precisely why nodes can skip adding it to the UTXO set. And amount = 0 means no bitcoin is destroyed.

Show solution

Solution:

This is False — and it is one of the most common misconceptions about OP_RETURN.

  • Bitcoin destroyed? No. Setting the amount to 0 satoshis means no value is locked or destroyed. This is the intended and optimal use.
  • UTXO bloat? Also no. An OP_RETURN script fails immediately on execution, making the output provably unspendable. Because nodes can prove no one will ever spend it, they do not add it to the UTXO set in the first place.

The result: OP_RETURN lets you embed up to 80 bytes of data into the blockchain's permanent transaction history without adding any persistent storage burden to full nodes. It is the cleanest, most node-friendly way to attach data to a transaction.

Question 4

Utreexo is a proposed UTXO-set design where most nodes store only a compact cryptographic commitment (≈ 1–2 KB) instead of the full 5+ GB UTXO set.

Which statement best describes Utreexo's relationship to the dust problem?

Correct! Utreexo redistributes the burden; it does not erase it.

Not quite. Recall that bridge nodes still hold the full UTXO data so they can generate proofs for the lightweight Utreexo nodes. The data still exists somewhere — and dust still bloats it there.

Show solution

Solution:

Utreexo is a clever redistribution of where UTXO data lives, not a dissolution of the data itself.

  • Most nodes store only a small commitment (~1–2 KB), letting modest hardware participate as a full validator.
  • However, bridge nodes — especially those serving miners who need fast transaction validation — still maintain the complete UTXO dataset to generate proofs for everyone else.
  • Dust UTXOs continue to bloat the data that bridge nodes must hold, so the underlying problem persists; it has just been moved.

The script makes this point explicitly: "Utreexo redistributes the storage problem across the network. It doesn't eliminate it." This is why dust policies remain important even in a future with Utreexo deployed.

Solved: 0 / 4