Best Bitcoin Dust Attack Detection Tools for Exchanges and Wallet Teams
Bitcoin has five dust limits, not one, from 294 to 546 satoshis by script type. We fetched every output of two recent blocks, 12,958 spendable outputs, and found zero below threshold: dust attacks send the smallest amount that will still relay, computed per recipient script type. Plus what a real 20 address spray cost (1,125 satoshis), why Bitcoin Core release 30 made it ten times cheaper, and pricing visibility checked first-hand across four screening vendors.
By the BitcoinDatabase team
August 2026 · 9 min read
Hit Run to query the fully-indexed Bitcoin blockchain.
BTC
30-day trend
informational on-chain data · not financial advice
The short answer
The best dust attack detection tool for an exchange or wallet team is the one that applies the correct dust threshold per output script type and shows you the transaction shape, not a risk score. Bitcoin has five dust limits, from 294 to 546 satoshis, and a flat 546 rule misclassifies almost everything a SegWit wallet does near the floor. We fetched every output of two recent blocks, 12,958 spendable outputs in total, and found zero of them below threshold, because nodes refuse to relay dust. So the practical rule is the opposite of the name: a dust attack does not send dust, it sends the exact smallest amount that will still relay, computed per recipient script type.
Dust used to be a privacy problem. Somebody sprayed specks at thousands of addresses, waited for one of the recipients to consolidate that speck with real coins, and learned that both addresses belonged to the same person. Annoying, cheap to ignore if you never spent it.
That is not the shape of the problem any more. Between 17 and 24 August 2026, roughly 12,000 unsolicited small deposits arrived at Kraken from a wallet that Arkham Intelligence had labeled as belonging to HTX, an exchange under United Kingdom and European Union sanctions. Kraken automated sanctions screening did exactly what it was built to do and locked customer accounts. Those customers had done nothing except receive coins they never asked for. Access was later restored, a disputed sum stayed segregated, and HTX denies sending them at all.
Read that last sentence again, because it is the whole buying decision. The amounts and the transactions are exact, and anyone with a node can recompute them. The label that triggered the freeze is inference, and the party it names disputes it. Any tool you buy in this category is selling you both of those things bundled into one invoice, and they have wildly different reliability.
You are buying two products, and only one of them is a measurement
Split the category before you shortlist anything.
The first product is arithmetic over the chain. Which outputs are below the dust threshold, which transactions created many of them at once, where did those coins go next, was the speck ever spent alongside real funds. All of that is exact, reproducible, and cheap. Two people running the same query on the same block get the same answer or one of them has a bug.
The second product is attribution. Which cluster does the sending address belong to, is that cluster sanctioned, what is the risk score. This is inference built on address clustering and observed behavior. It is genuinely valuable and it is genuinely uncertain, and the Kraken episode is what it looks like when the uncertainty lands on a real customer.
Vendors price these together. Your engineering team should not treat them together. Build the arithmetic in house where it is verifiable, and buy attribution from someone whose name an examiner recognizes, knowing what it is.
The five dust limits, and why one number is wrong
Nearly every write-up on this topic says the Bitcoin dust limit is 546 satoshis. That was true for legacy outputs and has not been the whole story since SegWit. Bitcoin Core computes the threshold in GetDustThreshold in src/policy/policy.cpp, based on how many bytes the output plus the input that eventually spends it will occupy, multiplied by a fixed dustRelayFee of 3,000 satoshis per kilovirtualbyte.
| Script type | Dust limit | Bytes charged | Smallest output we saw |
|---|---|---|---|
| P2PKH, addresses starting 1 | 546 sat | 34 output plus 148 input | 546 sat, exactly on the floor |
| P2SH, addresses starting 3 | 540 sat | 32 output plus 148 input | 546 sat |
| P2WPKH, bc1q of 42 characters | 294 sat | 31 output plus 67 input | 309 sat |
| P2WSH, bc1q of 62 characters | 330 sat | 43 output plus 67 input | 1,596 sat |
| P2TR Taproot, bc1p addresses | 330 sat | 43 output plus 67 input | 330 sat, exactly on the floor |
| OP_RETURN and other unspendable | 0 sat | Never dust at any value | 45 percent of outputs in these blocks |
Thresholds are the Bitcoin Core defaults at a dustRelayFee of 3,000 satoshis per kilovirtualbyte. The right hand column comes from fetching every transaction of blocks 964,592 and 964,100 and taking the smallest output of each type.
Taproot is the row worth arguing about. A Taproot output can be spent with one BIP340 signature, which is smaller than the P2WPKH spend the formula assumes, so on pure arithmetic its limit should be under 330. Bitcoin Core kept the P2WPKH computation deliberately rather than lower the dust level further, a decision recorded in pull request 22779. That means 330 is a policy choice, and any tool that derives thresholds from first principles will quietly disagree with the network about Taproot and the other address types.
Nobody actually sends dust
Here is the measurement that should change how you write the rule. We fetched all 5,987 transactions of block 964,592, mined 29 August 2026 at 15:38:20 UTC, and all 5,635 transactions of block 964,100, and checked every output against the threshold for its own script type.
Zero. Out of 12,958 spendable outputs across the two blocks, not one was below its dust limit. The smallest Taproot output in either block was 330 satoshis against a 330 threshold. The smallest legacy output was 546 against a 546 threshold. Values stack up on the floor and never go under it, which is what you would expect from a rule that default nodes enforce by refusing to relay.
So a detection rule written as value below threshold will fire on essentially nothing. The real signal is a transaction that produces many outputs sitting exactly at their thresholds, sent to addresses with no relationship to each other.
What a real spray looks like on chain
On 28 August 2026 at 23:13:55 UTC, transaction ad3501200064d4ae96b13c77c668777f88fc40baad065c49a0b5cca3981674bb spent 21 native SegWit inputs into 21 outputs. Twenty were poison and one was change.
The amounts are the giveaway: 546 satoshis to three legacy addresses, 540 to five P2SH addresses, and 330 to twelve SegWit script hash addresses. Those are not round numbers somebody liked. They are the exact Bitcoin Core threshold for each recipient script type, computed per output. Whoever built this reads policy.cpp more carefully than most compliance tooling does.
Two of the twenty went to cold addresses carried on widely published exchange reserve lists. That has a second order effect worth knowing about: a reserve dashboard that counts transactions or active addresses rather than value now reports those cold wallets as active, five times in five days, when zero satoshis of consequence moved.
Why this got cheap in the last year
That transaction paid 1,125 satoshis in total fees at 0.52 satoshis per virtual byte. Twenty addresses poisoned for about 56 satoshis each.
It would not have relayed a year ago. Bitcoin Core carried a default minimum relay feerate of 1,000 satoshis per kilovirtualbyte, or 1 satoshi per virtual byte, and 0.52 is under that floor. Release 30 cut the default to 100. The dust feerate that sets the thresholds was deliberately left at 3,000, so the constraint on how small an output can be held firm while the constraint on how cheaply you can broadcast dropped by a factor of ten. Spraying got roughly ten times cheaper. Dust did not get smaller.
If your last review of dust volumes predates that change, redo it. The economics moved underneath the assumption.
The vendor landscape, honestly
We checked pricing pages first-hand on 29 August 2026.
| Tool | What it gives you | Pricing visibility | Best for |
|---|---|---|---|
| Chainalysis | Entity attribution, sanctions screening, investigations | No pricing page, /pricing returns 404, demo request only | Regulated venues needing a name examiners already accept |
| Elliptic | Wallet screening and risk scoring | No pricing page, /pricing returns 404, demo request only | Compliance teams that want a scored verdict per address |
| TRM Labs | Screening plus investigation tooling | No pricing page, /pricing returns 404, demo request only | Teams standardizing on one investigations suite |
| Public explorers | Raw transactions and outputs, free | Free, undisclosed rate limits, HTTP 429 on excess | Ad hoc checks, not production pipelines |
| BitcoinDatabase | Every output with value and script type, in SQL and REST | Published usage-based plans, no free plan | Teams writing their own dust and spray rules |
Where the screening vendors genuinely beat us: attribution. They employ people who do nothing but map clusters to real entities, and we do not do that at all. If your obligation is to screen deposits against sanctions lists, you need one of them, and the honest reading of the Kraken episode is that their labels are useful and fallible at the same time. Mapping that obligation to a specific control you can evidence is its own discipline, and teams running formal programs usually want software that tracks obligations and maps them to controls rather than a spreadsheet.
Where we beat them: you can see the arithmetic. Every output row carries its value and its script type, so the threshold logic is yours to write and audit, and a finding you produce can be handed to anyone with a node to verify independently. That is the difference between an alert you can explain to a regulator and an alert you can only escalate.
What to check before you buy
Ask a shortlisted vendor to run these against a block you choose:
Does it use the per script type threshold or a flat 546? A flat rule over-flags SegWit change and misses nothing useful. This one question separates tools built on Bitcoin policy from tools built on a blog post.
Can it group by transaction? Single small outputs are noise. Twenty near-threshold outputs from one transaction to unrelated addresses is the actual event. If the product only scores addresses, it cannot see the shape.
Does it exclude unspendable outputs? OP_RETURN outputs have a threshold of zero and are never dust. In the two blocks we measured they were about 45 percent of all outputs, so a scanner that does not filter them is discarding half its input or, worse, counting it.
Can you see the address list behind a label? Usually the answer is no, and that is the risk the Kraken customers absorbed. At minimum, know whether you can.
Can you reproduce a finding without the vendor? If an alert cannot be recomputed from raw chain data, you cannot defend it, and you cannot tell a false positive from a real one.
Questions we get asked
How do I detect a dusting attack? Group outputs by transaction, count how many sit at or barely above the dust threshold for their own script type, and flag transactions sending many of those to unrelated addresses. Value alone will not work, because outputs below threshold do not relay and therefore effectively do not exist on chain.
Is a dusting attack dangerous? Receiving dust cannot move your coins or expose your keys, so the direct risk is zero. The indirect risks are real: spending it links your addresses for whoever sent it, and if the sender carries a sanctions label your exchange may freeze the deposit while screening reviews it.
What is the bitcoin dust limit in satoshis? There are five. 546 for legacy P2PKH, 540 for P2SH, 294 for native SegWit P2WPKH, and 330 for P2WSH and Taproot, at the Bitcoin Core default dustRelayFee of 3,000 satoshis per kilovirtualbyte. Unspendable outputs such as OP_RETURN have a threshold of zero.
Does the dust limit change when fees are high? No. It is set by a fixed dustRelayFee constant, not by market fee rates and not by the minimum relay fee. Bitcoin Core release 30 cut the default minimum relay feerate by 90 percent and left the dust feerate untouched.
Should I consolidate dust to clean it up? Consolidating is exactly what the sender is waiting for, because it proves the addresses share an owner. Leaving it alone costs nothing. If you must clear it, spend it on its own rather than mixed with unrelated funds.
Where to start
If you are building this in house, the shortest path is to query outputs directly with their script types and write the threshold rule yourself, which is what Bitcoin dust attack detection and dust limit data is built for. Teams already running a screening pipeline usually pair it with crypto AML data for the deposit side and transaction tracing for the follow-the-coins question after an alert fires. The same script type detail that makes dust rules correct is the detail most address APIs do not return at all, which is worth checking before you assume your current provider can do this.
BitcoinDatabase provides informational on-chain data and analytics. It is not legal, compliance, investment or trading advice, and nothing here is a determination about any person or entity.
Query the Bitcoin blockchain yourself
Pull balances, UTXOs, transactions, on-chain metrics and fund flows from the fully indexed Bitcoin blockchain by REST API, SQL and dashboards. Indexed since 2009, new blocks within seconds, no node to run.