雙重支付攻擊:為何不能僅憑「已發送」來判斷區塊鏈交易
中級

許多用戶認為,一旦區塊鏈交易「發送」完成,資金就已安全到賬。但現實並非如此簡單。對於交易所、商戶和普通用戶而言,真正重要的不只是交易是否已廣播,還包括交易是否已被納入區塊、確認次數是否足夠,以及底層鏈是否存在重組風險。理解這些概念是防止「雙重支付攻擊」的基礎。
本文主要聚焦於工作量證明網路,其中確認深度和累積工作量是影響重組風險的核心因素。其他共識系統則使用不同的最終性機制。
什麼是雙重支付攻擊
「雙重支付攻擊」本質上是攻擊者試圖將同一數位資產花費兩次。
使用最直觀的例子:攻擊者僅持有 1 BTC,但同時發起兩筆相互衝突的交易。其中一筆支付給商戶或平台用於充幣、購買或服務;另一筆則將同樣的 1 BTC 傳送回攻擊者控制的錢包地址。由於兩筆交易均來自同一筆資金,鏈上最終僅能有一筆有效。若商戶或平台過早信任「尚未穩定確認」的交易,攻擊者後續可利用鏈重組或更長鏈的覆蓋,使先前看到的充幣記錄失效——而資產卻已釋放給攻擊者。
因此,雙重支付攻擊並非關於「複製資產」——它利用交易確認不足、競爭區塊產生或鏈重組,使同一資產在業務流程中被使用兩次。
為何會發生雙重支付攻擊?
儘管區塊鏈強調交易是不可逆的,但當交易剛送出時,這種「不可逆性」通常並不會立即成立。它會在經過打包、傳播和確認後,逐漸趨向不可逆。
鏈上交易通常會經歷多個狀態:
| 狀態 | 描述 |
| 已建立 | 錢包建立交易 |
| 廣播 | 交易已廣播至區塊鏈網路 |
| 待處理 | 等待礦工或驗證者打包並確認 |
| 已確認 | 交易已進入區塊,並開始累積確認數 |
| 失敗 / 掉落 / 替換 | 交易失敗,或已被替換或取消 |
風險常出現在「待處理」階段和「已確認但確認次數過少」階段。在這些時點,交易「看似存在」,但尚未足夠穩定。若網絡發生分叉,或攻擊者控制了大量哈希算力並構建了更長的鏈,包含原始交易的區塊可能會被拋棄——交易記錄也可能「消失」。
這被稱為「區塊鏈重組」。區塊鏈重組並非僅是刪除記錄,而是指整個網絡最終認可另一條鏈,導致原鏈上的部分區塊失效。如果充幣交易僅存在於被拋棄的分支上,平台先前看到的充幣記錄可能會失去有效性。
為何確認次數如此重要?
確認次數決定回滾交易的難度。
當一筆交易首次進入區塊時,通常僅有 1 個確認。隨著每個新區塊的產生,確認次數會增加——2 個確認、3 個確認、6 個確認,甚至 12 個確認。確認次數越高,要推翻該交易所需的回滾區塊數就越多,攻擊成本也越高。
這就是為何交易所通常不會在 0 到 1 次確認時立即為用戶入賬。此階段風險較高,特別是對於哈希算力較弱或曾發生過 51% 攻擊或區塊鏈重組的區塊鏈,此類情況需要更高的確認次數門檻。
📌 重要案例:ETC 2019 年 51% 算力攻擊與雙重支付事件
雙重支付攻擊並非理論上的威脅。2019年1月,以太坊經典(ETC)遭遇了一次涉及雙重支付交易的重大51%攻擊。
典型攻擊流程:
| 步 | 行動 |
| 1 | 攻擊者首先在 ETC 網絡上獲得顯著的哈希算力優勢,使其能夠私下挖出一條更長的鏈 |
| 2 | 攻擊者將 ETC 存入交易所 |
| 3 | 交易所在確認充幣交易達到所需的確認次數後,將資金入賬至攻擊者的帳戶 |
| 4 | 攻擊者迅速在交易所出售 ETC,將其轉換為 USDT、BTC 或其他資產,並提領資金。 |
| 5 | 同時,攻擊者繼續私下挖掘一條不包含充幣交易的更長鏈。 |
| 6 | 當這個較長的鏈被發布到網絡時,網絡接受其為新的主鏈,而包含原充幣交易的舊分支被回滾。 |
此攻擊模式的結果:交易所記錄中「已確認」的充幣資金消失,但攻擊者已將轉換後的資產提領,完成雙重支付。
這個案例說明了一個關鍵事實:即使交易已上鏈,若底層網路安全性不足,或攻擊者具備重新組織區塊的能力,該交易仍可能被回滾。區塊鏈交易的「最終性」並非絕對即時——它會隨著確認次數增加而逐步增強。
🛡️ 如何在交易期間避免雙重支付攻擊
防止雙重支付攻擊並非依賴「對方的截圖」或「交易雜湊存在」——而是要建立適當的確認和風險控制機制。
首先,請勿將「已廣播」誤認為「已收款」
用戶在錢包中看到「已送出」,或對方提供交易雜湊,並不表示資金安全。廣播僅表示交易已進入網路傳播階段——並不代表已被區塊確認。不可基於「待處理」狀態進行充幣入賬、釋放代幣、發貨或提供服務等操作。
其次,您必須驗證鏈上確認狀態
要判斷一筆交易是否可靠,至少需檢查:
-
交易是否已被打包進區塊
-
目前的確認次數是多少
-
交易是否具有異常替換、衝突交易或被丟棄的風險
對於高風險情境,不要只看「交易是否存在」,而要查看「確認是否穩定」。
第三,根據鏈的風險等級設定合理的確認次數
不同的區塊鏈具有不同的安全等級。主流高算力區塊鏈與小市值、低算力區塊鏈在遭受51%攻擊或區塊鏈重組時的成本差異極大。對於高風險區塊鏈,平台應提高充幣確認門檻;對於大額交易,也應設定更高的確認要求——這並非一刀切的方案。
第四,對異常充幣行為進行風控監測
以下行為應觸發額外審核:
| 異常行為 | 風險說明 |
| 多次大額充幣後,在短時間內迅速拋售並提現 | 典型的雙重支付攻擊路徑 |
| 頻繁使用歷史安全性較低的幣種進行充幣 | 哈希算力較低的鏈,攻擊成本也較低 |
| 在達到最低確認數後立即請求提領資產 | 可能利用確認不足的漏洞 |
| 在區塊鏈瀏覽器上出現異常延遲、衝突跡象或狀態不穩定的交易 | 可能正在進行的區塊鏈重組 |
這些行為通常與雙重支付攻擊的操作模式高度吻合。
第五,不要相信付款截圖或單頁狀態
截圖最容易偽造,也最容易誤導。無論是商戶付款、場外交易,還是充幣審核,請始終依賴區塊鏈探索者和系統風險控制驗證,而非聊天記錄、付款截圖或口頭聲明。
第六,理解「不可逆性」並不等同於「即時」
一旦區塊鏈交易達到足夠的確認次數,通常確實極難撤銷。但當確認次數不足時,交易仍可能因分叉、擁塞、替換或鏈重組而發生變動。安全教育中最常見的誤解,是將「區塊鏈交易不可逆」解讀為「一旦發送,就絕對安全」。這正是雙重支付攻擊得以成功的認知缺口。
💎 普通用戶與平台的安全提示
對於普通用戶而言,在交易獲得足夠確認之前,不應交付商品、數位資產或服務。特別是在場外交易、點對點轉帳以及與陌生人付款時,僅查看截圖而不檢查確認資訊會帶來極高的風險。
對於商戶和平台而言,真正有效的防護不能只依賴人工經驗判斷,而應採用標準化機制:
- 明確設定確認門檻
- 依不同區塊鏈設定差異化風險等級
-
異常提款路徑識別
-
高風險資產充幣的審核時間延長
-
對於曾有重組或 51% 攻擊歷史的幣種,請提高警覺
結論
雙重支付攻擊的核心並非「駭客複製一枚硬幣」——而是攻擊者利用尚未穩定確認的交易,在商業流程中製造「已付款」的假象。ETC 2019 年的事件已證明,只要底層鏈存在重組的可能性,未充分確認的交易就不應被視為最終收到。
安全交易的基本原則可歸結為一句話:
查看確認次數,而非截圖;查看最終性,而非表面狀態。
確認次數越高,成功進行雙重支付攻擊的窗口就越小。