术语表 /隐私与安全
双花
又称双重支付、Double spend。
- 双花是什么?
- 双花是指试图让同一笔比特币向两个不同的人付款:让花费同一批比特币的第二笔交易得到确认,以取代第一笔交易。
数字货币天然可以被复制,而阻止这种复制,正是比特币被设计出来要解决的问题。每一枚币都是一个只能被消耗一次的输出,账本通过把其中一个版本埋入区块之下来裁决争议:经过6次确认(大约1小时)之后,要撤销它就必须在算力上超过整个网络。在一笔付款确认之前,请把它视为一项承诺,而不是已经收到的资金。
运作方式
花费比特币,意味着消耗特定的输出,每个输出由创建它的交易及其在该交易中的位置来标识。全节点保存着所有未花费输出的集合,验证就是一次查找:如果您的交易所指定的输出不在该集合中,这笔交易就是无效的,会被丢弃,无论签名多么规范。
这使得已确认的双花从构造上就不可能发生。有意思的情形都发生在确认之前,共有三种。
最常见的一种是替换。两笔花费同一个输出的交易互相冲突,只有一笔能够保留下来。节点接受先到的那一笔,通常忽略第二笔,但会转发支付更高手续费的替换交易。自 Bitcoin Core 28.0(发布于2024年10月)起,-mempoolfullrbf 设置默认开启,这意味着无论原交易是否声明可被替换,节点都会转发与之冲突且手续费更高的交易。任何未确认的交易都可能被替换。
第二种是竞速。攻击者同时向商户的节点广播一笔交易,并向网络其余部分广播一笔与之冲突的交易,赌的是向自己付款的那个版本先到达矿工。这不需要额外支付手续费,只需要更好的网络连接。
第三种是区块链重组,需要掌握多数算力,相关内容见51%攻击。这是唯一能够撤销已经进入区块的付款的方法。
比特币自身的代码在这方面公开出错过,仅此一次。CVE-2018-17144于2018年9月披露,是一个漏洞,它使一笔交易能够两次花费同一个输入,而检查它的节点不会崩溃。Bitcoin Core 0.16.3在数天内发布了修复,链上没有造成损害,但这一事件也说明:这项保证是由需要人们持续审计的软件来执行的。
购买比特币时为何重要
买家几乎从不会成为双花的受害者。当您向交易所发送美元或欧元并收到比特币时,结算风险由交易所承担,这就是为什么交易所要等待确认后才放行提币,也是充币页面会显示进度计数器的原因。一旦币到达由您控制的地址,就没有人能再次花费它们,因为花费需要您的签名。
一旦您成为收取比特币的一方,风险就会反转。这种情况比人们预想的更常见:在点对点交易中出售比特币、为自由职业工作收取比特币、经营接受付款的商店。在所有这些情形中,凭一笔未确认的交易就交付商品、现金或银行转账,都是错误之举。请至少等待1个区块,金额较大时请等待多个区块。
还有一整类诈骗是围绕这个说法编造的。即时通讯应用和视频网站上的卖家兜售"double spend software"、"flash BTC",或声称能够生成可花费比特币的工具,并收取费用。他们卖的东西没有一样有效,因为无效交易会被网络上的每个节点拒绝;他们卖出的“产品”,其实就是您付出的那笔费用。本站的安全指南介绍了此类诈骗所属的整个类别。
闪电网络改变了这个问题的形态,而不是消除了它。付款在数秒内针对通道余额完成结算,因此商户无需等待区块,双花问题转变为通道对手方是否试图广播旧状态,而瞭望塔(watchtower)的作用正是惩罚这种行为。
替换未确认的付款,分步演示
替换未确认的付款是这种攻击的低成本版本,值得用真实数字走一遍。
Alice 购买了一台笔记本电脑,支付0.01 BTC。她的钱包构建了一笔1个输入、2个输出的 SegWit 交易,大小约141虚拟字节,并附上3 sat/vB 的费率,即423聪的手续费。商店的终端显示已收到付款,笔记本电脑被带出了店门。
在区块到来之前,Alice 广播了第二笔花费同一输入的交易,这次把币发送到她自己的地址,费率为20 sat/vB,即2,820聪。矿工会选择对他们价值更高的版本。区块生成后,商店的那笔付款从内存池中消失,永远不会被确认。Alice 额外花费了2,397聪,按多数价位计算远低于1美元,却同时保住了笔记本电脑和比特币。
这个过程没有任何特别之处,也没有动用任何算力。防范措施同样没有任何成本:等待1个区块(平均约10分钟),替换窗口就关闭了。
双花 vs 手续费替换
手续费替换(replace-by-fee)是同一机制的正当用法。当您自己的付款卡住时,您以更高的手续费向同一收款人重新广播,网络会乐意替换旧版本。双花则利用这套机制来改变收款对象。转发策略无法区分两者,因为差别在于输出中所表达的意图,这也是如今接受未确认付款的商户都假定每一笔付款都可被替换的原因。
双花 vs 交易延展性
延展性会改变交易的标识符,而不改变交易的支付内容。币仍然转到预期的收款人手中;只是您一直在追踪的 txid 失效了,这在历史上曾破坏交易所的账务,也导致 Mt. Gox 的提币系统在2014年2月出现故障。SegWit 于2017年8月激活,通过把签名移出会被哈希进 txid 的数据,消除了第三方延展性。被延展的交易是记账问题;双花则是付款凭空消失。