https://aaron67.cc/2020/10/28/bitcoin-sv-dust/
在第一届“打点创新营”上,我分享了有关 546 的故事。
对 Bitcoin SV 交易的非 OP_RETURN 输出,如果其金额小于 546 聪,则该交易是粉尘交易(dust),不会被网络接受。
从 1.0.5 版本的节点开始,这个限制将变成 135 聪。
回顾
之前的文章中提到,交易输出的 dust 阈值由函数
GetDustThreshold
计算。
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v0.2.1/src/policy/policy.cpp#L103
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v0.2.1/src/primitives/transaction.h#L178

根据定义,如果花费一个 UTXO 时需要支付的手续费超过了这个 UTXO 面值的 1/3,那么这个 UTXO 是 dust,生成该 UTXO 的交易不会被网络接受。
请注意调用
IsDust
时的实参
dustRelayFee
,找一下变量定义。
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v0.2.1/src/policy/policy.cpp#L158
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v0.2.1/src/policy/policy.h#L83
花费一笔 P2PKH 的输出需要 182 字节,包括 148 字节的输入和 34 字节的输出。传入的费率是
dustRelayFee
,由
DUST_RELAY_TX_FEE
的值初始化为 1 聪/字节。所以最终计算出的 dust 阈值是 546 聪。
dustThreshold = 3 * minRelayFee.GetFee(nSize) = 3 * int(1000 * 182 / 1000) = 546
现状
创世纪升级调整了全网的默认交易费率。
- 默认的最小交易打包费率
降为 0.5 聪/字节DEFAULT_BLOCK_MIN_TX_FEE
- 默认的最小交易传播费率
降为 0.25 聪/字节DEFAULT_MIN_RELAY_TX_FEE
但
DUST_RELAY_TX_FEE
当时并未调整,仍为 1 聪/字节。这会造成困扰,因为从函数定义和变量命名来看,dust 阈值跟最小交易传播费率有关。
查看 1.0.5 版本的提交记录,能找到今年 5 月的一次更新。
新代码并未修改 dust 的计算逻辑,只是将
DUST_RELAY_TX_FEE
调整为 0.25 聪/字节,与默认的最小交易传播费率保持一致。
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v1.0.5/src/policy/policy.cpp#L166
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v1.0.5/src/policy/policy.cpp#L252
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v1.0.5/src/policy/policy.h#L107
- https://github.com/bitcoin-sv/bitcoin-sv/blob/v1.0.5/src/primitives/transaction.h#L188
所以从 1.0.5 版本开始,dust 将降为 135 聪。
dustThreshold = 3 * minRelayFee.GetFee(nSize) = 3 * int(250 * 182 / 1000) = 135
验证
构造交易包含一个 135 聪的输出,在 WoC 上可以广播成功。
构造交易包含一个 134 聪的输出,广播失败。
原始交易为
0100000001477a5b512c95704c0a8d652b2bce4e4b170bbf2a53d59543e22489d640914f8e000000006a473044022007cda4515046d56836dd704ddc5b9ef766a4a648aa09d90916ad6872421e0d8d022072424611f754b362d1af04e60b7302e89c88ff6c14a72654125d52cc6573221541210272da37fa8c7873db2e57ade507525737f8f67ba3e7a61c7667e27a4cd9c743c7feffffff0286000000000000001976a9144b267d063a80f3e4ae65149c7c80107a5d4f3ce688ac42110000000000001976a914570abc2c148eefccd119fbb2eccf82c3e55280e088ac640c0a00
验证结果符合预期。