什么是双重支出?

双重支出是数位现金系统中的一个潜在问题,即相同的资金同时发送给两个接收者。如果没有任何适当的对策,无法解决问题的协议就会从根本上受到破坏——用户无法验证他们收到的资金是否已经被花在其他地方。

就数位现金而言,确保特定单位无法复制至关重要。如果 Alice 可以收到 10 个单位,复制贴上 10 次,然后发现自己拥有 100 个单位,那么整个系统就会受到破坏。同样,如果她可以同时向鲍勃和卡罗尔发送相同的 10 个单位,则这种方案就行不通。因此,为了使数位货币发挥作用,必须有适当的机制来防止这种行为。


如何防止双重支付?

集中式方法

中心化路线比去中心化路线更容易实现。这通常需要一名监督者管理系统并控制单位的发行和分配。解决双重支付问题的一个很好的中心化解决方案是 David Chaum 的 eCash。

为了向用户发行模仿现金的数字资产(能够匿名和点对点交换),银行可以使用盲签名——正如密码学家 David Chaum 在其 1982 年的论文《不可追踪支付的盲签名》中详细介绍的那样。

在这种情况下,如果用户(我们称他为丹)希望收到 100 美元的数字现金,他需要先通知银行。假设他的账户中有余额,他将生成一个随机数(对于较小的面额,可以生成多个)。假设他生成了五个数字,每个数字的值都是 20 美元。为了防止银行追踪特定单位,丹通过为每个随机数添加盲因子来混淆随机数。

然后,他将这些数据交给银行,银行从他的账户中扣除 100 美元,并签署消息证明这五条信息中的每一条都可以兑换 20 美元。丹现在可以花掉银行发放的资金了。他去了艾琳的餐厅,买了一顿花了 40 美元的饭。

丹可以移除盲因子,从而显示与每张数字现金“钞票”相关联的随机数,该随机数可作为每个单位的唯一标识符(非常类似于序列号)。他向艾琳展示了其中两张,艾琳现在必须立即向银行兑换,以防止丹将其花在其他商家那里。银行将检查签名是否有效,如果一切正常,它将向艾琳的账户存入 40 美元。

现在使用的钞票基本上已经被烧毁了,如果艾琳希望以同样的方式花掉她的新余额,就必须发行更多的钞票。

Chaumian eCash 的设置可能对私人转账很有价值。但是,由于银行是失败的中心点,因此它的弹性很差。发行的钞票本身毫无价值,因为其价值完全取决于银行将其兑换成美元的意愿。客户只能听天由命,必须依靠银行的善意才能运作。这正是加密货币旨在解决的问题。


分散式方法

在没有监管者的生态系统中,确保资金不会被双重使用更具挑战性。同等权力的参与者必须围绕一套防止欺诈的规则进行协调,并激励所有用户诚实行事。

比特币白皮书中提出的最大创新是解决双重支付问题。虽然没有提及,但中本聪提出了现在广为人知的区块链数据结构。

区块链实际上只是一个具有一些独特属性的数据库。网络上的参与者(称为节点)运行专门的软件,使他们能够将自己的数据库副本与同行同步。结果是整个网络可以审计可追溯到创世块的交易历史记录。通过公开查看区块链,可以轻松检测和防止欺诈活动,例如试图双重支付的交易。

当用户广播交易时,交易不会立即添加到区块链中——必须先通过挖矿将其包含在区块中。因此,接收者应仅在其区块添加到链中后才认为交易有效。否则,他们可能会失去资金,因为发送者可能会在其他地方花费相同的硬币。

一旦交易得到确认,这些代币就无法被双重使用,因为所有权被分配给了新用户——整个网络都可以验证这一点。正是出于这个原因,许多人建议等待多次确认后再接受付款。每个后续区块都会大大增加修改或重写链所需的工作量(这可能发生在 51% 攻击期间)。

让我们回顾一下餐厅的场景。丹回到餐厅,这次注意到窗户上贴着一张“这里接受比特币”的标签。他很喜欢上次吃的那顿饭,所以又点了一次。花了他 0.005 比特币。

Erin 向他提供了一个公共地址,他必须将资金发送到该地址。Dan 广播了这笔交易,这实际上是一条签名消息,表明 Dan 拥有的 0.005 BTC 现在归 Erin 所有。无需过多赘述,任何看到 Dan 签名交易的人都可以验证他确实拥有这些代币,因此有权发送它们。

不过,如上所述,交易只有包含在已确认的区块中才有效。接受未确认的交易就像接受上例中的 40 美元 eCash,但不立即将其存入银行——它允许发送者在其他地方消费。因此,建议 Erin 等待至少 6 个区块确认(大约一小时)后再接受 Dan 的付款。


比特币的双重支付

比特币经过精心设计,至少在协议按预期使用时可以防止双重支付攻击。也就是说,如果个人等待交易在区块中得到确认,那么发送者没有简单的方法可以撤销交易。要做到这一点,他们需要“逆转”区块链,这需要不切实际的哈希算力。

然而,有少数双重支付攻击针对的是接受未确认交易的各方。例如,对于低价值购买,商家可能不想等待交易被纳入区块。繁忙的快餐店可能无法承受在网络处理每笔购买时都袖手旁观的代价。因此,如果企业启用“即时”支付,他们就有可能遭受双重支付。有人可能会订购一个汉堡,付款后立即将相同的资金发送到自己的地址。由于费用较高,这笔新交易很可能会先得到确认,因此会使之前的交易无效。

执行双重支付有三种流行的方法:

  • 51% 攻击:当单个实体或组织设法控制超过 50% 的哈希率时,他们就可以排除或修改交易顺序。这种攻击在比特币上不太可能发生,但在其他网络中确实发生过。

  • 竞争攻击:两笔相互冲突的交易连续广播,使用相同的资金 - 但只有一笔交易得到确认。攻击者的目标是通过仅验证对他有利的交易(例如,将相同的资金发送到他控制的地址)来使付款无效。竞争攻击要求收件人接受未经确认的交易作为付款。

  • 芬尼攻击:攻击者预先将一笔交易挖矿到区块中,但不立即将其广播到网络。相反,他在另一笔交易中使用相同的货币,然后才广播他之前挖矿的区块,这可能会使付款无效。芬尼攻击需要发生特定事件序列,并且还取决于接收者是否接受未经确认的交易。

我们可以看出,等待区块确认的商家将大大降低成为双重支付受害者的风险。


结束语

双重支付允许用户利用电子现金系统获取经济利益,多次使用同一笔资金。传统上,缺乏足够的解决方案来解决这个问题阻碍了该领域的发展。

但幸运的是,盲签名的使用为中心化金融方案提供了一个有趣的解决方案。后来,工作量证明机制和区块链技术的诞生催生了比特币,成为一种强大的去中心化货币形式——这反过来又激发了数千个其他加密货币项目的诞生。