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