双花问题是数字现金系统中的潜在问题,是指同一笔资金同时支付给两位收款方。如果没有适当对策,仅凭协议无法彻底解决该问题,毕竟用户无从验证自己收到的资金是否还曾经付给他人。
在数字现金领域,必须确保特定的货币单元不可复制。如果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机制对私人转账极具价值。但是,eCash机制自身无抵御能力,由于银行是中心化节点,一旦系统出错就一损俱损。银行发行的钞票本身没有价值,价值完全源自银行愿意把钞票兑换成美元。客户受制于银行,必须依靠银行的信誉才能运作资金。这正是加密货币旨在解决的问题。
在没有监督机制的生态系统中避免双花问题的发生,更具挑战性。权利相当的参与者必须按照同一套规则相互协调,以预防欺诈并激励所有用户诚信行事。
比特币白皮书呈现的最大创新就是双花问题的解决方案。中本聪提出了一种史无前例的数据结构,即现在广为人知的区块链。
区块链实际上只是具有某些独特属性的数据库。网络参与者(称为节点)运行专门的软件,让节点之间相互同步自己的数据库副本。这样一来,全网都能审计可追溯到创世区块的交易历史记录。由于区块链可公开查看,发现并防止欺诈行为就会变得更轻松,例如识别出试图双花的交易。
用户发布交易时,不会立即添加到区块链中,必须先通过挖矿才能装入区块。因此,只有区块入链,收款方才可确认交易有效。否则,如果发送者把同一笔代币支付到其他地方,收款方将面临损失资金的风险。
交易一经确认,代币所有权便会分配给新用户,并获得整个网络的验证,因此代币不得再双花。出于这个原因,许多人建议在接受有效付款之前先等待多次确认。每个后续区块都会大大增加修改或重写链的工作量(例如发生51%攻击的情况)。
让我们回到餐厅的情境。Dan回到餐厅,这次注意到了窗口“本店支持比特币支付”的贴纸。他对上次的用餐念念不忘,又点了同样的食物,花费0.005枚比特币。
Erin向Dan展示公共地址,即转账地址。Dan发布该笔交易,本质上就是一条署名消息,宣告自己拥有的0.005枚比特币现已归Erin所有。无需过多细节,任何人看到Dan的签名交易都可证实代币确实归他所有,因此Dan有权发送。
然而如前所述,该交易只有装入区块获得确认后才有效。接收未确认的交易就像此前接收40美元的eCash一样,如果不立即通过银行兑现,发送方可以将该笔资金花费到其他地方。因此,Erin应该至少等待6个区块确认(大约一小时)之后,再接受Dan的付款。
比特币经过精心设计,可防止双花攻击,至少在协议使用符合预期的情况下确实如此。也就是说,如果有人正在等待某笔交易获得区块确认,则发送者将无法轻易撤销该笔交易。只有“反转”区块链,才能撤销交易,这需要无比庞大的哈希算力。
然而,有些双花攻击专门针对接受未确认交易的用户。诸如小额购买,商户就不想等到交易装入区块。忙得团团转的快餐店可能等不了网络处理每笔交易所需的那么长时间。因此,如果商家启用了“即时”付款,就有可能面临双花问题。有人可以在点了汉堡付完款后,立即又将同一笔资金发回自己的地址。只要后面那笔交易的手续费用更高,就有可能先被确认,继而导致先前的交易失效。
目前有三种普遍的双花攻击:
51%攻击:单个实体或组织设法控制超过50%的哈希率,以此删除或修改交易顺序。这种攻击在比特币网络发生的几率微乎其微,但在其他网络中发生过。
竞争攻击(Race attack):使用同一笔资金连续发布两笔有冲突的交易,但仅一笔交易得到确认。攻击者的目标是通过验证对自己有利的交易让另一笔支付失效。例如,将资金发送到他自己控制的地址。竞争攻击一般会让接收方接受一笔未确认的交易作为付款。
芬尼攻击(Finney attacks):攻击者预先挖矿一笔交易放入区块,但并不立即发布到网络中。相反,他将同一笔代币支付到另一笔交易中,然后才发布之前已挖出的区块,从而使支付无效。芬尼攻击的必要条件是事件按照特定顺序发生,能否成功还取决于收款方是否接受未确认的交易。
正如我们所见,商户只要耐心等待区块确认,就能大大降低风险,避免成为双花受害者。
用户可以利用双花攻击篡改点对点电子现金系统,多次利用同一笔资金,谋取不当得利。以往由于这个问题不得不到很好的解决,该领域的发展一直裹足不前。
然而万幸的是,盲签名的使用成为了中心化金融方案中一个令人瞩目的解决方案。紧随其后,工作量证明机制和区块链技术的发展催生出比特币这种强大的去中心化货币形式,继而又为数以千计的加密货币项目提供了灵感。