先回忆一下 UTXO 的基本形状
比特币余额不是一个可以任意切分的数字,而是一组“未花费输出”(UTXO)的集合。花多少钱,钱包就得从手头这些输出里挑出总和够付的组合,就像用固定面额的现金付款:钱包里没有“刷卡找零”的机制,必须自己凑。想了解 UTXO 与账户模型的根本区别,可先读UTXO是什么?和账户模型区别。
一次转账时钱包实际做了什么
假设你要支付 0.3 BTC,手头有 0.2、0.15、0.5 三笔 UTXO。钱包的“选币”(coin selection)模块要在它们之间做决定:选 0.2 + 0.15,多出的 0.05 减去手续费后作为找零,发到一个新的找零地址;或者只选 0.5,找零更多。两种方案手续费不同、对钱包的长期影响也不同,所以选币不是随便挑,而是有算法目标的。
输入越多,交易体积越大,手续费越高——这是选币的短期成本;但选进来的每一笔 UTXO 都会被“合并消费”,从此在链上永久绑定在一起,影响隐私——这是长期成本。钱包还要考虑找零输出本身的费用,以及是否会产生低于粉尘标准的零碎输出。
Branch and Bound:优先“不找零”的选法
Bitcoin Core 钱包会先尝试 Branch and Bound(BnB)算法。这个算法由 Murch 在其 2016 年的论文中提出,目标是找出一组输入,其总额恰好落在“支付目标”到“支付目标 + 找零成本”之间——也就是刚好不需要找零输出。不需要找零,意味着钱包的 UTXO 数量不再增长,长期来看省下了未来花费这些碎钱的成本。
BnB 用深度优先搜索遍历输入组合,用一个“浪费度”(waste)指标衡量每个候选:在目标之上的超额部分,加上按当前费率与长期预期费率之差估算的输入消耗成本。搜索有尝试次数上限,一旦找到落在目标区间内、浪费度更低的组合就记录下来;若搜遍也没有,就回退到传统的背包式选择,正常产生找零。这段逻辑可以在 Bitcoin Core 的 coinselection.cpp 源码里直接读到。
找零地址不是“别人的地址”
很多新手看到交易里出现一个自己从没见过的地址会慌。要点是:
- 现代 HD 钱包会把找零发到自己的下一个内部地址,这个地址属于同一套助记词派生,钱仍然是你的。
- 找零进入新地址是隐私优化:同一地址反复进出更容易被链上聚类分析。UTXO 与找零的隐私风险可看比特币UTXO是什么?找零地址风险。
- 判断归属最简单的方法是在自己的钱包里核对该交易:属于你钱包的净流入等于“支付给你的部分 + 找零 − 你支出的部分”。
粉尘 UTXO 与“攒碎钱”的代价
高频小额收款的钱包(比如接受打赏的地址)会积累大量微小 UTXO。这些“粉尘”单个看价值很低,但合并花费时要为每个输入支付手续费,费率一高,可能连本带利都划不来;它们也会把不同时间收到的钱在链上关联起来。管理建议:
- 收款用 HD 钱包自动轮换地址,避免同址复用带来的聚类,参见listaddressgroupings为何会归组?。
- 低费率窗口期主动合并碎 UTXO——在 Wallet 控制台的“Coins Control”里勾选多笔一起花,或在确认数要求宽松时做一笔整理交易。
- 用
listunspent定期清点钱包的 UTXO 数量和大小分布,操作思路见listunspent怎样筛安全UTXO?。 - 不要养成“多个小额输入凑一笔”的习惯,除非当下 BnB 能找到无找零组合。
小结
找零地址和“从哪几笔钱里扣”都是选币算法的输出:短期看手续费,长期看 UTXO 数量与隐私。理解“凑整钱、少找零、避免粉尘堆积”这三条,你就比大多数用户更清楚自己的钱在链上长什么形状。
本文内容为机制科普,不构成任何投资建议。涉及的具体参数以所用钱包版本的官方文档为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。