“双花问题”新手入门指南

什么是双重支出?
双花问题是数字现金系统中的一个潜在问题,在该系统中,相同的资金同时支付给两个接收者。如果没有合适的机制,仅凭借协议是无法彻底解决双花问题的,用户无法验证是否自己所接收的资金没有同时在其他地方被支付。
在数字现金方面,确保特定的货币单元不可重复是至关重要的。如果Alice可以接收10个货币单元,并可以将其复制粘贴10次,然后发现自己拥有了100个货币单元,那么整个系统将受到破坏。同样,如果她可以同时将相同的10个货币单元同时发给Bob和Carol,则这样机制将无法正常工作。因此,为了使数字货币能够正常运行,必须有合适的机制来防止这种行为的发生。
如何防止双重支出的发生?
中心化方式
中心化方式比去中心化方案更容易实施。通常,需要安排一名监督员来管理系统并控制单位的发行和分配。大卫·肖姆(David Chaum)的eCash就是通过中心化方式解决双花问题的一个有效例子。
要向用户发行类似于现金的数字资产(具有匿名性和点对点交易属性),银行可以使用盲签方式-密码学家David Chaum在1982年的论文《不可追溯的盲签支付方案》中对此进行了详细说明。
在这种情况下,如果某个用户(Dan)希望在银行账户中支取100美元的数字现金,则必须先通知银行。如果他的帐户中有余额,那么他将生成一个随机数(对于较小的面额,则需要生成多个)。假设他生成了五个随机数,每个数字代表的价值为20美元。为了防止银行能够追踪到特定的货币单元,Dan通过为每个随机单位添加盲因子来混淆随机数。
然后,他将这些数据交给银行,该银行从他的帐户中扣除100美元的余额,并对消息进行签名,证明五条信息中的每条信息都可以代表20美元。之后,Dan就可以使用银行所发行的数字现金了。现在他去Erin的餐厅用餐花费了40美元。
Dan可以消除盲因子,以暴露与每个数字现金“账单”相关的随机数,该随机数可以用作每个单元的唯一标识符(非常类似于序列号)。他向Erin透露了其中的两个,Erin现在必须立即向银行申请验证这笔资金,以防止Dan将其支付给其他人。银行将检查签名是否有效,如果一切正确,它将向Erin的帐户中存入40美元。
现在,上面所有的交易记录都已经核对无误,如果Erin希望以同样的方式使用她的账户余额,则必须在银行账户上执行相同的操作。
Chaumian eCash的设置对于私人转账十分有价值。但是,由于银行是中心化节点,可能存在单点故障,因此,某些情况下是无法正常工作的。而某种程度上,银行所发行的资产可能一文不值,因为其价值完全是按照银行的愿意,然后将其兑换成美元。客户会受银行左右,必须依靠银行的信誉背书才能体现价值。这也正是加密货币旨在解决的问题。
去中心化方式
在没有监督机制的生态系统中如何确保不发生“双花”支付,是相当更具挑战性的。具有同等能力的参与者必须按照一组规则进行协商,防止欺诈的发生,并激励所有用户诚信经营。
比特币白皮书中提出的最大创新是双花问题的解决方案。中本聪提出了一种数据结构,尽管现在没有这样引用,但它现在被广泛称为区块链。
区块链实际上只是具有某些独特属性的数据库。网络上的参与者(称为节点)运行专门的软件,该软件使节点能够将其数据库副本与其他节点进行同步。促使整个网络都可以从创世区块开始,审核和追溯链上发生的交易。通过公开查看区块链,可以很容易地检测和防止欺诈行为活动,例如识别出进行双花支出的交易。
用户广播交易时,不会立即将其添加到区块链中,必须首先通过挖矿将其打包在区块中。这样,接收者在确定交易已经添加到区块链之后,才可以认为该交易有效。否则,他们有失去资金的风险,因为发送方可能在其他地方支付了相同的代币。 
如果交易被区块链正式确认,则代币就不可能被重复使用,因为所有权已分配给新用户,并且整个网络都可以对此进行验证。出于这个原因,许多人建议在接受有效付款之前先等待多次确认。随后的每个区块的验证,都会对修改或重写区块链,增加极大的工作量(类似于发生51%攻击)。
让我们回顾一下刚才餐厅的消费场景。Dan回到餐厅,这次在窗口上看到一个“此处接受比特币支付”的标签。他对上一次的用餐非常满意,所以他再次点了同样的套餐。花费了他0.005 BTC。
Erin向他展示了一个公共地址,他必须将资金发送到该地址上。Dan支付后,广播了该交易,这实质上是一个已签名的消息,指出Dan拥有的0.005 BTC现在已经在Erin的手中。无需过多透露细节,任何与Dan进行了签名交易的人都可以验证他确实拥有这些代币,因此有权发送它们。
但是,如前所述,该交易仅能够在被区块链确认后才能有效。如果在没有区块链确认的情况下就确认接收到该笔资金,就像接上一案例中接收40美元的eCash一样,如果不立即通过银行兑现,发送方可以将该笔资金又在其他地方。因此,我们建议Erin在确认Dan的付款之前至少等待6个区块确认(大约1个小时)。
比特币双花问题
比特币通过精心设计,至少现阶段按预期使用协议时,可以有效防止双重支出攻击。也就是说,如果我们等待区块中的交易确认,则发送者没有简单的方法可以撤消它。为此,他们将需要“反转”区块链,这需要非常庞大的哈希计算资源。
但是,针对某些未确认交易,可能出现少数的双重支出攻击。例如,对于某些价值较低的消费场景,商家可能不会等待交易被区块链验证才进行确认。忙碌的快餐店可能无法等待每笔购物交易都在区块链上进行验证。因此,如果一家企业启用了“即时”付款,那么就可能发生双花支出。有人可能会点一个汉堡,然后进行支付,同时他会立即将相同的资金发送到他们自己的地址。当后面这笔交易的手续费用较高时,后面的交易很可能会首先被确认,因此将使先前的交易无效。
有两种双花攻击的普遍方式:
· 51%攻击:单个实体或组织设法控制超过50%的哈希算力,这使他们可以删除或修改交易的顺序。这种攻击在比特币网络上发生是极不可能的,但在其他区块链网络中可能发生过。
· 竞赛攻击(Race attacks): 使用相同的资金连续广播两个冲突的交易,但只有一项交易得到确认。攻击者的目标是通过验证对他有利的交易来使另一个支付无效(例如,将相同的资金发送到他控制的地址)。竞赛攻击一般要求接收者在交易未经确认前,就确认该笔支付已到账。
· 芬妮攻击(Finney attacks): 攻击者将一个交易预挖为一个区块,而没有立即将其广播到网络中。相反,他将相同的代币花费在另一笔交易中,然后才广播他之前所预挖的区块,这可能会使支付无效。芬妮攻击需要发生一系列相关联的事情,并且还取决于接收者能够接受未经确认的交易。
正如我们所看到的,等待区块确认能够大大降低成为双花受害者的风险。
总结
“双花”问题可能会让某些用户在电子现金系统上多次使用同一笔资金,谋取不当的经济收益。在传统上,该领域也缺乏相对应的解决方案。
但是,好在中心化的金融方案使用了盲签方式作为解决该问题的一种方式。后来,工作量证明机制和区块链技术的创建催生了比特币,成为一种强大的去中心化货币形式,这种形式能够有效防范双重支付的发生,这反过来又激发了成千上万其他加密货币项目。