术语表 /隐私与安全
粉尘限额
又称粉尘阈值、Dust limit。
- 粉尘限额是什么?
- 粉尘限额是指一笔比特币输出在节点拒绝转发创建该输出的交易之前所能持有的最小金额,目前对传统地址为546聪。
节点会丢弃创建的输出过小、不值得花费的交易,以免网络被无法花费的零碎输出填满。Bitcoin Core 按未来花费该输出所需虚拟字节数,以每虚拟字节三聪的费率来确定这一限额:支付到公钥哈希(pay-to-public-key-hash)输出为546聪,原生 SegWit 为294聪,Taproot 为330聪。如果钱包拒绝发送某个金额,通常就是这条规则的缘故。
运作方式
Bitcoin Core 对每一笔输出分别适用粉尘限额,并且只问一个问题:日后花费这笔输出的成本,是否会超过该输出本身的价值?
计算位于 src/policy/policy.cpp 中的 GetDustThreshold。节点把输出在账本中所占的大小,加上最终花费它的输入的大小,再乘以 DUST_RELAY_TX_FEE,这是一个策略常量,为每千虚拟字节3,000聪,即3 sat/vB。以下按三种常见的脚本类型逐一计算:
- 支付到公钥哈希输出为34字节,花费它需要148虚拟字节,因此182虚拟字节按3 sat/vB 计算得出546聪。
- 原生 SegWit 输出(bech32,以
bc1q开头)为31字节,其输入经折算约为67虚拟字节,合计98虚拟字节,得出294聪。 - Taproot 输出(
bc1p)为43字节,输入折算后相同,合计110虚拟字节,得出330聪。
有两点需要注意。第一,这是转发策略,不是共识规则:矿工如果通过带外渠道收到含粉尘的交易,可以将其打入区块,所有节点都会接受该区块。第二,OP_RETURN 输出不受此限,因为它们可证明无法花费,也就没有需要支付的未来输入。
此外,这一阈值始终不变,而手续费市场却在变动。在200 sat/vB 的高峰期,花费同一笔传统输出大约需要29,600聪,因此远在网络将其视为粉尘之前,它在经济上就已经没有价值。
在哪里会遇到它
粉尘限额通常以错误提示的形式出现,几乎不会作为一个概念被提及。
钱包会将其表述为 "amount below dust threshold"、"output too small",或者直接将发送按钮置灰。Bitcoin Core 和大多数钱包软件还会对找零悄悄应用该规则:如果一笔付款的剩余金额会低于阈值,钱包就会丢弃找零输出,把这部分价值作为额外手续费交给矿工,而不是创建一个无人能花费的输出。
交易所的门槛本来就远高于该限额。其提币最低额由自身处理请求的成本决定,而不是由策略决定,因此您会在远未触及546聪之前,先碰到0.0001 BTC 或10美元的下限。
闪电网络有自己的版本。每个通道会协商一个 dust_limit_satoshis 值,BOLT 2要求使用锚点输出(anchor outputs)的通道至少为354聪。任何低于该限额的付款都不会在承诺交易中获得输出:如果通道在此类付款处理期间被强制关闭,这笔金额会作为手续费归矿工所有。
粉尘限额 vs 粉尘
粉尘是一枚币,粉尘限额是关于币的一条规则。日常用法中,粉尘指按当前手续费计算不值得花费的任何过小输出,这条界线每次内存池拥堵时都会移动。而粉尘限额是一个固定的策略常量,完全不会变动。这一差距正是您持有一笔网络曾顺利转发的输出,却仍发现花费它不划算的原因。
粉尘限额 vs 最低转发手续费
最低转发手续费是对整笔交易的下限,默认为每千虚拟字节1,000聪,即1 sat/vB。粉尘限额是对单笔输出的下限,并特意采用更高的3 sat/vB 费率,这样输出只有在条件略差于创建时仍可花费的情况下才会被创建。一笔交易可以轻松满足转发手续费要求,却仍可能因为一笔200聪的输出未通过粉尘检查而被拒绝。