找零去哪了:discardfee 怎样把不值钱的零头折进手续费 图 1
找零去哪了:discardfee 怎样把不值钱的零头折进手续费 · 图 1

钱包交易里偶尔会出现一种现象:收款金额凑够了,找零输出却不见了,多出来的那点价值直接进了手续费。做出这个决定的是 discardfee 参数。它的帮助文本值得完整读:The fee rate (in BTC/kvB) that indicates your tolerance for discarding change by adding it to the fee,随后还有一句限定——An output is discarded if it is dust at this rate, but we will always discard up to the dust relay fee and a discard fee above that is limited by the fee estimate for the longest target。

先解释”找零并费”这个动作本身。设你付 0.50 枚,钱包选了总值 0.5003 的输出,理论上该找还 0.0003。但创建并将来花掉这个找零输出本身要成本:输出要进 UTXO 集、未来要花它还得付输入费用。当这笔”找零的未来成本”高过找零金额本身时,留着它反而浪费,钱包于是把它折进手续费,交易少一个输出、体积更小。discardfee 设定的就是这个”划不划算”判断里的汇率基准:钱包按该费率折算找零的输出成本,低于找零面额才保留、否则并入费用。

按 v31.0 源码,DEFAULT_DISCARD_FEE 为 10000(每千虚拟字节聪计),折算即每虚拟字节 10 聪量级。帮助文本那句限定还包含两层含义:第一,即便你把容忍线调得比尘埃中继费率(每千虚拟字节 3000 聪、即 3 聪每虚拟字节量级的协议尘埃线)还低,钱包仍会丢弃低于协议尘埃线的输出——这条底线不由你控制;第二,把容忍线调高也高不过”最慢确认目标的费率估计”,防止在拥堵期为省一个输出反而错过一切确认窗口。默认值与这两层限定的组合,让大多数用户永远感知不到它的存在。

参数生效的场景并不常见却影响很深:尘埃攻击后、大额高频小额进出的钱包、以及长期只进不出的收款池,都会出现大量接近尘埃线的小找零。这时 discardfee 的实际效果是:在费率洼地正常找零,在费率高峰把不值钱的找零直接烧进费用,从整条生命周期看反而降低了总成本。理解这一点,就不会把某笔交易”找零去哪了”当成被盗警报——先看交易输出结构与当时的费率水平,再下结论。

常见误区两个。一是把它当总手续费上限:它不控制你为一笔交易付多少费,那是费率估计与 txconfirmtargetmaxtxfee 等参数的事;它只管”零头值不值得留”。二是把它与协议尘埃规则混为一谈:尘埃规则是全网中继与标准性门槛,写在共识策略层;discardfee 只是你钱包在门槛之上的个人容忍线,两者的调整渠道、生效范围完全不同。

实操建议:普通用户保持默认;确有大量小额 UTXO 整理需求的人,配合低费率的合并计划比反复调这个参数更有效。任何调整前先做一次小额收支试验,观察找零行为与账单变化,确认理解无误再用到主钱包上。本文数字对应 v31.0 源码。

把它放进一个更完整的费用决策链里看,位置会更清楚。钱包发一笔钱,先由费率估计决定”目标确认窗口按什么费率出价”,再由选币策略决定”用哪些未花费输出”,最后轮到丢弃费决定”零头留不留”。三层各自有默认取向,绝大多数冲突早在设计时被”保守优先”的原则消解:费率估计不足时回退到后备费率(默认关闭,设为零即彻底禁用该特性,这是帮助文本给出的另一种形态),选币超限时放弃而不是硬造大交易,零头只在便宜到尘埃量级附近时才烧。理解这条链,你就不会在拥堵时段把某笔”看起来费用怪怪的”交易归咎于单一参数。

最后给一条验收习惯:任何钱包参数改动后,先发一笔极小额试验交易,检查三件事——交易输出结构是否符合预期、账单与费率的乘积对不对得上、找零去向是否可解释。三项都可解释,再回到正常额度。参数文档看一百遍,不如一次小额试验带来的理解扎实;这也是自托管世界里所有”设置前小测”建议的共同逻辑。顺带留意,钱包的图形界面与 RPC 底层可能把同一个开关呈现成不同名字,对照文档建立一次映射表,之后排障就再也不用猜。

风险提示:找零并入手续费会产生不可逆的额外支出;文中费率为源码默认值示例,非实时市场费率。本文不构成投资建议。