把一口袋碎钱并成一笔:BIP-131 合并交易与通配输入 图 1
把一口袋碎钱并成一笔:BIP-131 合并交易与通配输入 · 图 1

碎钱为什么难花

比特币的钱是一条条未花费输出(UTXO)。一个挂着公开收款地址的店铺,账上可能躺着几百笔几毛钱的入账,每笔都要在自己的输入里重复一次签名和脚本。想合并它们,得先花一大笔手续费逐个举牌。提案把后果推到系统层面:碎输出花不动,UTXO 集合只涨不消,全节点被迫永久背着一本越背越重的活期账本——这是 2015 年扩容争论里”UTXO 膨胀”论调的标准版本。

BIP-131 的机关:一个版本号位加通配输入

作者 Chris Priest 的方案动的是交易版本字段:提案把原本八字节版本字段的前半当作版本号、后半当作类型位——类型 0000 是普通交易,0001 是合并交易,等价于用版本字段末位的 1 声明通配输入。合并交易的输入全是”通配输入”:只声明一个脚本PubKey,语义是”花掉链上所有等于该脚本、且不晚于本区块所在高度的未花费输出”。节点验证时把同脚本的全部旧输出价值加总,够付输出即有效;反向也要补一条规则——普通交易的某个输入,如果同脚本的合并交易在它之后已经上链,它就作废了。提案自问自答了一个尖锐问题:这不就鼓励收款地址复用了?回答是合并方案让”收多次款”不必重复签同一个密钥组,收款方复用的传统风险(重放签名统计分析)被绕开,复用之”恶”少了一半。

为什么它停在 Closed

方案要的是硬分叉——改共识层的交易验证规则,2015 年的气氛里”硬分叉”三个字就足以杀死提案。更实质的技术代价在验证语义:通配输入让一笔交易的合法性取决于”链上此刻有没有别的同脚本输出”,这对依赖并行验证、简洁性检查(UTXO 集合有唯一历史承诺)的实现都是额外的复杂度。而它想解决的问题,社区后来用别的路径消化了:隔离见证让签名从脚本里拆出去、批量支付接口让一次交易挂几十路输出、费率市场本身在持续把合并碎钱的成本报出来。需求还活着,方案换了三代。

今天怎么处理碎钱

普通钱包的合并入口叫”整合”或”整理 UTXO”,本质就是一笔高费率的普通多输入交易——用市价手续费换确定性。什么时候值得做:大额转出前、费率坑的低谷期。什么时候别做:为不存在的隐私收益(同脚本合并反而强化聚类)、或在拥堵期为省钱压低费率导致反复加急。账很好算:碎输出多到合并一次的矿工费能在未来若干笔交易里省回更多时,动手;否则让粉尘安静地躺着。

一笔碎钱的实际账

钱包在花币前其实一直在做一道算术题:从一堆面额不等的碎钱里挑出若干块,凑够货款加手续费,且找零尽量小。挑得不好,剩下的碎块更多、下次更难凑。主流客户端的做法是在”多挑几块多付一次输入体积费”与”少挑几块留下难消化的找零”之间反复权衡,有的策略甚至会专门优先吞掉长期沉睡的粉尘。理解这层账,你才会明白为什么同一笔金额在不同时点、不同钱包里费率差别明显——不是网络在针对你,是它手里的碎钱组合不同。而 BIP-131 想改写的是这道题的规则本身:与其一块块挑,不如宣布”这个脚本名下的所有碎块一次收编”,代价是整个网络要为这种全局查找买单。

读旧提案的正确姿势

BIP-131 的价值不在方案本身,而在它把”钱花不动”从个人烦恼翻译成协议问题:UTXO 集是有成本的全局状态,谁设计花费路径都在替所有人做决定。今天的等价讨论是数据可获性费用、状态增长限制。旧案死掉的原因清单,几乎就是下一代表决规则的需求说明书。本文只讨论协议机制,不构成任何投资建议。