双重支付问题是指单个货币单位同时被多次花费的现象。这会在支出记录和可用货币数量之间造成差异。
双重支付最常与比特币联系在一起,因为精通区块链协议的熟练程序员可以更容易地操纵或复制数字信息。比特币也是窃贼进行双重支付的目标,因为比特币是一种点对点的交换媒介,不通过任何中介机构或机构。[1]
例如,如果有人走进一家服装店,只有 10 美元,买了一件 10 美元的衬衫,然后又用已经支付给收银员的同一笔 10 美元买了另一件 10 美元的衬衫。虽然这用实物货币很难做到,部分原因是最近的交易和当前的持有者可以很容易地实时验证,但使用数字货币则有更多的机会这样做。比特币的完全数字货币网络是去中心化的,这意味着它没有中央机构、监管机构或管理机构来监管盗窃犯和黑客。虽然传统的安全实体不监控 比特币 网络是否存在双重支付,但已经实施了其他网络防御措施来对抗可能威胁网络共识机制和交易账本的攻击,从而为那些投资 比特币 的人提供信心。
从根本上说,双重支付是指不良行为者发送一个交易的副本,使其看起来合法,同时保留原始交易,或完全删除第一个交易。这对于比特币或任何数字货币来说都是可能且危险的,因为数字信息更容易被复制。犯罪分子会尝试在几种不同的情况下进行比特币双重支付。
攻击者会同时将相同的比特币发送到两个(或更多)不同的地址。这种类型的攻击试图利用比特币网络缓慢的10分钟区块时间,在此期间,交易被发送到网络并排队等待矿工确认和验证,以便添加到区块链中。通过将额外的交易偷偷添加到区块链上,窃贼可以制造原始比特币金额尚未被花费的假象,或者操纵现有的区块链,并费力地重新挖掘包含虚假交易历史的区块,以支持所需的未来双重支付。
攻击者向网络发送多个数据包(数据单元)以撤销交易,使其看起来从未发生过。通过这种方式,攻击者试图进行比特币双重支付,在收到交易对手的资产或服务后撤销交易,从而同时保留收到的商品和发送的比特币。
当一群矿工控制了超过 50% 的网络哈希率时,他们会对加密货币区块链发起 51% 攻击。控制 51% 的网络节点使控制方能够更改区块链。如果攻击者能够阻止新的交易获得确认,那么一些或所有用户之间的支付可能会被停止。他们还可以撤销他们在掌权时做出的决定。像工作量证明这样的共识系统旨在避免的问题之一是,通过撤销交易,用户可能会重复花费代币。在参与率高的代币上,51% 的攻击是一项非常艰巨和困难的任务。大多数情况下,攻击者群体必须能够控制所需的 51%,并准备好在机会出现时注入备份区块链。然后,主网络必须被超越。51% 攻击的最大障碍之一是这样做的成本。例如,Bitmain S19 XP Hydro 是最先进的专用集成电路 (ASIC) 矿机。它拥有 255 TH/s(每秒兆次哈希)的哈希率,成本超过 19,800 美元。FoundryUSA 拥有 54.42 EH/s(每秒艾哈希),占整个比特币网络哈希率的 23.75%,其次是 AntPool,拥有 41.49 EH/s,占 18.12%,以及 BinancePool,拥有 34.48 EH/s,占 15.06%。[2]
Finney 攻击以 Hal Finney 的名字命名,他恰好是 比特币 交易的第一个接收者,也是第一个评论 比特币 源代码发布的人。它是一种双重支付攻击,具有以下特点:
它的过程如下:
如果从找到区块到攻击者发送付款且商家接受付款的时间是 't',并且找到区块的平均时间是 'T',则在此时间内网络上找到另一个区块的概率为 t/T。在这种情况下,攻击将失败,并且 攻击者将损失 B 的区块奖励。这意味着尝试攻击的平均成本约为 (t/T) * B。根据经验,商家应至少等待 t=V*T/B(V 是交易的价值),以确保尝试对他进行此攻击不会获利。但这可能还不够,因为一个敏捷的攻击者可以使用同一个区块进行多次攻击,从而可能获得其总价值。攻击者的哈希率越低,他/她进行攻击的机会就越少。如果攻击是为了获得一些非流动性商品,则很难使对该商品的需求与找到区块相吻合。如果攻击是为了获得一些流动性商品(例如,用比特币兑换其他货币),那么机会总是存在的,但商家很可能需要一些确认。这使得该攻击在实践中难以使用。[4]
竞速攻击是一种特殊的双重支付尝试,当使用相同的资金同时创建两个交易以进行两次支付时,这是一种恶意活动。它要求接收者接受未确认交易的付款。攻击者向受害者发送一个未确认的交易。与此同时,他们向网络广播一个冲突的交易。由于受害者首先观察到他们自己的交易,他们相信他们会得到付款。然而,由于网络的其余部分首先看到了双重支付,受害者很可能不会得到这笔钱。当攻击者与受害者的节点有直接连接并将冲突的交易直接存入矿工时,这种攻击更容易进行。[6]
中本聪的白皮书中建议使用时间戳服务器作为双重支付问题的解决方案。该服务器对一个交易区块进行哈希处理,然后将哈希值广播到比特币网络中的每个节点。这个时间戳证明了哈希中的任何信息都不可能在哈希发布后产生。这创建了一个关于交易发生顺序的不可变的(不可更改的)日志,因为每个时间戳都包含其哈希中的前一个时间戳。每个时间戳都建立在之前的那些时间戳之上。总之,区块链通过将交易组广播到比特币网络中的所有节点并对其进行时间戳来阻止双重支付。由于交易在区块链上被时间戳标记并与之前的交易在数量上相关联,因此交易是不可逆转的且难以篡改。[2]
自从2009年第一个比特币客户端发布以来,比特币的区块链已经保存了所有交易的完整记录,以便正确理解区块链如何避免双重支付。由于每个交易都以密码学方式哈希到前面的区块,因此没有人可以更改记录。这个数据库被称为区块链,因为一批新的交易,称为区块,每十分钟添加到其中。
避免双重支付意味着阻止同一笔资金被使用两次。如果nonce被设置为相同的值,那么只有一笔交易会被挖矿,而且通常是gas price更高的那一笔。但是,无论如何都不会发生双重支付,因为最终只有一笔交易会发生。[3]Ethereum 中使用了两种类型的nonce。
2019年12月,一段病毒式传播的视频展示了比特币在接受比特币的地点被双重支付。这些攻击是利用费用替换(RBF)实现的,这是对比特币协议的一项颇具争议的升级。第一笔交易被发送给商家,然后是第二笔附加更高费用的交易。由于更高的费用意味着它将被优先处理,因此RBF交易覆盖了第一笔交易,从而允许进行双重支付。这些攻击之所以奏效,是因为商家接受了未经确认的交易。
在同年早些时候发生的类似事件中,一些加拿大比特币持有者能够在没有实际兑现的情况下“兑现”他们的比特币。他们似乎将比特币发送到比特币ATM机,在那里他们能够提取现金。收到现金后,他们取消了交易,因为这些交易尚未“确认”。 [5]