雙花問題是數位現金系統中的潛在問題,是指同一筆資金同時支付給兩位收款方。如果沒有適當對策,僅憑協議無法徹底解決該問題,畢竟用戶無從驗證自己收到的資金是否還曾經付給他人。
在數位現金領域,必須確保特定的貨幣單元不可複製。如果Alice可以接收10個貨幣單元,並複製貼上10次,然後自己擁有了100個貨幣單元,那麼整個系統將崩瓦解。同樣,如果她能夠將同一筆10個貨幣單元同時發給Bob和Carol,那麼系統同樣無法運作。因此,必須有合適的機制來防止這種情況發生,才能確保數位貨幣正常運作。
銀行可使用盲簽章方式向使用者發行仿現金數位資產(可匿名點對點交易)。密碼學家大衛‧喬姆(David Chaum)於1982年發表的論文《不可追蹤支付的盲簽名技術》對此進行了詳述。
在這種情況下,如果用戶Dan希望收款100美元的數位現金,必須先通知銀行。如果他帳戶有餘額,就會產生一個隨機數字(面額較小就產生多個)。假設產生了五個隨機數,每個數的價值為20美元。為防止銀行追蹤到特定的貨幣單元,Dan透過為每個隨機數增加盲因子來混淆視聽。
然後,他將這些資料交給銀行,銀行從他的帳戶中扣除100美元餘額,並對訊息進行簽名,證明五個資訊各自可兌換20美元。這時,Dan就能使用銀行發行的數位現金了。他去Erin的餐廳用餐,花費40美元。
Dan可以消除盲因子,公開與每個數字現金「鈔票」相關的隨機數,該隨機數即為每個貨幣單元的唯一識別碼(大致等同於序號)。他向Erin公開其中兩個隨機數,Erin須立即向銀行兌換這筆資金,以防Dan支付給其他商家。銀行會核實簽名是否有效,如果核對無誤,就向Erin的帳戶存入40美元。
用過的「鈔票」隨即銷毀,如Erin希望以同樣的方式使用帳戶餘額,則須發行更多鈔票。
Chaumian eCash機制對私人轉帳極具價值。但是,eCash機製本身無抵禦能力,由於銀行是中心化節點,一旦系統出錯就一損俱損。銀行發行的鈔票本身沒有價值,價值完全源自於銀行願意把鈔票兌換成美元。客戶受制於銀行,必須依靠銀行的信譽才能運作資金。這正是加密貨幣所要解決的問題。
比特幣白皮書呈現的最大創新就是雙花問題的解決方案。中本聰提出了一種史無前例的資料結構,即現在廣為人知的區塊鏈。
區塊鏈其實只是具有某些獨特屬性的資料庫。網路參與者(稱為節點)運行專門的軟體,讓節點之間相互同步自己的資料庫副本。這樣一來,全網都能審計可追溯到創世區塊的交易歷史記錄。由於區塊鏈可公開查看,發現並防止詐欺行為就會變得更輕鬆,例如識別出試圖雙花的交易。
用戶發布交易時,不會立即加入區塊鏈中,必須先透過挖礦才能裝入區塊。因此,只有區塊入鏈,收款方才可確認交易有效。否則,如果發送者把同一筆代幣支付到其他地方,收款方將面臨損失資金的風險。
交易一經確認,代幣所有權便會分配給新用戶,並獲得整個網絡的驗證,因此代幣不得再雙花。基於這個原因,許多人建議在接受有效付款之前先等待多次確認。每個後續區塊都會大幅增加修改或重寫鏈的工作量(例如發生51%攻擊的情況)。
讓我們回到餐廳的情境。 Dan回到餐廳,這次注意到了窗口「本店支持比特幣支付」的貼紙。他對上次的用餐念念不忘,又點了同樣的食物,花費0.005枚比特幣。
Erin向Dan顯示公共地址,即轉帳地址。 Dan發布該筆交易,本質上就是一條署名消息,宣告自己擁有的0.005枚比特幣現已歸Erin所有。無需過多細節,任何人看到Dan的簽名交易都可證實代幣確實歸他所有,因此Dan有權發送。
然而如前所述,該交易只有裝入區塊獲得確認後才有效。接收未確認的交易就像先前接收40美元的eCash一樣,如果不立即透過銀行兌現,發送方可以將該筆資金花費到其他地方。因此,Erin應該至少等待6個區塊確認(約一小時)之後,再接受Dan的付款。
比特幣經過精心設計,可防止雙花攻擊,至少在協議使用符合預期的情況下確實如此。也就是說,如果有人正在等待某筆交易獲得區塊確認,則發送者將無法輕易撤銷該筆交易。只有「反轉」區塊鏈,才能撤銷交易,這需要無比龐大的哈希算力。
然而,有些雙花攻擊專門針對接受未確認交易的使用者。諸如小額購買,商家就不想等到交易裝入區塊。忙得團團轉的速食店可能等不了網路處理每筆交易所需的那麼長時間。因此,如果商家啟用了「即時」付款,就有可能面臨雙花問題。有人可以在點了漢堡付完款後,立即又將同一筆資金發回自己的地址。只要後面那筆交易的手續費用更高,就有可能先被確認,繼而導致先前的交易失效。
目前有三種普遍的雙花攻擊:
51%攻擊:單一實體或組織設法控制超過50%的雜湊率,以此刪除或修改交易順序。這種攻擊在比特幣網路發生的幾率微乎其微,但在其他網路中發生過。
競爭攻擊(Race attack):使用同一筆資金連續發布兩筆有衝突的交易,但僅一筆交易得到確認。攻擊者的目標是透過驗證對自己有利的交易讓另一筆支付失效。例如,將資金發送到他自己控制的地址。競爭攻擊一般會讓接收方接受一筆未確認的交易作為付款。
芬尼攻擊(Finney attacks):攻擊者預先挖礦一筆交易放入區塊,但並未立即發佈到網路中。相反,他將同一筆代幣支付到另一筆交易中,然後才發布先前已挖出的區塊,從而使支付無效。芬尼攻擊的必要條件是事件依照特定順序發生,能否成功也取決於收款方是否接受未確認的交易。
如我們所見,商家只要耐心等待區塊確認,就能大幅降低風險,避免成為雙花受害者。
用戶可以利用雙花攻擊篡改點對點電子現金系統,多次利用同一筆資金,謀取不當得利。以往由於這個問題不得不到很好的解決,該領域的發展一直裹足不前。
然而萬幸的是,盲簽名的使用成為了中心化金融方案中一個令人矚目的解決方案。緊隨其後,工作量證明機制和區塊鏈技術的發展催生出比特幣這種強大的去中心化貨幣形式,進而為數以千計的加密貨幣項目提供了靈感。