文/曲藝編輯/畢彤彤來源/PANews

1月6日爆出的以太坊經典(ETC,Ethereum Classic)遭歷史重組事件仍在持續發酵,1月8日,交易所Gate.io 發文表示已正式確認ETC 被“雙花攻擊”,目前已追踪到攻擊者地址。至此,近一年來發生在多個幣種發生的“雙花攻擊”又新添了一例。

自2018年4月開始接連發生的雙花攻擊事件,如同籠罩在區塊鏈上空的烏雲,不斷給持幣者們心頭添堵,目前提出的諸多“應對方案”也多是“亡羊補牢”。

這如洪水猛獸一般來勢洶洶的“雙花攻擊”到底是什麼?

微信图片_20190111114645.png

一、雙花攻擊是什麼

關於雙花攻擊(Double-spending),維基百科給出的定義是“一種數字貨幣體系天然帶有的潛在缺陷,單個數字代幣存在被重複使用的可能。”簡單來說,就是用同一筆錢發起兩次及以上交易。

舉個例子,A兜里只有十塊錢,想喝10元一杯的奶茶又想買10元一個的熱狗,在錢有限而慾望又急需滿足的情況下,可能A就要動歪腦筋,想著用10塊錢既買奶茶又買熱狗。

在傳統貨幣時代,A的這種想法很難實現。首先從貨幣角度分析,A可以動手製作貨幣來複製自己有限的財富,但不論以何種方法仿製貨幣,做出來的都只能是“假幣”,而假幣本身是可鑑別的,且製造假幣的風險和成本極高;從交易流程分析,如果是最原始的“一手交錢一手交貨”,那麼A除了把錢偷回來,沒有其他重複利用同一張紙幣的方法。如果是使用銀行或第三方機構作為中轉的支付手段,那麼中間機構的存在會使交易成為非常典型的中心化結構,“中心”可以確保交易的處理是有序且受到監控的,即使支付行為能夠同時發起,“中心”也會分先後依次處理交易請求,因此只有一筆交易可以成功,A即便手速極快地同時刷了兩次卡,也最終只能成功交易一次。

然而在區塊鏈世界,數字代幣使“雙花”變得“簡單”。依舊從貨幣和交易兩個維度分析,首先,數字代幣的實質是一串代碼,而代碼的複制不像現實貨幣的複制那樣是存在成本和真偽之別的,因此原理上通過複製數字代幣實現“雙花”是可行的,不過,中本聰在設計比特幣的時候,通過使用區塊鏈蓋時間戳並發布全網的方式,確保代幣不能重複使用;但是,在交易過程中,由於區塊鏈“去中心化”的特性,缺乏中心處理機構的保障,也沒有賬戶的概念,雙花攻擊仍然是有可能發生的。

二、實行雙花攻擊的5種方法

1.Race attack

在0確認時(即一次確認也沒發生前),向商家發起直接交易請求,如果商家同意不經過確認直接接受轉賬,那麼就給“雙花攻擊”提供了機會。只要付款人同時發起兩筆交易,一筆交易發給自己,一筆交易發給商家。商家0確認條件下接受轉賬,而發給自己的交易加了較多的給礦工的小費,更容易被打包成區塊並認證為正確交易,因此首先發起向商家的交易就會失效,從而實現資產回滾。

2.Finney attack

假設攻擊者自身在挖礦。在他生成的每個區塊中,都設置了從A到B的資產轉移,AB都處在其控制之下。為了達到欺詐目的,攻擊者不會對自己的挖礦行為進行廣播。相反,他會向某一商家發起交易,設置從A到商家地址C的付款路徑。商家可能在等待付款成功後交付貨物,而此時攻擊者就會公開廣播自己的區塊,A到B的轉賬會被認定優先級高於A到C的轉賬,從而使商家收款失效,資金回滾到攻擊者賬戶,雙花攻擊成功。

3.Vector 76 Attack

Vector76 Attack,是Race Attack和Finney Attack的組合,又稱“一次確認攻擊”,也就是交易即便有了一次確認,交易仍然可以回滾。這種攻擊的目標主要是設置只接受一次確認就支付的錢包(用戶出於省時目的),且錢包接受其他節點的直接連接並且使用靜態IP地址。

