一笔转账的隐藏决策
你在钱包里输入金额、点发送,链上那笔交易的输入列表却不是你指定的,而是钱包替你挑的。选币要解决的问题很具体:钱包名下可能躺着少则几十、多则上万枚未花费输出,要凑出付款金额加上手续费的资金,凑多了一个找零地址吐回来,凑少了手续费都盖不住。挑选结果直接决定三件事:这次的手续费大小、你的隐私被暴露多少、以及留下的零钱下次要花多少成本。Bitcoin Core 钱包源码把决策拆成两条路径。
第一条路:先试试不用找零
Branch and Bound 的思路来自 Murch 提出的选币研究,Core 的实现写在选币模块源码里:把每枚候选 UTXO 的净额(币值减去自身的花费成本)排进池子,在给定目标金额(目标额加一撮容差)与成本边界内做深度受限的搜索,尝试找一个子集恰好落在目标带内——不偏不倚,没有找零。找到即用,交易只有付款输出,干净利落。无找零交易的价值在费用与隐私两侧:省掉找零输出本身约三十字节的链上空间;更长远的是不留”下一代的碎币”,控制钱包长尾的健康度。源码对搜索规模有明确上限约束,池子规模超过上限后该路径直接放弃,转入第二条路;同时若候选太小、凑不出目标带,也直接弃权。钱包界面上近年出现的不产生找零的开关,底层就是给这条路放行。
第二条路:凑不出就背包
当 BnB 无解或被规模上限劝退,钱包转入背包式近似:从大到小筛掉明显过大的输出,把剩下的当作一组物品,用一个”目标金额加找零成本”的虚拟目标做近似求解,力求选出的输入总净额落在目标附近;若找不到精确解,就接受一个略超目标、由找零吸收差额的组合。为了让结果不呆板,实现会做随机化洗牌避免每次选同一批币,并对已锁定的候选做排除。两条路合起来的行为可以一句话概括:能不找零就不找零,必须找零时找一个便宜且不那么容易被聚类分析的找零。
挑币留下的可见痕迹
用户能从交易结构反推钱包性格:只有一个输出的交易通常说明走了 BnB;一个付款输出加一个找零输出,多半是背包结果;找零金额若恰好落在很小的区间,则可能是刻意做混合选币的尝试。想主动影响结果的现实手段有限但真实:在支持描述符与选币控制接口的钱包里,可以排除特定碎输入、或指定只用某些输出;日常养成合并零钱再大额支出的习惯,等于提前给算法准备更好的候选池。还有一条与隐私直接相关的常识:每一次找零都宣告”这些输入同属一人”,聚类分析的原料就是这么攒下来的,所以”能否避免找零”从来不只是手续费问题。选币没有好坏,只有取舍——把它当成钱包替你做的一个可以被理解的决策,而不是黑箱。
从交易结构反推与主动控制
想把选币从被动变主动,现实路径有两条。第一条是把钱包的零钱结构养好:长期只收小额打款又从不合并的钱包,候选池里全是高成本的碎币,任何算法都被迫拼出又长又贵的输入列表;每隔一段在费率低谷做一次有计划的合并,本质是在给未来的选币算法降本。第二条是使用提供描述符与选币控制接口的钱包与节点组合,付款前显式排除污染来源的输入或圈定使用范围——能力越大责任越重,手工指定的输入若恰好落在尚未满成熟期的 coinbase 奖励输出上,钱包会直接拒绝花费,广播根本发不出去。理解 BnB 与背包的边界后,日常用户最实用的心态是:把选币质量当成钱包健康度的体检指标,而不是一次次事后懊悔的单笔得失。
风险提示:本文内容仅为技术说明,不构成任何投资建议;涉及资产操作请自行核验当前版本行为与官方文档。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。