1. 程式人生 > >區塊鏈中的“雙花”問題

區塊鏈中的“雙花”問題

文章出處:https://www.cnblogs.com/10zhang/p/8616991.html

我們舉個簡單的例子,比如你在商場刷卡買東西。這個行為面臨三種危險:

1. 首先,刷卡這個行為,驗證的是你的信用卡資訊,也就是說只要給刷卡機提供同樣的資訊,就能從你的賬戶裡把錢刷走。沒錯,很多朋友都聽說過,有犯罪組織專門從事複製卡資訊的勾當,然後“盜刷”你的卡。在一些不發達國家的小店裡刷卡就特別容易中招。

2. 其次,負責記賬和結算的卡組織和銀行的伺服器可能被黑客攻破,造成資料洩露和偽造交易。回想這些年一波又一波某某大公司資料庫被黑客攻入的新聞,這危險並非危言聳聽。(好吧,認真的geek會說這裡用詞應該是cracker駭客而非hacker黑客,不過這年頭認真的人越來越少了)

3. 最後,還有一種可能,就是用卡人自己可能利用系統網路延遲,在進行第一筆交易、用完所有額度後,趁系統還沒記賬把額度扣完,立刻進行第二筆交易,形成詐騙。當然目前的結算系統延遲極小,這情況不太可能,不過像在優惠券或者搶購資格這種另外搭建的相對脆弱的系統上還是有可能的。

網上支付也一樣,犯罪分子可以用特殊手段(例如木馬,偽造WIFI等)截獲你跟伺服器之間的傳遞資料,如果商家加密技術太弱的話資訊就可能被破解——嗯,某國很多時候資料乾脆是不加密的。所以大家才一直被警告不要亂裝程式、不要連可疑的WiFi。

區塊鏈是怎麼處理這些問題的呢?我們以比特幣交易為例,逐條分析。

1. 首先,比特幣擁有者想要完成某項交易,比如買手機吧,他會向全網廣播:我小A向小B支付1個比特幣(嗯,這金額大致可以買個iPhone 7P)。

與這條資訊一起的,還有一條加密資訊,這條資訊是用Hash函式對上一條資訊加密生成一個摘要後,再用A的私鑰進行加密的(稱為私鑰“簽名”)。

接收到這條資訊的B和其他使用者先用同樣的Hash函式對明文資訊生成摘要,再用A的公鑰對加密資訊進行解密,如果解密得到的摘要與明文生成的摘要相同,便認為資訊確實是A發出的,且沒有經過篡改。

A的公鑰和Hash是公開的,私鑰則無法算出,只有A知道,這樣就既保證了交易的達成,又保證了A的資訊無法被竊取。

2. 其次,由在POW(運算力證明)中勝出的礦工負責這段時間的記賬(我們之前講過,“閱讀原文”),事先完全無法知道究竟哪個礦工來記賬,黑客也就無從黑起,除非碰運氣。

3. 最後,在傳統系統中因為結算速度極快而不太可能的情況,在比特幣網路中反而可能性比較大。如昨天所說,因為沒有中心化的管理者,交易確認的時間要長很多,使得這種詐騙有可能實現,這就是比特幣的double spending雙重花費問題,簡稱“雙花”。

對於雙花問題,比特幣網路,或者說區塊鏈網路,是這麼應對的:

-每筆交易都需要先確認對應比特幣之前的狀態,如果它之前已經被標記為花掉,那麼新的交易會被拒絕。

-如果先發起一筆交易,在它被確認前,也就是這個時間段的交易還未被記賬成區塊block時,進行矛盾的第二筆交易,那麼在記賬時,這些交易會被接收。

-上面只是小伎倆,現在tricky的部分開始了。如果詐騙者刻意把第一筆交易向一半網路進行廣播,把第二筆交易向另一半網路廣播——這個詐騙者智商還挺高——然後兩邊正好有兩個礦工幾乎同時取得記賬權,把各自記的block釋出給大家的話(這個概率很低),網路是不是會混亂呢,區塊鏈的規則是這樣的:先選擇任意一個賬本都可以,這時候原來統一的賬本出現了分叉:

但是在兩個賬本中各只有一筆交易,詐騙者不會有好處。接下來,下一個礦工選擇在A基礎上繼續記賬的話,A分支就會比B分支更長,根據區塊鏈的規則,最長的分支會被認可,短的分支會被放棄,賬本還是會迴歸為一個,交易也只有一筆有效:

-那麼如果這個詐騙犯真的智商非常高,他會這麼做:如果是A分支被認可(B也一樣),相應交易確認,拿到商品之後,立刻自己變身礦工,爭取到連續兩次記賬權,然後在B分支上連加兩個block,就像這樣:

於是B分支成為認可的分支,A被捨棄,A分支中的交易不再成立,但他已經拿到商品,詐騙成功。

在B分支落後的情況下要強行讓它超過A分支,其實是挺難的,假設詐騙者掌握了全網1%的計算能力,那麼他爭取到記賬權的概率就是1%,兩次就是10的負4次方。但這個概率還沒有太低。

應對辦法呢?建議大家在一筆交易確認後,也就是一個block被記下來之後,再等5個block,也就是等6個block被確認後再把交易對應的商品交付。這樣,詐騙者還能追上的概率就幾乎為0了。除非……

如果詐騙者掌握了全網50%以上的計算力,那麼,即使落後很多,他追上也只是時間問題,這就是比特幣的“51%攻擊”。

這就是區塊鏈需要警惕的問題。雖然在比特幣網路中,使用者已經極多,全網算力總和非常大,如果真掌握50%以上,也不用靠這個詐騙了,挖礦的收益都更高。但是在小的區塊鏈網路中呢?況且,沒有50%以上的算力,還是有機會成功的,只是概率低而已。