具體方式是:攻擊者控制AB兩個全節點,A全節點只連接到電子錢包的節點,B全節點與一個或多個運行良好的節點相連,攻擊者先後發起交易1和交易2,分別發送到攻擊目標和攻擊者自己的錢包地址,但交易1的礦工小費要遠高於交易2,並且兩筆交易都不廣播,這時攻擊者會在交易1所在鏈條上進行挖礦,該鏈條我們稱為分叉1,在挖到區塊後攻擊者不廣播而是在節點A發送交易1,在節點B發送交易2。

由於節點A只連接到電子錢包,節點B連接了更多節點,因此廣播發布更快,從概率上說交易2更容易被認定是有效的,所以交易1的款項會回滾。

4. Alternative Attack

這種攻擊主要發生在商家等待交易確認的過程中,但需要攻擊者有較多的算力,可能有浪費大量電力的風險。主要原理也是攻擊者同時發起兩筆交易,一筆指向商家,命名為交易1,另一個指向攻擊者自己的錢包,命名為交易2。在商家等待N次確認後,向攻擊者交付貨物,此時攻擊者憑藉較高的哈希率,挖到了N個以上區塊,則交易2的鏈條長度超過交易1,資金回滾,雙花成功;否則失敗。

5. 51% 攻擊

51% 攻擊又叫Majority attack,指攻擊者佔有超過全網50%的算力,可以創造一條高度大於原來鏈的新鏈,那麼舊鏈中的所有交易都會被重組,區塊被逆轉,通過反向交易實現雙花。目前BTG、XVG、ZEN、LCC接連遭受的雙花攻擊都屬於51%攻擊,最近發生在ETC上的事故也於8號上午被Gate.io認定為51%攻擊。

三、應對雙花攻擊的方法

區塊鏈上的賬戶就是一個二維碼的哈希地址,從比特幣白皮書上來看區塊鏈上的數字貨幣本身是不加密的,加密的是賬戶,而每個賬戶都有成對的公私鑰(公鑰能夠通過私鑰推出,並且能解碼由私鑰加密的數據,但是公鑰不能反推私鑰),保證了區塊鏈的數字貨幣是安全的,並且是難以偽造的。在進行貨幣轉移時都需要用自己的私鑰對交易進行數字簽名,全網通過公鑰對交易進行所有權驗證。區塊鏈從密碼學的角度解決了貨幣本身所有權的問題;從交易上,區塊鏈引入工作量證明,也叫共識機制。常見的有PoW、 PoS, 也就是區塊鏈去中心化的核心思想,用獎勵的方式讓全網一起參與計算,共同計算的過程就是挖礦。在區塊鏈的世界,要是用戶之間要發生一筆交易,那麼假設這雙方是A和B,那麼A要交易一個資產給B的話,需要這樣做:

1. 把數字資產p用A的私鑰簽名並且廣播到全網

2. 這時候,提交的資產被稱為UTXO,此時的交易是未經過驗證的

3. 全網通過A的公鑰去驗算是否這個數字資產屬於A的

4. 當通過後,全網的機器都把數字資產A的具體交易信息記錄進入區塊鏈賬本

賬戶進行兩次消費時,兩筆交易會同時向全網廣播,所有區塊鏈節點會同時收到廣播,每個節點上都會受到全網的所有區塊信息即全網賬戶信息,來驗證交易的合法性,當兩筆交易前後到達,則完全可以驗證是否為雙花攻擊;若同時到達,一部分節點收到交易A於是對本地數據進行了更新,則全網出現分叉。但區塊鏈的確認有兩個特點:

1. 存在與最長分支中的block

2. 至少有5個驗證過的block再其後面得到驗證

所以出現分叉之後,全網的礦工會繼續按照自己的區塊更新,再之後的幾次區塊中自然會更新出最長的一條區塊來,全網的所有礦工都以最長的區塊信息為準。當然這樣也不是絕對的,當賬戶控制了全網超過51%的算力,那麼就能實現賬本分叉,但是要實現超過51%算力的控制權,是需要相當大的代價和成本的。

參考資料:

Yewei Andy's Blog《區塊鏈——雙花問題》

比特評級《鏈科普丨雙花攻擊——區塊鏈世界的魔獸》

Odaily星球日報《捲走百萬美元後,攻擊者仍未放過ETC》

Wikipedia: Double-spending (https://en.wikipedia.org/wiki/Double-spending)