天天看点

Bitcoin SV 交易的粉尘限制回顾现状验证

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
Bitcoin SV 交易的粉尘限制回顾现状验证
Bitcoin SV 交易的粉尘限制回顾现状验证

根据定义,如果花费一个 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
Bitcoin SV 交易的粉尘限制回顾现状验证
Bitcoin SV 交易的粉尘限制回顾现状验证

花费一笔 P2PKH 的输出需要 182 字节,包括 148 字节的输入和 34 字节的输出。传入的费率是

dustRelayFee

,由

DUST_RELAY_TX_FEE

的值初始化为 1 聪/字节。所以最终计算出的 dust 阈值是 546 聪。

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

现状

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

  • 默认的最小交易打包费率

    DEFAULT_BLOCK_MIN_TX_FEE

    降为 0.5 聪/字节
  • 默认的最小交易传播费率

    DEFAULT_MIN_RELAY_TX_FEE

    降为 0.25 聪/字节

DUST_RELAY_TX_FEE

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

Bitcoin SV 交易的粉尘限制回顾现状验证

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

Bitcoin SV 交易的粉尘限制回顾现状验证

新代码并未修改 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
Bitcoin SV 交易的粉尘限制回顾现状验证
Bitcoin SV 交易的粉尘限制回顾现状验证
Bitcoin SV 交易的粉尘限制回顾现状验证
Bitcoin SV 交易的粉尘限制回顾现状验证

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

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

验证

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

Bitcoin SV 交易的粉尘限制回顾现状验证

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

Bitcoin SV 交易的粉尘限制回顾现状验证

原始交易为

0100000001477a5b512c95704c0a8d652b2bce4e4b170bbf2a53d59543e22489d640914f8e000000006a473044022007cda4515046d56836dd704ddc5b9ef766a4a648aa09d90916ad6872421e0d8d022072424611f754b362d1af04e60b7302e89c88ff6c14a72654125d52cc6573221541210272da37fa8c7873db2e57ade507525737f8f67ba3e7a61c7667e27a4cd9c743c7feffffff0286000000000000001976a9144b267d063a80f3e4ae65149c7c80107a5d4f3ce688ac42110000000000001976a914570abc2c148eefccd119fbb2eccf82c3e55280e088ac640c0a00
           

验证结果符合预期。

继续阅读