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,逻辑非常简单:
- 计算输出的大小,
size_t nSize = GetSerializeSize(txout)
- 判断输出是不是 witness,因为这会影响解锁脚本的 vSize 是
107
还是107 / WITNESS_SCALE_FACTOR
,注意这里是整数除法 - 在 nSize 上加上输入的大小,148 或 67
- 用最终的 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 |