协议演进 / BIP/比特币改进提案 / BIP-126

BIP-126 异构输入脚本交易的最佳实践

为不得不用多个不同脚本的输入拼一笔交易的情况定标准形与备选形,尽量减少隐私信息无控制地泄漏到链上。本 BIP 目前处于草案状态。

一、档案卡

档案卡
编号BIP-126
标题Best Practices for Heterogeneous Input Script Transactions
作者Kristov Atlas <[email protected]>
指定日期2016-02-10
类型Informational(信息类)
状态Draft(草案)
阅读版https://bips.dev/126
官方原文https://github.com/bitcoin/bips/blob/master/bip-0126.mediawiki

二、放在哪一族

钱包隐私与交易构造最佳实践族。它不改协议、不改共识,只给钱包“怎么拼交易”定一套自律规范,目标是链上隐私。

它只有一条明确的规范衔接:与 BIP-69(交易输入输出的字典序索引)的关系——同时遵循两者的应用,应先执行本 BIP 的流程,再执行 BIP-69。

它讨论的对象与 BIP-125 那类节点策略无关:这里没有节点要执行的新规则,约束的是钱包自己的选币与输出构造方式。

三、它要解决什么

3.1 拼凑付款会把身份信息写上链

当一笔交易的多个输入分别花费发往不同比特币地址的在先输出时,用户的个人可识别信息(PII)会以不受控制的方式泄漏进区块链——旁观者很容易据此推断这些不同地址同属一人。

这类交易又常常躲不掉:钱包余额随时间自然碎片化,想付一笔较大的金额,往往必须把多个 UTXO 拼在一起。

3.2 三个目标

原文说,这套建议要同时做到三件事:

  1. 最大化用户保护协议的效果:如果为保护隐私而构造的交易有独特“指纹”,保护反而失效、甚至适得其反;规范要让这类交易不显眼。
  2. 最小化不可避免的异构交易的坏处:如果不可避免的交易与有意构造的保护性交易长得无法区分,前者在图分析面前就多了一层含混性,能借光受益。
  3. 限制对 UTXO 集合增长的影响:此前非标准化的有意异构交易每笔都倾向于让全网 UTXO 集合变大;把不可避免与有意两种交易都标准化,是为了把这种增长压到最小。

为此,原文提出两种形态:标准形(Standard form)与备选形(Alternate form)。

四、规则本身

4.1 先分清几个定义

异构输入脚本交易(HIT):包含多个输入,且各输入所花费的在先输出的脚本不完全相同(例如花费了发往不止一个地址的输出)。全文判断“输入脚本”时,指的都是输入所引用的在先输出的脚本。

不可避免的 HIT:用户想新造一个金额大于钱包中最大单个未花费输出的输出,被迫拼凑而成。

有意的 HIT:作为用户保护协议的一部分、为减少 PII 无控制披露而特意构造的 HIT。

4.2 标准形:四条规则

一笔 HIT 同时满足以下全部条件,才是标准形:

  1. 唯一输出脚本的数量,必须等于唯一输入脚本的数量(不论输入、输出的实际个数);
  2. 所有输出脚本都必须互不相同(唯一);
  3. 至少要有一对输出金额相等;
  4. 交易中最大的输出,必须属于一个至少含两个等额输出的集合。

为什么按“唯一脚本数”而不是输入/输出个数对齐?原文的理由是照顾保护性的选币行为:钱包里可能因有意或意外的地址复用、或粉尘攻击,存有脚本相同的可花费输出;为减轻地址复用的坏处,每当某个 UTXO 被用作输入,所有与其花费脚本相同的 UTXO 都应一并纳入。要求输出脚本全部唯一,是为了杜绝输出端再复用地址;把输出数限制在唯一输入脚本数以内,则保证标准形 HIT 的输入数不少于输出数、不净增 UTXO。

等额输出的要求,是让有意的 HIT 在行为上与不可避免的 HIT 尽量相像。

4.3 备选形:标准形做不出来时

两种情形下做不出标准形:不可避免的 HIT,但钱包里 UTXO 的数量或金额不足以凑成标准形;或者用户想减少钱包 UTXO 数量,而手里没有任何脚本相同的 UTXO 集合。

这时合规实现可以按以下步骤造备选形:反复取“金额合计至少达到目标花费的最小输入组合”,配上一笔花费输出与一笔找零输出成对加入;每一对中要有一个输出与前一对的花费输出等额;可重复直到用完想用的输入或造够想造的输出;最后调整找零输出以支付手续费。

备选形须满足:唯一输入脚本数大于输出脚本数;所有输出脚本唯一;至少一对输出等额(等额的那组叫标准输出,其金额叫标准值,其余输出叫找零输出);并且对 n 个标准输出,必须能把全部输入输出划分成 n 个集合,每组含一个或多个输入、恰好一个标准输出、恰好一个找零输出,组内输入之和减去找零输出等于标准值(允许以交易手续费为容差)。金额为零的“虚拟找零输出”在检验合规时允许存在,但不会出现在真正广播的交易里。

原文还要求:能造有意 HIT 的客户端,必须具备造备选形的能力,并且必须在自己所造交易中让备选形占一个非零比例——这样备选形才不会成为罕见而醒目的指纹。

4.4 也有造不出合规交易的情况

如果用户想造的输出大于其可花费输出总额的一半,或者输入分布使备选形步骤无法完成,用户就造不出一笔合规的交易。原文如实承认了这一边界,而不是假装规范无所不能。

五、谁必须动

普通持币人:不必手工做什么。是否受益,取决于所用钱包有没有按这套最佳实践选币与构造输出。

钱包开发者:这是本 BIP 唯一的执行者。要实现标准形与备选形两套构造规则、按定义区分不可避免与有意的 HIT、处理地址复用时“同脚本 UTXO 一并花费”等细节;同时遵循 BIP-69 时,先本 BIP、后 BIP-69。

全节点与矿工:不必动。合规与否不影响交易有效性,节点无从也无需检验一笔交易是不是标准形。

共识层:无改动。本 BIP 是信息类的最佳实践,不是协议规则。

六、现在算不算数,以及一个常见误读

状态为 Draft(草案)。按仓库状态解释:它仍停留在草案阶段,没有成为定稿,更不是节点或钱包必须遵守的强制标准。信息类文档的性质也决定了这一点——原文提供的是“怎么做更好”的指南,实现者可以遵循,也可以忽略;它从未给任何软件设定合规义务。读它应把它当作理解钱包隐私工程的一份思路文档,而不是验收标准。

常见误读:“一笔交易输入来自多个地址,就违反了 BIP-126。”

不对。本 BIP 开篇就承认这类交易频繁且常常不可避免,它要做的不是禁止,而是给出标准形与备选形,让不得不拼凑的交易尽量少泄漏信息、并与保护性交易混在一起难以区分。把“最佳实践指南”读成“禁止性规则”,恰好读反了信息类 BIP 的定位。

七、延伸

本页内容整理自 bitcoin/bips 仓库与 bips.dev,事实已与仓库核对;解读仅供学习参考。