什麼是雙重支付?
雙重支付是數位現金系統中可能出現的一個問題,在這種情況下,會同時向兩個收款人支付相同金額的資金。如未採取充分的對策,不能解決此問題的協議會從根本上遭受破壞。用戶無法驗證他們所收到的資金是否尚未在別處使用。
就數位現金而言,確保特定單位不會重複使用至為重要。假如 Alice 可收到 10 個單位,將它們複製並貼上 10 次,然後就能得到 100 個單位,這樣的話,整個系統就會遭到破壞。同樣,倘若她可同時向 Bob 和 Carol 轉出相同的 10 個單位,這樣的方案就無法運作。因此,要發揮數位貨幣的作用,必須要有適當的機制預防這種行為。
如何避免雙重支付?
中心化方法
中心化路線比去中心化替代方案實施起來更為容易。這通常需要一名監督員管理系統並掌控單位的發行及發放。雙重支付問題的中心化解決方案有一個比較好的例子,就是 David Chaum 的電子現金。
在這種情況下,如果用戶 (我們稱之為 Dan) 希望收到 100 美元數位現金,他需要預先通知銀行。如果他的帳戶中尚有餘額,隨即會生成一個隨機號碼 (或多個,若面額較小)。假設他生成五個號碼,每個號碼分配有 20 美元面值。為防止銀行追蹤特定單位,Dan 透過為每個隨機號碼新增一個盲化因子來混淆這些隨機號碼。
然後,他將這些數據交給銀行,銀行從他的帳戶中扣除 100 美元,並簽署訊息證明這五條訊息皆可兌換 20 美元。Dan 現在可以使用銀行簽發的這些資金進行消費。他光臨 Erin 的餐廳,吃了一頓飯,花了 40 美元。
Dan 可以移除盲化因子,展示與每個數位現金「票據」關聯的隨機號碼,作為每個單位的唯一標識符 (與序號很相似)。他向 Erin 展示了其中兩個號碼,Erin 現在必須立即向銀行兌換,以避免 Dan 在其他商家處同時支付。銀行將核實簽名是否有效,若一切準確無誤,會向 Erin 的帳戶存入 40 美元。
用過的鈔票現在實質上已銷毀,如 Erin 希望以同樣的方式使用她的新余額,就必須發行更多。
Chaumian 電子現金設定可能對私人轉帳大有用處。但它並不具備復原力,銀行是最核心的阻礙。發行的票據本身沒有任何價值,因為其價值完全由銀行單方面決定,看是否願意將其兌換成美元。客戶完全受制於銀行,必須看銀行的意願才能換取資金。加密貨幣正好可以解決這個問題。
去中心化方法
確保資金不會在沒有監督者的生態系中重複支付的挑戰更大。勢均力敵的參與者必須圍繞一套規則進行協調,以預防詐欺並激勵所有用戶誠信行事。
我們來重溫餐廳情境。Dan 再次來到餐廳,這次他留意到窗戶上貼有本店接受比特幣的標誌。他很喜歡上次吃過的美食,所以又點了一份。這頓飯花了 0.005 BTC。
但是,如前所述,交易僅在加入區塊並得到確認後才算有效。接受未經確認的交易很像前面例子所講的接受 40 美元電子現金,並不需要在銀行立即兌現,可讓付款人隨處使用。因此,建議 Erin 在接受 Dan 的付款之前等待至少 6 個區塊確認 (約一小時)。
比特幣的雙重支付
比特幣經過精心設計,可避免雙重支付攻擊,至少在按預期使用協定時如此。也就是說,如果收款人等待區塊中確認交易,付款人要想撤銷就沒那麼簡單了。為此,他們需要「反轉」區塊鏈,其所需要的算力有點不切實際。
但是,有些雙重支付攻擊的目標是接受未確認交易的相關方。例如,對於金額較小的購物,商家可能不願等待交易加入區塊中。忙碌的速食餐廳可能沒辦法守在網路邊處理每一單購買。因此,如果一家企業啟用「即時」支付,他們可能就會面臨雙重支付的情況。有人可能會點一份漢堡,付完款,再立即將相同金額的資金轉到他們自己的地址。如果費用更高,這筆新交易很可能會先得到確認,因此會使之前的交易失效。
進行雙重支付有三種比較流行的方法:
- 51% 攻擊:單個實體或組織設法掌控超過 50% 的算力時,可讓他們排除或修改交易的順序。雖然這種攻擊在比特幣上發生的概率極低,但在其他網路中發生過。
- 競賽攻擊:接連廣播兩筆使用相同資金的衝突交易,但只有一筆交易得到確認。攻擊者的目標是僅透過驗證對其有利的交易 (例如,將相同資金轉入受他掌控的地址) 來使付款失效。競賽攻擊要求收款人接受未確認交易作為付款。
- 芬尼攻擊:攻擊者將一筆交易預挖礦到一個區塊中,卻不立即將其廣播到網路,而是在另一筆交易中使用相同金額的代幣,然後才廣播他之前挖礦的區塊,這可能會使這筆付款失效。芬尼攻擊需要特定的事件發生序列,還取決於收款人是否接受未確認交易。
如我們所見,等待區塊確認的商家將大大降低遭受雙重支付攻擊的風險。
總結
雙重支付可讓用戶玩弄電子現金系統來取得經濟收益,多次使用相同金額的資金。通常來說,由於該問題缺乏足夠的解決方案,因而妨礙了此領域的發展進程。