双重支付问题是一种现象,即一种货币的单个单位同时被同时花费多次。这会在支出记录和可用货币数量之间造成差异。 双重支付最常与比特币相关联,因为熟练的程序员可以更容易地操纵或复制数字信息,他们熟悉区块链协议的工作原理。比特币也是窃贼进行双重支付的目标,因为比特币是一种点对点交换媒介,不通过任何中介机构或机构。[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%,币安矿池的哈希率为 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 价格较高的那个交易,但无论如何都不会发生双重支付,因为最终只会发生一个交易。[3] 以太坊中使用两种类型的 nonce。
在 2019 年 12 月,一段病毒式视频展示了在接受比特币的地点双重支付比特币。这些攻击是使用 Replace-By-Fee (RBF) 实现的,RBF 是对比特币协议的一项有争议的升级。第一个交易被发送给商家,然后是附加了更高费用的第二个交易。此 RBF 交易覆盖了第一个交易,因为更高的费用意味着它将被优先处理,从而允许对其进行双重支付。这些攻击之所以有效,是因为商家接受了未确认的交易。
在同年早些时候发生的类似事件中,一些加拿大比特币持有者能够在没有实际兑现的情况下“兑现”他们的比特币。他们似乎将比特币发送到比特币 ATM,在那里他们能够提取现金。收到现金后,他们取消了交易,因为这些交易尚未“确认”。[5]