尘埃线不是常数:-dustrelayfee 怎样把输出折算成“值不值得花” 图 1
尘埃线不是常数:-dustrelayfee 怎样把输出折算成“值不值得花” · 图 1

尘埃线不是常数:-dustrelayfee 怎样用费率折算”这枚输出值不值得花”

比特币钱包在挑输出、组交易时,会先问一个问题:这枚输出将来要花它,得付多少手续费?如果”花它的成本”比”它本身的价值”还高,它就是尘埃。这条线在比特币核心里不是写死的聪数,而是一个叫 -dustrelayfee 的参数折算出来的。

一条用费率表达的红线

对照 Bitcoin Core v31.0 源码,init.cpp 里这条参数的帮助文本把语义说得很直白:用来定义尘埃的费率,指”花掉一枚输出所需要的费用将超过其自身价值”的那条线,单位是每千虚拟字节多少币。默认值取 policy/policy.h 中的 DUST_RELAY_TX_FEE,也就是每千伏字节 3000 聪——换算成常见的费率单位,相当于每虚拟字节 0.003 聪。

判定发生在 policy/policy.cpp 的 IsDust 里:节点先按脚本类型估出”将来花这枚输出要花多少字节”,再用 -dustrelayfee 的费率把这些字节折成费用,最后拿这个费用和输出自身的价值比大小。所以尘埃线天然跟着两件事漂移:输出的脚本类型,以及这条费率的取值。同一条线在旧式非隔离见证格式上大约落在 546 聪,在 P2WPKH 上大约落在 294 聪——不是两个”法定数字”,而是同一规则在两种脚本尺寸下的折算结果。

藏在帮助页的下一页

-dustrelayfee 带着 DEBUG_ONLY 旗标注册,这意味着 bitcoind -help 的常规输出里看不见它,只有跑 -help-debug 才列出来。它并不是”不重要”:解析失败时 node/mempool_args.cpp 会直接报 dustrelayfee 的金额格式错误并让节点拒绝启动相关配置;成功解析后写进内存池选项的 dust_relay_feerate 字段,供标准性检查全程使用。源码里那段注释也提醒:这个值不应该轻率改动,因为老的实现可能仍在按默认线构造交易,你一改,别人眼里的”标准交易”在你这里就变成尘埃超限。

尘埃不只看单笔,还看数量

标准性检查里还有第二道闸:IsStandardTx 会调用 GetDust 数出交易里所有尘埃输出,数量超过 MAX_DUST_OUTPUTS_PER_TX 就直接以 dust 为由拒收。换句话说,节点既管”单枚输出是否小到不值一提”,也管”一笔交易里攒了多少枚这样的小输出”,防止有人拿一堆针尖大的输出往内存池里塞垃圾。

它管什么、不管什么

要分清三层。共识层不禁止尘埃:尘埃输出照样可以进块、永久占着 UTXO 集合。-dustrelayfee 属于中继政策,决定的是这台节点肯不肯转发、肯不肯让钱包把这种输出当作正常零钱。钱包侧另有一条独立线:-discardfee 控制”零头低到多少就干脆折进手续费”,和尘埃线各管各的,别混为一谈。

运维上值得注意的场景有三个。第一,自托管钱包升级前后,如果两台节点对尘埃线理解不一致,可能出现”那边造的交易这边拒收”的怪事;第二,调试参数意味着它面向的是实验与取证,普通节点没必要动;第三,尘埃一旦上了链,就是所有人存储账本的长期负担,这也是整理碎 UTXO 的钱包工具总是把合并碎钱列为常规卫生动作的原因。

尘埃经济的三本账

把这条线放回更大的账本里看,它同时牵动三方。节点运营者一侧,尘埃判定直接决定内存池收不收:中继下限降到每虚拟字节 0.1 聪的时代,尘埃线的费率口径成了少数仍然偏高的政策值,因为它量的是”经济上值不值得花”而不是”网络肯不肯转发”。钱包一侧,选币器宁可把尘埃折进手续费也不愿新建一枚花不掉的输出,-discardfee 与尘埃线在钱包内部是两条互相配合的判据。链本身一侧,每一枚被打包的尘埃输出都是全节点永久存储账本上的钉子,这也是社区对”尘埃输出风暴”类实验始终谨慎的原因。

自查路径很轻:先跑 -help-debug 确认当前版本的参数说明与默认值;再用 getmempoolinfo 观察费率族字段;最后用一小笔刻意低于尘埃线的转账验证钱包与节点各自报什么错——三件事做完,这条看不见的线在你节点上的实际位置就清楚了。

风险提示:本文只解释节点参数与政策规则,不构成任何投资或费率设置建议;改动中继参数前请备份配置并核对你所用版本的帮助输出。