avoidpartialspends 开关:按地址归组选币的隐私收益与手续费账单 图 1
avoidpartialspends 开关:按地址归组选币的隐私收益与手续费账单 · 图 1

比特币钱包花钱时要回答一个被低估的问题:同一地址名下躺着好几笔零钱,花其中一笔时,把同主人的其余零钱一起捎上不?这个策略开关就是 -avoidpartialspends,v31.0 默认关闭(源码 wallet/coincontrol.h 里的默认常量为假),它同时牵着隐私与手续费两根绳子,值得单独拆开看。

参数帮助文本把两种模式说得很清楚:关闭时,选币算法按需挑输出,可能只动用某个地址的一笔 UTXO,把同地址其余的留在钱包里;打开时,钱包把输出按地址归组,对参与的地址”要么全花、要么不花”。帮助文本对后果的表述同样直白——隐私改善,因为地址大多被整地址清扫、找零汇聚到干净的新地址;代价是费用可能升高,因为受限于归组规则,算法可能选进比严格必要更多的输入。

为什么”部分花费”伤隐私?设想你有一个地址收了工资、收了退款,两笔进账。今天你花掉工资那笔,链上出现一笔交易:输入的金额特征让外界能推断”这个地址还有另一笔没花”——退款那笔的存在性、大致规模区间就此泄露;下一笔你花退款时,两笔消费在链上被钉成同一个主体的两段时间线。地址归组策略消灭了这种”半开抽屉”:地址一旦动用就整址清空,链上观察者最多知道你在这个时间点清了一次,无法把同一地址的多笔进账拆成独立事件追踪。

费用账同样可以具体地算。打开归组后,一笔小额支付可能背负整个地址的所有进账作为输入——输入变多,交易体积变大,绝对手续费上升;同时可能抬高找零额度,让下一笔交易更胖。帮助文本承认这一点(“可能因选币更不优而多付”),并且点出一个特例:开了 avoid_reuse 的钱包永远启用按地址归组,不给关闭余地——因为防复用标记本来就要保证”脏币不与干净币混花”,部分花费会破坏这个承诺,两者在逻辑上必须绑定。

务实的启用路径有两条。其一,全局开关写 -avoidpartialspends=1 进配置文件,重启生效,影响钱包所有自动选币。其二,借道 avoid_reuse:源码在组装选币条件时有一条按位或——“防地址复用”一旦开启,按地址归组就被强制连带打开,而 avoid_reuse 既可以在 createwallet 时设置,也可以用 setwalletflag 事后开关,send 命令的参数表也接受它并附带同样的连带说明。也就是说,想要”归组选币”又不想改启动参数,打开防复用标志即可达成,代价是 getbalances 开始区分干净币与脏币、选币时脏币被区别对待。不存在一个”只影响这一笔交易”的逐笔归组参数,想按笔控制,正确工具是 lockunspent 手动指定输入集合。对长期收款地址做物理隔离——工资、退款、商家结算分给不同地址——则是参数之外更根本的一层。

最后校准预期:这个开关治不了聚类分析的根病。分析方不需要看你某个地址的”剩余部分”,仅凭找零归属启发式与时间相关性就能拼图谱;归组只是堵住”同一地址分次曝光”这一条最便宜的漏。它与静默支付、CoinJoin 那类协议级方案处在不同层级:这是钱包在”给定地址已经暴露”的前提下尽量少吃亏的本地策略。开了它,钱包不会通知网络任何人;关了它,你的钱同样安全——这是一个纯粹的隐私-手续费权衡旋钮,安全属性上零损耗,也因此最该由用户按自己的使用画像来拨。

风险提示:参数默认值与行为以 Bitcoin Core v31.0 源码及帮助文本为准,版本升级可能调整;钱包行为差异可能导致交易结构与预期不符,本文不构成投资建议。

avoidpartialspends 开关:按地址归组选币的隐私收益与手续费账单 图 2
avoidpartialspends 开关:按地址归组选币的隐私收益与手续费账单 · 图 2