粉尘交易的定义与处理

什么是粉尘交易?

什么是粉尘交易,或者说粉尘交易的定义是什么,对于开发者来还是比较重要的。钱包或者交易所等基础设施,如果一不小心构造出一个粉尘交易,是无法广播到网络,被矿工打包的,这样会严重影响到用户体验。另外一方面,粉尘交易也和区块链网络安全息息相关,如果如果网络中充斥着一些微不足道的交易,而矿工们毫无差别地打包交易,那么这些价值小,但是总体体积很大的交易,就会阻碍到其它正常交易的打包确认。粉尘交易也可以看成是区块链网络上DDOS攻击的一种,攻击者通过发送许多这样小金额的交易,来堵塞整个网络。

那么有没有确切的标准来判定一笔交易是不是“粉尘交易”呢?答案是有的。

通过一番搜寻,得到一个普遍的答案:

1
2
3
4
5
6
7
8
9
10
11
12

/**
* "Dust" is defined in terms of CTransaction::minRelayTxFee, which has
* units satoshis-per-kilobyte. If you'd pay more than 1/3 in fees to
* spend something, then we consider it dust. A typical spendable
* non-segwit txout is 34 bytes big, and will need a CTxIn of at least
* 148 bytes to spend: so dust is a spendable txout less than
* 546*minRelayTxFee/1000 (in satoshis). A typical spendable segwit
* txout is 31 bytes big, and will need a CTxIn of at least 67 bytes to
* spend: so dust is a spendable txout less than 294*minRelayTxFee/1000
* (in satoshis).
*/

也就是说,在比特币的网络中,如果交易费用高于1/3的交易价值,则被视为粉尘交易,说完了。

常规的来说,一个P2PKH交易,由于其最小体积时为一个输入,一个输出,总共 148 + 34 = 182 字节,而交易手续费是由每个节点配置的minRelayTxFee(比特币中默认为0.00001BTC/KB)决定的,故而手续费就是 182 / 1000 * minRelayTxFee,那么其的3倍即 546 / 1000 * minRelayTxFee,也即默认为 0.00000546 BTC,在BCH网络上也是一样的。

其它类型的交易以此类推,交易中输出金额有低于 体积 * 3 / 1000 * minRelayTxFee 的,即为粉尘交易。

我在BCH的网络上亲自试验了一番,对于P2PKH交易果真是如此,大于等于0.00000546的交易可以发出,而小于0.00000546的交易,则无法发出。

如何避免粉尘交易

既然知道了粉尘交易的定义,那么我们就可以按照定义,避免构造出粉尘交易了。首先,可以在构造交易的过程中,根据交易的类型,计算出交易的最低金额,同时对每个输出进行判断,如果低于该金额,则不能继续构造该笔交易。特别的,如果这个输出刚好发生在找零上,且金额对于你来说不太大,则可以通过舍弃该部分的粉尘输出,以充作交易手续费来避免构造出粉尘交易。

发展中的问题

如果一个区块能够容纳的交易数量越来越多,币也变得越来越值钱,即使是1聪也值很多钱,则这个规则有可能被改变。不过,现在的定义非常巧妙,足以支持到足够久远的未来,定义的公式中,所用到的 minRelayTxFee 是由节点决定的,而节点可以将这个值设置的更低,以容纳更低手续费的交易,但是这必须要得到网络中其它成员的认可,才能保证该交易被其它矿工打包。具有交易加速器的矿池,其实就是将这个值设置得足够低,才能打包那些不被网络确认的交易,从而提高交易的虚拟手续费,通过插队的方式,完成确认。如果要在网络中达成一致地修改配置,最好是通过一次硬分叉,大家统一修改,算是对共识的升级。