雙花問題
出自 MBA智库百科(https://wiki.mbalib.com/)
雙花問題(Double Spending)
目錄 |
雙花,即雙重支付,指的是在數字貨幣系統中,由於數據的可複製性,使得系統可能存在同一筆數字資產因不當操作被重覆使用的情況
簡單來說,同樣一筆數字資產被重覆支付,即同樣一筆錢被花掉兩次或多次。
比如,我們微信錢包里有100塊錢,我們先去飯店吃了頓飯,結果微信出了bug,這一筆錢並沒有被銀行同步,還留在錢包里,於是我們又能拿著同樣的100塊錢去看場電影,這就屬於雙花問題。
雙花問題的類型[1]
一般來說,雙花問題分為兩種情況:
一種是記賬前雙花,比如同一筆錢,因為銀行同步延遲的問題,被多次使用;
另一種是記賬後的雙花,一筆錢花出去,銀行已經記賬,但如果你攻擊銀行,從銀行賬本上刪除了這筆花費,就可以再花一次了,即雙花。
在區塊鏈系統中,雙花問題會在以下情況下出現:
一、 由於共識機制導致區塊確認時間長,用一個數字貨幣去進行一次交易,可以在這筆交易還未被確認完成前,進行第二筆交易。
二、 控制算力來實現雙花,第一次交易被驗證通過並被記錄入區塊後,在該網路中有更高的算力驗證出新的更長鏈條,在該鏈條中這筆錢被第二次花費,由於第二次花費的區塊鏈條更長使第一次交易區塊所在鏈條為無效鏈條,這樣一來,第一次交易所在的區塊鏈被區塊鏈網路放棄,第一次花費的錢就又回到自己賬戶了,就導致了雙花問題。
還有許多情況,比如利用控制礦工費來實現雙花,或者一些人為了節省時間而接受0確認,這就很容易被攻擊者利用。
舉個簡單的例子,比如你在商場刷卡買東西,這個行為面臨三種風險:
1.首先,刷卡這個行為,驗證的是你的信用卡信息,也就是說只要給刷卡機提供同樣的信息,就能從你的賬戶里把錢刷走。沒錯,很多朋友都聽說過,有犯罪組織專門從事複製卡信息的勾當,然後“盜刷”你的卡。在一些不發達國家的小店裡刷卡就特別容易中招。
2.其次,負責記賬和結算的卡組織和銀行的伺服器可能被黑客攻破,造成數據泄露和偽造交易。回想這些年一波又一波某某大公司資料庫被黑客攻入的新聞,這危險並非危言聳聽(好吧,可能會有認真的人說這裡用詞應該是Cracker駭客,而非Hacker黑客,不過這年頭認真的人越來越少了)。
3.最後,還有一種可能,就是用卡人自己可能利用系統網路延遲,在進行第一筆交易、用完所有額度後,趁系統還沒記賬把額度扣完,立刻進行第二筆交易,形成詐P。當然,目前的結算系統延遲極小,這情況不太可能,不過像在優惠券或者搶購資格這種另外搭建的相對脆弱的系統網路上還是有可能的。
網上支付也一樣,犯罪分子可以用特殊手段(例如木馬,偽造WIFI等)截獲你跟伺服器之間的傳遞數據,如果商家加密技術太弱的話信息就可能被破解。有些國家很多時候數據乾脆是不加密的,所以大家才一直被警告不要亂裝程式、不要連可疑的WiFi。
比特幣解決雙花問題的措施[2]
為瞭解決雙花問題,我們日常的數字資產使用依賴於第三方信任機構進行。這類機構對數據進行中心化管理,並通過實時修改賬戶餘額的方法來防止雙重支付的出現。
1.首先每筆交易都要先確認對應比特幣之前的情況,要檢查它是否存在於用戶的UTXO中。如果不在,那麼該交易會被系統拒絕。
2.如果用戶用同一筆UTXO付給兩個人,系統中的節點只確認先接收到的那一筆。
3.當兩筆時間上很接近的交易被不同節點確認,區塊鏈將發生分叉。剩餘節點選擇在他們認為的最長鏈上構建新的區塊。
4.當其中一筆交易被6個節點確認後,它將成為系統最長鏈,可以認為這筆交易獲得了最終的確認。
比特幣雖然至今沒有出現過雙花問題,但也不是絕對不會出現,比如51%算力攻擊。但為什麼沒有人這麼做,首先是由於成本太高,沒有人能輕易掌握51%的節點。即便一個人已經掌握了51%的節點,那麼他就已經是比特幣網路當中的最大受益者,如果發動51%攻擊,可以短期獲利,但是比特幣的價值將會遭受毀滅性打擊,屆時他就會成為最大受害者。
雙花問題的防範措施[1]
在現實生活中,作為收款者來說,比如商店老闆,防範第一種雙花很容易,不以付款者的交易記錄為依據,只有確認自己賬戶上錢到賬才交付商品。比如用微信支付,不僅要看用戶出示的手機支付頁面,也要看自己的手機上是否收到。當然,如果很小額的交易,生意又忙,用戶也是街坊鄰裡,只看支付頁面也可以,這個小風險商店可以承擔。
在區塊鏈應用中,防範未記賬前的雙花也與之類似,最好的解決方案也是等記賬後,再完成交易,大額交易一般都是走這種路徑。不過,如果金額很小,人又熟,交易是可以不記入區塊鏈的,即沒有記賬的情況下,也可以完成支付。這叫“零確認支付”,只不過這種方式,收款方是要承擔被雙花的風險。
在生活中,比如微信已經記了賬,但黑客攻擊了微信的伺服器,商戶收款的交易記錄一旦丟失,商戶自然就受到了損失,付款者又可以使用原來的這筆錢。不過,這種情況極少出現,既然要記賬,那一定是非常小心保存賬本的。
區塊鏈應用也類似,整個區塊鏈技術的核心就是保障賬本的安全,記了賬就不能被雙花。但安全不是絕對的,即使記了賬,仍然有可能被雙花。因為,區塊鏈應用不是依靠中央銀行這樣的機構的權威來保障賬本安全的,而是依靠分佈世界各地的節點都保存統一份的賬本,並且由全世界的礦工用算力來競爭記賬,產生完全一致的新賬頁的。
當有人掌握了全網51%以上的算力時,就能夠將剛剛記過的賬頁作廢,把裡面的一筆花費恢覆成沒被花掉的狀態。這就是記賬後的雙花了,這種攻擊方法叫“51%攻擊”。這種雙花相對於記賬前的雙花比較難實現,因為掌握51%算力需要很多錢。但如果雙花的收益足夠大,攻擊仍然是有可能的。怎麼辦呢?
解決的辦法是,等待更多確認。51%的算力要作廢最新賬頁,其成功概率是51%,但作廢連續兩個新賬頁的概率就是51%*51%=26%,作廢3個的概率是13.3%,作廢6個的概率只有0.46%了。如果攻擊者沒有掌握51%的算力,只掌握20%的算力,那麼攻擊成功的概率就只有0.0064%了。
這樣,問題就簡單了。商戶可以根據交易金額的大小來決定如何防範雙花。
如果交易金額很小,比如賣支鉛筆,完全可以接受零確認,對用戶既省時又貼心。萬一雙花也不在乎。如果交易金額大一些,比如賣件衣服,那建議等待一個確認就可以了。不會有黑客為了你一套衣服動用51%的算力發起攻擊的。如果交易金額很大,比如買鑽石,那就要小心了。要根據全網算力的成本估算一下需要多少個確認,金額越大,需要的確認數就越多。
比如這個區塊鏈是10分鐘確認一次,全網51%的算力每10分鐘的成本是10萬元。你賣的鑽石價值100萬元。那麼你至少要10個確認以上才能交付鑽石。最好是20個以上確認。
總之,預防雙花攻擊,一個基本的原理就是,讓攻擊者賠錢的概率遠遠高於你被雙花的概率。
當然,為了預防雙花問題,區塊鏈本身從技術方面,也在共識機制的基礎上,引入了一些其他技術,比如時間戳和UTXO模型。通過它們,進一步提高區塊鏈的記賬安全性、以及雙花的作惡成本。
2018年5月份,一名惡意礦工獲得了比特幣黃金(BTG)網路至少51%算力,臨時控制了比特幣黃金(BTG)區塊鏈,在向交易所充值後迅速提幣,再逆轉區塊,成功實施雙花攻擊。攻擊者可能從交易所竊取超過388200個BTG,價值高達1860萬美元。惡意礦工通過對比特幣黃金(BTG)區塊鏈實施51%攻擊和雙花攻擊來謀取利益。