Coin Selection 是钱包为交易输出和手续费选择 UTXO 的过程。这是本地决策,并非要求所有钱包采用同一算法的共识规则。
每个输入都会完整花费某个特定 UTXO。输入总额与输出总额之差就是手续费;退还发送方的金额必须形成独立输出。示例中,输入为 100000 sat、支付为 60000 sat、手续费为 1000 sat,则找零为 39000 sat。 [Bitcoin Developer Guide — Transactions]
仅看面值并不够:增加输入会增大交易。有效价值从 UTXO 中扣除按所选费率花费它的成本。假设一个 10000 sat 的输入估计占 68 vB,费率为 10 sat/vB,则其贡献为 9320 sat;交易其余部分仍需要自己的手续费。实际大小取决于脚本和签名。 [Bitcoin Core — Coin selection implementation] [Bitcoin Core 29.0 — Transaction creation]
Branch-and-bound(BnB)搜索可实现无找零支付的输入组合。目标区间允许不超过创建找零并在将来花费它的成本的余量;余量计入手续费。因此并非必须精确匹配。受限搜索可能找不到解,也可能找不到全局最优解。 [Bitcoin Core — Coin selection implementation]
Bitcoin Core 29.0 考虑 BnB、Knapsack 和 Single Random Draw(SRD);有效费率高于长期费率三倍时,CoinGrinder 也参与。候选方案以 waste metric 比较。从输出中扣除手续费时会跳过 BnB。这描述的是特定版本,并非所有钱包通用的算法顺序。 [Bitcoin Core 29.0 — Transaction creation]
Waste metric 比较输入在当前费率和长期费率下的花费成本,并计入找零成本或作为手续费付出的余量。长期费率是一项假设,而非预测。合并可以减少未来输入的数量,但今天要付手续费,并会关联所用输出;因此最低即时手续费并非唯一目标。 [Bitcoin Core — Coin selection implementation] [Bitcoin Design — Coin selection and privacy]
共同花费不同收入为分析者提供了关联线索,并不能证明属于同一人。Coin Control 与标签有助于区分支付情境。BIP 329 描述标签和可花费性元数据的转移;它本身不选择币,导出文件也可能暴露敏感关联。即使没有找零,也不保证匿名。 [BIP 329 — Wallet Labels Export Format] [Bitcoin Design — Coin selection and privacy]
选择必须考虑可花费性、确认、锁定输出和交易限制。在 Core 29.0 的 walletcreatefundedpsbt RPC 中,include_unsafe 还允许有风险的未确认输入;如果其交易消失,所构建的支付可能无效。未确认祖先还可能需要额外手续费。余额高本身不保证有合适的输入组合。 [Bitcoin Core 29.0 — Transaction creation] [Bitcoin Core 29.0 — walletcreatefundedpsbt RPC]
在 Core 29.0 的 walletcreatefundedpsbt 中,可通过 txid 和 vout 指定输入;add_inputs 控制是否添加其他输入。fee_rate 使用 sat/vB,而 feeRate 使用 BTC/kvB。生成的 PSBT 是后续处理的准备,并非已确认支付。签名前应检查收款方、总手续费及自己的找零;手动选择不会免除这些责任。 [Bitcoin Core 29.0 — walletcreatefundedpsbt RPC]
要获得更完整的理解,请将本词条与以下词条结合阅读: UTXO, Coin Control, 找零输出, Fee Rate, PSBT, Bitcoin 隐私. 反向关联还来自: Watch-only Wallet, 找零输出.