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