Bitcoin SV 交易的粉尘限制

在第一届“打点创新营”上,我分享了有关 546 的故事。

对 Bitcoin SV 交易的 P2PKH 输出,如果其金额小于 546 聪,则该交易是粉尘交易(dust),不会被网络接受。

1.0.5 版本的节点开始,这个限制将变成 135 聪。

回顾

之前的文章中提到,交易输出的 dust 阈值由函数GetDustThreshold计算。

根据定义,如果花费一个 UTXO 时需要支付的手续费超过了这个 UTXO 面值的 1/3,那么这个 UTXO 是 dust,生成该 UTXO 的交易不会被网络接受。

请注意调用IsDust时的实参dustRelayFee,找一下变量定义。

花费一笔 P2PKH 的输出需要 182 字节,包括 148 字节的输入和 34 字节的输出。传入的费率是dustRelayFee,由DUST_RELAY_TX_FEE的值初始化为 1 聪/字节。所以最终计算出的 dust 阈值是 546 聪。

dustThreshold = 3 * minRelayFee.GetFee(nSize) = 3 * int(1000 * 182 / 1000) = 546

现状

创世纪升级调整了全网的默认交易费率。

DUST_RELAY_TX_FEE当时并未调整,仍为 1 聪/字节。这会造成困扰,因为从函数定义和变量命名来看,dust 阈值跟最小交易传播费率有关。

查看 1.0.5 版本的提交记录,能找到今年 5 月的一次更新。

新代码并未修改 dust 的计算逻辑,只是将DUST_RELAY_TX_FEE调整为 0.25 聪/字节,与默认的最小交易传播费率保持一致。

所以从 1.0.5 版本开始,P2PKH 输出的 dust 将降为 135 聪。

dustThreshold = 3 * minRelayFee.GetFee(nSize) = 3 * int(250 * 182 / 1000) = 135

验证

构造交易包含一个 135 聪的输出,在 WoC 上可以广播成功。

构造交易包含一个 134 聪的输出,广播失败。

原始交易为

0100000001477a5b512c95704c0a8d652b2bce4e4b170bbf2a53d59543e22489d640914f8e000000006a473044022007cda4515046d56836dd704ddc5b9ef766a4a648aa09d90916ad6872421e0d8d022072424611f754b362d1af04e60b7302e89c88ff6c14a72654125d52cc6573221541210272da37fa8c7873db2e57ade507525737f8f67ba3e7a61c7667e27a4cd9c743c7feffffff0286000000000000001976a9144b267d063a80f3e4ae65149c7c80107a5d4f3ce688ac42110000000000001976a914570abc2c148eefccd119fbb2eccf82c3e55280e088ac640c0a00

验证结果符合预期。