#6793 raised MinRelayTxFee to limit spamming attack which lead to crashing node. This is an effective solution, but this also changed the amount of Dust.
0CAmount GetDustThreshold(const CFeeRate &minRelayTxFee) const
1 {
2 // "Dust" is defined in terms of CTransaction::minRelayTxFee,
3 // which has units satoshis-per-kilobyte.
4 // If you'd pay more than 1/3 in fees
5 // to spend something, then we consider it dust.
6 // A typical spendable txout is 34 bytes big, and will
7 // need a CTxIn of at least 148 bytes to spend:
8 // so dust is a spendable txout less than 546 satoshis
9 // with default minRelayTxFee.
10 if (scriptPubKey.IsUnspendable())
11 return 0;
12
13 size_t nSize = GetSerializeSize(SER_DISK,0)+148u;
14 return 3*minRelayTxFee.GetFee(nSize);
15}
Such sudden change of a widely used default hurted other meta-layer protocols such as Counterparty, Omni, ChanceCoin, NewbieCoin, OA, EPOBC, Colu.
As well as wallets : if you want to send 1000 satoshi to Alice, but have a coin of 2100 satoshi. A wallet with MinTxRelayFee of 1000 will send the 1100 satoshi of change. But if you change the MinTxRelayFee abruptly to 5000 like that and I don’t update the wallet software, now, the transaction will be ignored because the change is considered Dust.
The dust rule prevents UTXO bloating by preventing the creation of TxOut whose value is lower than the cost of the ScriptSig to spend it.
There is some discussion about making a floating minRelayTxFee on #6722 which will even more complicate the task for wallets and services who will need to get this new variable from somewhere.
I am opening this issue to propose another solution : Defining Dust as a function of the Transaction Fee.
This has the advantage to not require any data which a wallet or service does not already have, and offer the best response we can get of “does this output cost more than spending it”. This can also be easily implemented and reviewed.