BTC 交易输出的粉尘限制

对不同类型的交易输出,它们的粉尘限制(dust threshold)分别是:

  • P2PKH,546 聪(satoshi)
  • P2SH,540 聪
  • P2WPKH,294 聪
  • P2WSH,330 聪
  • P2TR,330 聪

根据定义,交易输出的 satoshis 不能少于使用 dustRelayFee 计算出的(创建和)花费这个输出时所需的矿工费。

一个 P2PKH 输出,大小为 34 字节。

   8      +      1      +      25      =      34
satoshis     scirptLen     lockingScript
                               |
 OP_DUP(1) OP_HASH160(1) OP_PUSH(1) [pubKeyHash](20) OP_EQUALVERIFY(1) OP_CHECKSIG(1)

花费掉它的输入,大小为 148 字节。

   32      +       4        +    1    +        107        +   4   =   148
prevTxid   prevOutputIndex   scriptLen   unlockingScript  sequence
                                                |
                  OP_PUSH(1) [pubKey](33) OP_PUSH(1) [DER and SIGHASH flag](72)
                                                            \  483045...01

节点中计算 dust 的函数是 GetDustThreshold,逻辑非常简单:

  1. 计算输出的大小,size_t nSize = GetSerializeSize(txout)
  2. 判断输出是不是 witness,因为这会影响解锁脚本的 vSize 是 107 还是 107 / WITNESS_SCALE_FACTOR,注意这里是整数除法
  3. 在 nSize 上加上输入的大小,148 或 67
  4. 用最终的 nSize 和传入的 dustRelayFeeIn 计算 dust,注意这里的 GetFee 方法使用的是 ceil 取整。

注意到代码注释,对于解锁 P2TR 等脚本时可能有更小输入的情况,不做特别考虑。

// Note this computation is for spending a Segwit v0 P2WPKH output (a 33 bytes
// public key + an ECDSA signature). For Segwit v1 Taproot outputs the minimum
// satisfaction is lower (a single BIP340 signature) but this computation was
// kept to not further reduce the dust level.

所以 dust 的计算结果只会被三个因素影响:

  • 输出的大小
  • 输出是不是 witness
  • dustRelayFee,默认值是 3000 sat/kvB
输出类型 输出大小 witness 输入大小 nSize dust
P2PKH 34 148 182 546
P2SH 8 + 1 + 23 = 32 148 180 540
P2WPKH 8 + 1 + 22 = 31 67 98 294
P2WSH 8 + 1 + 34 = 43 67 110 330
P2TR 8 + 1 + 34 = 43 67 110 330

参考