# Double Spending Problem

> 双重支付问题是指同一单位货币被同时多次消费的现象。这会导致支出记录与可用货币数量之间出现差异，而区块链共识机制可以防止这种风险。

- Canonical URL: https://iq.wiki/zh/wiki/double-spending-problem
- Categories: Glossary
- Created: 2023-01-21T06:30:22.781Z
- Last updated: 2026-06-18T14:32:58.089Z
- Source: IQ.wiki — the world's largest blockchain and crypto encyclopedia (https://iq.wiki)

---

双重支付问题（Double spending problem）是指同一单位货币被同时多次消费的现象。这会导致支出记录与可用货币数量之间出现差异。双重支付最常与 [比特币](https://iq.wiki/wiki/bitcoin) 联系在一起，因为熟悉区块链协议运作方式的资深程序员可以更轻易地操纵或复制数字信息。[比特币](https://iq.wiki/wiki/bitcoin) 也是窃贼进行双重支付的目标，因为 [比特币](https://iq.wiki/wiki/bitcoin) 是一种点对点的交换媒介，不经过任何中间机构或金融机构。[\[1\]](#cite-id-ho6bfzijcvs)​

[YOUTUBE@VID](https://youtube.com/watch?v=phLSjZdDc5A)



## 概览

例如，如果有人走进一家只有 10 件衬衫的服装店，在已经向收银员支付了 10 件衬衫的费用后，又试图购买另外 10 件。虽然使用实物货币很难做到这一点，部分原因是最近的交易和当前的持有者可以很容易地进行实时验证，但在数字货币中，这样做会有更多机会。比特币完全数字化的货币网络是去中心化的，这意味着它没有中央机构、监管者或管理机构来监管窃贼和黑客。虽然传统的安全实体不监控 [比特币](https://iq.wiki/wiki/bitcoin) 网络是否存在双重支出，但已实施了其他网络防御措施来对抗那些可能威胁网络共识机制和交易账本的攻击，从而为那些投资 [比特币](https://iq.wiki/wiki/bitcoin) 的人提供信心。



## 比特币双重支付是如何运作的？

从根本上说，双重支付（双花）是指恶意行为者发送一笔交易的副本，使该副本看起来合法，同时保留原始资金，或者完全抹除第一笔交易。对于 [比特币](https://iq.wiki/wiki/bitcoin) 或任何数字货币来说，这是可能且危险的，因为数字信息更容易被复制。犯罪分子尝试对比特币进行双重支付的情况有几种。[\[1\]](#cite-id-p77hfp6pbfj)

### 同时发送两次或多次相同的比特币金额

攻击者会同时将相同的比特币发送到两个（或更多）不同的地址。这种类型的攻击试图利用 [比特币](https://iq.wiki/wiki/bitcoin) 网络较慢的 10 分钟出块时间，在此期间，交易被发送到网络并排队等待矿工确认和验证，以便添加到区块链中。通过在 [区块链](https://iq.wiki/wiki/blockchain) 上潜入一笔额外的交易，窃贼可以制造出原始比特币金额尚未被消费的假象，或者操纵现有的区块链，费力地重新挖掘带有虚假交易历史的区块，以支持预期的未来双重支付。

### 撤销已发送的交易

攻击者向网络发送多个数据包（数据单元）以撤销交易，从而制造出交易从未发生过的假象。通过这种方式，攻击者在收到交易对手的资产或服务后，通过撤销交易来尝试 [比特币](https://iq.wiki/wiki/bitcoin) 双重支付，从而同时保留收到的商品和发送的 [比特币](https://iq.wiki/wiki/bitcoin)。

### 51% 攻击

当一组矿工控制了网络 50% 以上的算力时，他们就会对 [加密货币](https://iq.wiki/wiki/cryptocurrency) [区块链](https://iq.wiki/wiki/blockchain) 发起 51% 攻击。控制网络 51% 的节点使管理方能够更改区块链。如果攻击者能够阻止新交易获得确认，那么部分或所有用户之间的支付可能会停止。他们同样有能力撤销在他们掌权时所做的决定。工作量证明（PoW）等共识系统旨在避免的问题之一就是通过撤销交易，用户可能会双重支付代币。在参与率高的代币上，51% 攻击是一项极其艰巨且困难的任务。大多数情况下，攻击者群体必须能够指挥所需的 51% 算力，并准备好在机会出现时注入备份 [区块链](https://iq.wiki/wiki/blockchain)。然后，主网络的算力必须被超越。实施 51% 攻击的最大障碍之一是其成本。例如，[比特大陆 (Bitmain)](https://iq.wiki/wiki/bitmain) S19 XP Hydro 是最先进的专用集成电路 (ASIC) 矿机。它拥有 255 TH/s（每秒万亿次哈希）的算力，价格超过 19,800 美元。FoundryUSA 拥有 54.42 EH/s（每秒百亿亿次哈希），占整个 [比特币](https://iq.wiki/wiki/bitcoin) 网络算力的 23.75%，其次是 AntPool（41.49 EH/s，18.12%）和 [币安 (Binance)](https://iq.wiki/wiki/binance) Pool（34.48 EH/s，15.06%）。[\[2\]](#cite-id-p77hfp6pbfj)

### 芬尼攻击 (Finney Attack)

芬尼攻击以 [哈尔·芬尼 (Hal Finney)](https://iq.wiki/wiki/hal-finney) 的名字命名，他恰好是比特币交易的第一位接收者，也是第一个对比特币源代码发布发表评论的人。这是一种具有以下特征的双重支付攻击：

* 这种攻击仅在商家接受未确认交易时有效。
* 然而，如果商家等待几秒钟以验证网络中的节点是否都同意他已收到付款，该攻击仍然有效。
* 它要求攻击者正在进行挖矿并控制其区块内容；但在理论上，攻击者可以使用任何算力执行此操作，特别是显著低于网络总算力 50% 的情况。

其过程如下：

* 攻击者正常挖掘区块。在他/她试图寻找的区块中，包含一笔将自己的某些代币发回给自己的交易，且不广播这笔交易。
* 当他/她找到一个区块时，不进行广播；相反，他/她将相同的代币发送给商家以购买某些商品或服务。
* 在商家接受付款并不可逆转地提供服务后，攻击者广播他/她的区块。该区块中包含的发送给其自身的交易将覆盖支付给商家的未确认交易。

如果从发现区块到攻击者发送付款且商家接受付款的时间为 '**t**'，而发现区块的平均时间为 '**T**'，那么在这段时间内网络上发现另一个区块的概率为 t/T。在这种情况下，攻击将失败，*并且* 攻击者将损失区块奖励 B。这意味着尝试攻击的平均成本约为 (t/T) \* B。根据经验法则，商家应至少等待 t=V\*T/B（V 是交易价值）的时间，以确保针对他进行的此类攻击是无利可图的。但这可能还不够，因为敏捷的攻击者可以使用同一个区块进行多次攻击，潜在地获得这些攻击的总价值。攻击者的算力越低，他/她执行攻击的机会就越少。如果攻击是为了获取某些流动性差的商品，很难让对该商品的需求与发现区块的时间重合。如果攻击是为了获取流动性强的资产（例如将比特币兑换成其他货币），机会虽然始终存在，但商家很可能会要求多次确认。这使得该攻击在实践中难以实施。[\[4\]](#cite-id-ntm3apywq8)​

### 竞态攻击 (Race Attack)

竞态攻击是一种特定的双重支出（Double-Spending）尝试，这是一种恶意活动，即同时创建两笔使用相同资金的交易，以实现双重消费。它要求接收者接受未确认交易的付款。攻击者向受害者发送一笔未确认交易。[与此同时](https://iq.wiki/wiki/meanwhile)，他们向网络广播一笔冲突交易。由于受害者首先观察到了发给自己的交易，他们相信自己会收到付款。然而，由于网络其余部分先看到了双花交易，受害者很可能无法拿到钱。当攻击者与受害者的节点有直接连接，并将冲突交易直接提交给矿工时，此类攻击会显著更容易实施。[\[6\]](#cite-id-nazl3npuw2p)​

## 如何防止双重支出问题

在 [中本聪 (Satoshi Nakamoto)](https://iq.wiki/wiki/satoshi-nakamoto) 的白皮书中，建议使用时间戳服务器作为双重支出问题的解决方案。该服务器对一组交易块进行哈希处理，然后将哈希值广播到比特币网络中的每个节点。该时间戳证明了哈希中的任何信息在哈希发布之前都不可能产生。由于每个时间戳在其哈希中都包含前一个时间戳，因此这创建了一个不可篡改（不可更改）的交易发生顺序日志。每个时间戳都建立在之前的时间戳之上。总之，[区块链](https://iq.wiki/wiki/blockchain) 通过向 [比特币](https://iq.wiki/wiki/bitcoin) 网络中的所有节点广播交易组并为其添加时间戳来阻止双重支出。交易是不可逆的且难以篡改，因为它们在区块链上被标记了时间戳，并且在数量上与之前的交易相关联。[\[2\]](#cite-id-p77hfp6pbfj)​

### 比利币 (Bitcoin)

自 2009 年发布第一个比特币客户端以来，[比特币](https://iq.wiki/wiki/bitcoin) 的 [区块链](https://iq.wiki/wiki/blockchain) 保存了所有已执行交易的详尽记录，以便正确理解区块链如何避免双重支出。由于每笔交易都通过加密哈希连接到之前的区块，因此没有人可以更改记录。该数据库被称为区块链，因为每隔十分钟就会有一批新的交易（称为区块）添加到其中。

### 以太坊 (Ethereum)

避免双重支出意味着停止两次使用相同的金额。如果随机数 (Nonce) 设置为相同，则只有其中一笔交易会被挖掘，大多数情况下可能是 Gas 价格较高的那一笔，但无论如何都不会发生双重支出，因为最终在任何一种情况下都只会发生一笔交易。[\[3\]](#cite-id-0f3pxatmcew) [以太坊 (Ethereum)](https://iq.wiki/wiki/ethereum) 中使用了两种类型的 Nonce。

* **账户随机数 (Account nonce)**：它仅仅是账户的交易计数。这可以防止重放攻击，例如，B 可以一遍又一遍地重放从 A 向 B 发送 20 个代币的交易，从而不断耗尽 A 的余额。
* **工作量证明随机数 (Proof of work nonce)**：区块中的随机值，用于满足工作量证明（取决于当时的难度）。工作量证明随机数是区块中一个无意义的值，可以进行调整以尝试满足工作量证明条件。

## 案例

2019 年 12 月，一段病毒式传播的视频展示了比特币在接受比特币支付的场所被“双重支付”（double-spent）的过程。这些攻击之所以成为可能，是利用了“按费用置换”（Replace-By-Fee，简称 RBF），这是 [比特币](https://iq.wiki/wiki/bitcoin) 协议中一个略带争议的升级。第一笔交易先发送给商家，随后发送附带更高费用的第二笔交易。由于费用更高意味着会被优先处理，这笔 RBF 交易覆盖了第一笔交易，从而实现了双重支付。这些攻击之所以奏效，是因为商家接受了未经确认的交易。

在同年早些时候发生的一起类似事件中，一些加拿大的 [比特币](https://iq.wiki/wiki/bitcoin) 持有者能够在不实际支付的情况下“兑现”他们的 [比特币](https://iq.wiki/wiki/bitcoin)。据报道，他们将 [比特币](https://iq.wiki/wiki/bitcoin) 发送到 [比特币](https://iq.wiki/wiki/bitcoin) ATM 机并提取了现金。在收到现金后，由于交易尚未被“确认”，他们取消了这些交易。[\[5\]](#cite-id-pkypi77zcbd)​
