2900萬,沒了!——虛擬幣世界的真實戰斗

1月3日,比特幣價格再創新高,最高超過3.4萬美元,比特幣的漲跌風云讓虛擬幣家喻戶曉,由于使用了區塊鏈技術,包括比特幣等虛擬幣展現了它們的安全性。但是,虛擬幣交易背后仍暗藏危機,即算力超過51%情況下的“雙花”攻擊。本文源于一個真實案例,AE虛擬幣交易中發生一場關乎2900萬元的戰斗—— 一名“礦工”發動了“雙花”攻擊,價值2900萬的AE幣消失了!另一方管理員圍追堵截,緊急補救,殘酷的戰斗后最終結局如何?到底什么是“雙花”攻擊?作者將從電子貨幣的基礎概念講起,幫讀者厘清虛擬幣背后的運作原理,并通過對這次交易的復盤講述虛擬世界中的戰斗始末,現實中的云淡風輕,與虛擬世界的腥風血雨形成了鮮明對比。

撰文|徐曉

我們生活在網路時代,虛擬的網路和現實世界相互交互:讀書、買票、購物……當然,還有錢:真實的鈔票(人民幣)和虛擬的貨幣(虛擬幣),

說到虛擬幣,人人都知道比特幣,但除比特幣外,還有很多種虛擬幣,AE就是其中的一種,

劉洋是一個虛擬幣項目的觀察員,他創立的AEknow,是AE幣對應的維護平臺,專門對AE及其與其他貨幣的交易進行記錄,以便各個網上交易所或者交易者查詢,也便于監察交易和技術異常,

不錯,劉洋就是AEknow的司令官。

他平時的工作,就是看看平臺是否正常、市場是否穩定。因為絕大多數的工作都是計算機自動執行的,他平時很閑。

12月7日中午,劉洋像往常一樣在網上瞎逛。中午的太陽暖洋洋的,論壇里也是云淡風輕,劉洋正在跟人吹水,

突然,大事不好!有人發動了一次“雙花攻擊”,從AE幣的交易所偷走了2900萬元!

2900萬!沒了!

誰偷了這2900萬元?他是怎么干的?交易所能把錢追回來嗎?

在虛擬幣的世界里,真正的戰斗開始了,

為了弄清戰斗過程,讓我們從基本的概念講起。

電子貨幣與雙花攻擊

電子貨幣并不是新概念,上了年紀的人應該都記得磁卡電話,磁卡上記了充值的錢數,就代表一種電子貨幣。當你用磁卡打完電話,通信系統會扣除通信費,再將剩余的錢數寫回磁卡。雖然磁卡本身不是貨幣,但是,磁卡被使用的過程,就跟花真的錢是一樣的。

那么,跟真錢相比,磁卡會有什么特別的問題呢?那就是當系統有漏洞時,一份錢可以當兩份錢花!因為花了兩次,所以叫“雙花”(double spending),

最早的卡式公用電話(用電話卡打電話)就出現過導致雙花的漏洞,[1]通過拷貝電話卡磁條上的資訊,不法人員就可以造一張假卡,而假卡上的金額資訊,就像是卡上的錢沒有被使用過一樣;實際上,這筆錢已經在真卡上被扣除過了,更有甚者,真卡只是用來拷貝,假卡則無數次被滿額使用——這已經不是雙花,而是無限花了。

數字世界的最大問題,就是資訊可以被拷貝而不失真,電子貨幣的記錄,只是數字世界的一種資訊而已。這樣就面臨一個重大問題:可以造假錢!一旦成功,就可以雙花,真爽!

所以,貨幣電子化的過程,一直都要解決雙花問題。

2

數字簽名

要解決“雙花”,第一步,是實現數字簽名

什么是數字簽名?它是一種對數據進行加密的技術手段,

在數字世界里,加密和解密都是對字符串進行運算變化。加密就是把要傳送的資訊(明文)和加密密鑰(也是一串字符)一起進行某種運算,變成密文。顯然,解密密鑰就是能把密文變回明文的運算所需要的字符串,

加密密鑰和解密密鑰可以相同,這就是對稱加密;也可以不同,這就是非對稱加密,非對稱的加密系統通常不是用來保密,而是用來保證數據的真實性、完整性和不可抵賴性——數字簽名就是干這個用的。它是通過加密運算獲得的、比較短的一串字符,通常附綴在一段文件數據資訊的后面。

數字簽名的真實性,將確保數據的發出者就是簽名者本人;其完整性,則保證數據沒被改動過;不可抵賴性,則保證如果發出者本人在事后改動數據,就會反映到數字簽名中,使其更改行為露餡。

數字簽名如何保證這三個性質呢?

資訊的發出者將解密密鑰公之于眾(“公鑰”),而將加密密鑰自己保留(“私鑰”),因為除了資訊發布者誰也沒有加密密鑰,別人根據他發出的數字簽名和公鑰,只要解密出規范的符合其文件的結果,就說明這個數據肯定來自于他,且未被別人更改過。容易理解,這就保證了數據的真實性和完整性。

如何保證數據沒有被資訊發布者本人改過呢?這是因為他并不能控制數字簽名的具體結果,數字簽名依賴于一類特殊的數學運算——散列函數映射,也就是幣圈的人一天到晚講的“哈希”。哈希運算把加密密鑰和你傳送的數據一起加密產生一個新的字串,叫做哈希字串,簡稱“哈希”或者“哈希值”。哈希值的特點是,只要文件數據稍微改一點點,哈希值就會出現劇烈變化,這個特點非常重要,使得數據發布者本人也沒法自己改動而不認賬。

那么實現了數字簽名,使用電子貨幣的每一次消費就可以有不同的數字簽名產生,這樣看來是可以有一定辦法對付“雙花”了。

3

虛擬幣

2000年開始,由于互聯網游戲的急速發展,各個網游公司都開始發行自家的虛擬的游戲幣。這些游戲幣往往需要玩家充值,用真金白銀來買;同時玩家們也可以通過私下交易,獲得虛擬的游戲幣,并用虛擬游戲幣來買游戲中的道具,升級打怪。這些游戲公司之間的游戲幣就像真實世界的貨幣一樣,出現了彼此間的交易結算價格;出于掙錢需要,有的游戲公司加大了游戲幣發行數量,結果還出現了通脹,

因此,就有學者和IT從業者開始研究,是否可以真的“發行”一種虛擬的網路電子貨幣,除了能抵御雙花攻擊,還沒有發行中心控制,這樣就能合理抵御貨幣通脹,這種沒有中心控制的機制,叫“去中心”,就是貨幣發行和交易都不依賴于某個權威的第三方(比如銀行),而是由平臺上的交易人和“鑄幣”人共同維護和交易,

2007年,有位化名“中本聰”的人(或者集團)發了一篇網文,結合一系列學者的設想,設計了一種去中心的網路電子貨幣,就是我們現在稱的虛擬幣的最早一種——比特幣。[2]并且,從設計開始,就要求整個系統有抵御雙花攻擊的功能,

數字貨幣的交易如圖一所示。一個交易(transaction)記錄包括了買者的公鑰(Public Key),和一個數字簽名(Signature),這個數字簽名是通過上一次記錄加上買者公鑰的資訊,以賣者的私鑰為基礎進行哈希運算得到的,一個數字貨幣從發行開始,會將每次交易記錄在記錄表中。歷次交易的資訊都是可以驗證(verify)的:根據表中上一次交易的公鑰,可以計算驗證緊接著的一次交易的數字簽名是否正確。

這一次次的數字簽名,對應著一個數字貨幣的所有交易,構成了一個鏈,每個交易記錄是一個區塊(block),而這條鏈就是區塊鏈(block-chain)。當然,隨著設計的變化,這個鏈變得復雜,但是區塊鏈的基本含義,沒有變。


圖1 電子貨幣交易示意(摘自參考文獻[3])

4

防止虛擬幣“雙花”

顯然,如果這個數字貨幣的每次交易不能由一個權威的部門來保證交易的權威性,僅依靠貨幣上的記錄,就不能防止某個賣家用兩份或多份相同的拷貝去進行交易,即進行“雙花”。即使在事后這些交易被發現,往往也太遲了。

因此,中本聰提出了一個的補充方案,實現對交易的控制,

4.1 去中心的時間戳

首先,要給貨幣的每次交易過程,蓋上時間戳。也就是說,在每次交易中,記錄正確交易的時刻。這樣,如果出現雙花的話,我們可以追溯到雙花發生前的最后一筆交易,并去掉錯誤的交易,

但是,這個方法需要第三方系統來產生和認可時間戳,所以它不是去中心的,不好。于是,中本聰搞了個“基于對等基礎的分布式時間戳服務”(distributed timestamp server on peer-to-peer basis)[4],采用了“工作量證明”(POW,proof-of-work)的方法,

名字聽起來很可怕,其實方法很簡單:只要在網路上準備了一堆記賬人就行了。每當有新的交易產生,那么交易人就在網路上廣播交易資訊;記賬人如果發現交易合法,而不是雙花資訊,就會把好幾條不同記錄合在一起打在一個大包里,確認有關資訊,并蓋上時間戳,

接下來是困難的部分了:如何確認這個交易記錄?所有的記賬人,都會按照某種開始就定好的要求,來計算交易記錄塊的大包的哈希值,按照中本聰的設想,記賬人的機器運行的程式,會產生一個隨機數,然后記賬人根據交易記錄塊和這個隨機數,并按照由程式自動設定的難度,求取一個滿足要求的哈希值,比如,一種叫SHA-256的哈希運算就要求,在這個哈希值開始運算的時候,要代入若干個0bit來計算,隨0bit的數量增長,這個哈希運算的運算量會指數級上升。對計算機而言,這種哈希運算,需要耗費大量的運算時間和電力,加上一點運氣,才能求到一個滿足要求的哈希值。最先求出哈希值的記賬人,把他的結果在網路上向所有人廣播。別的記賬人會通過計算來認證并記錄這個結果,并等待下一次交易的到來,

需要注意的是,計算得到滿足要求的哈希值很難,但是驗證某個哈希值是否滿足要求卻很容易。這樣的區塊鏈,每做一次記錄,都需要大量的機時,同時還要大量的記賬人共同記錄并且證明。如果想從某個位置開始改一條新鏈,就需要大量的機時和記賬人重新認可,費時費力,所以這種方式叫“工作量證明”——通過機器的“工作量”證明相應記錄及更改,

4.2 選擇更長的鏈

剛才說的這種方式有一些細節問題需要解決,

有時候,兩個交易同時出現,都請求記賬,那么先記哪一個呢?不同的記賬人由于所處位置不同,網路延遲有差別,雖然聽到消息的時間相距極近,但還是有先后差別。這個時候,記賬人可以記兩條鏈,兩個鏈的先后次序是不同的,一條是甲交易在前,一條是乙交易在前。事后,記賬人可以接收下次交易記錄時別人公告的記錄,并根據別人的記錄的長度,而決定采用更長的那條鏈,因為更長的那條鏈代表工作量更多,更符合記賬人的共識。

如果由于某種原因(網路的某個連接阻塞了,或者記賬人關機下線了),有些記賬人沒聽到某次廣播,就會出現漏記的情況。當他聽到新的廣播時,很容易發現自己漏記,如果收到的鏈比自己的鏈長,那么他將選用新的長鏈,并做出調整。

簡單地說就是,所有的記賬調整,都是更長的鏈會得到記賬人的認可,

4.3 記賬人的誠實

鏈的增長,是跟參與者的眾寡相關的,從概率上講,參與的人越多的那條鏈,計算出正確結果的速度越快,因此也將得到最長的鏈,又如何確保他們記賬的可靠性?

記賬的可靠性,是靠記賬人的誠實來保證的,如果,參與的人主要是誠實的,那么誠實的人就會抵御不誠實的人的破壞。為什么他們會自覺地保持誠實?

因為利益,

去中心的貨幣是沒有發行方的。參與創建虛擬幣的玩家,從某一臺機器隨機產生的隨機數,按照哈希算法,算出合乎要求的結果,就得到了新的虛擬幣,這個過程叫“出塊”,虛擬幣是玩家們用機時“挖”出來的結果,這個工作跟以前的挖金礦是一樣的——這就是“挖礦”和“礦工”的由來,

參與記賬的記賬人(還是那些“礦工”),會從記賬中分得好處。每成功記一次帳,那個成功的礦工,就要從比特幣的幣值里分一筆交易費,叫“油費”

在后來很多現實中已經運作體制中,挖礦“出塊”和記賬權合二為一,只有“出塊”的礦工,才有對下一次出塊前的所有交易的記賬權利,也才擁有這筆油費,

因此,維護這個體系比破壞這個體系,更有利于礦工。所以,最后礦工們就會保持誠實,

5

依然存在的雙花攻擊

整個方案,似乎很完美。

但是真實的系統,總是有漏洞的,

認可更長的鏈,這個看來非常可行的防御策略,恰恰帶來了問題。

比如說,網路由于某個關鍵節點阻塞而暫時被分為兩個部分,這兩部分在通信沒有恢復時各自記賬,就出現了分叉,作為一種補救措施,網路通信恢復之后,兩個部分就要比較誰的鏈長,鏈更長的記錄,將被認可。而那些鏈不夠長的數據,就被覆蓋了,而那些被覆蓋掉的數據對應的交易,叫“同步”失敗了。因為蓋時間戳的行為,是表明某個時間點發生的事件,所以叫“同步”,現在這些交易的數據被覆蓋了,丟失了,也就意味著“同步”失敗。數據覆蓋的過程,也稱為數據回滾

也可能會出來一個破壞者,故意制造一個分叉,如果破壞者的力量強大,在他自己控制的網路部分,相比于另外被分隔的那一部分制造了更長的鏈;那么他就可以在網路通信恢復以后,用自己的長鏈打敗另一部分的短鏈;這樣,破壞者就成功實施了一次攻擊。

攻擊需要長鏈,所以,破壞者的算力必須比另一邊更強大,換句話說,攻擊方的“礦工”的人數至少要超過一半以上(至少是51%)。所以,這種攻擊就叫51%攻擊,

有了足夠的算力,就可以實施51%攻擊,再經過巧妙的組合,就可以發動雙花攻擊。

攻擊者先對網路關鍵連接進行阻塞——比如說,用大量無效的數據使關鍵連接由于負擔過重而癱瘓——制造一次網路分叉;然后分別在分叉的兩個部分發起不同的交易,在自己算力強大的部分,可以讓虛擬幣轉個整圈,重新回到自己手上,或者只是參與記賬或正常產生“出塊”,不讓自己虛擬幣參與交易;而在分叉的另一部分,攻擊者則將自己的虛擬幣賣出,轉換成其他的虛擬貨幣,或者是真的現實世界中的貨幣,

等一切準備就緒以后,攻擊者停止對網路的阻塞,分叉的兩部分就又合并在一起。因為攻擊者的算力強大,所以他算出來的鏈更長,就可以替換另一部分的鏈——成功實現51%攻擊。另一部分的數據被覆蓋,發生數據回滾,它記錄的交易數據丟失,同步失敗。此前進行的虛擬幣交易的記錄被抹去,攻擊者以前的虛擬幣賣出記錄消失,因此他就可以把他的虛擬幣再賣一次了——這就是雙花。

6

賊來了

讓我們回到12月7日中午,AEknow的司令官劉洋正在各個論壇瞎逛。

如果你還記得那天的天氣,那天中午的溫度是攝氏24度,在12月真是個暖和日子,貓在顯示器后面打著瞌睡,地里的韭菜也長勢良好,一切看起來都非常nice。


但是,電腦里的數據記錄居然正在回滾!一條長鏈悄然而至,如同黑云,把正常的數據覆蓋了!劉洋趕緊發出通報:


上面就是劉洋發出的預警:12月7日12: 57分,他檢查了自己平臺的資料庫,發現有舊的記錄丟失,像是發生了數據回滾,有更長的鏈來覆蓋就數據,因此,他向論壇及交易所發出預警,說是發生了分叉,極有可能是51%攻擊。


到了2點17分,劉洋檢查了各個交易所的記錄,發現這個賬號囤積了約2700萬元的token,大約相當2700萬元人民幣,其中的150萬已經完成了雙花攻擊。(事后清點,預計攻擊者囤積的AE幣大約為2900萬元,)

AE幣的世界,戰斗打響了,

7

到底發生了什么

根據劉洋的復盤[5],事情的經過是這樣的:

7.1 攻擊者的攻擊

測試

2020-12-02 08:35:47 在351373高度(這是行話,指的是區塊鏈長度為351373),攻擊者(具體是誰并不清楚)先測試了一下,成功出塊,挖出了虛擬幣,也就是說,生成了一個初始的虛擬幣(一般行話叫token)的區塊,

買入token

2020-12-03 22:34:34 從352135高度開始,攻擊者開始在O交易所逐漸購買用于攻擊的token,持續到353153高度(2020-12-06 02:06:50),累計收集價值大約是2900萬元的token,準備用于攻擊。

挖礦測試

2020-12-06 02:46:56 在353170高度,攻擊者已經收集了足夠多的token,啟動了挖礦測試,開始頻繁地正常出塊到353187(2020-12-06 03:04:56),

網路分叉

2020-12-06 04:26:26 估計從353224高度開始,攻擊者搞了個網路分叉,把自己挖礦的網路獨立出來。他在自己的網路中,挖出了一條未公開的私鏈,并在2020-12-06 04:26:26挖到353255高度;而公開鏈在2020-12-06 04:38:38出塊。這條私鏈一直挖到353838高度(2020-12-07 10:16:33),

私鏈上的準備

2020-12-06 04:32:50 在私鏈353230高度,攻擊者往自己錢包轉賬2750萬元的token,在353634高度(2020-12-07 00:30:06)轉賬80萬元的token;在353634高度(2020-12-07 00:30:06)轉賬70萬元的token;合計約2900萬元的token。

公鏈上的準備

2020-12-06 04:45:15 在公開鏈353227高度,攻擊者開始往O交易所逐漸充值2750萬元的token,將這些token屯在交易所,用于尋找賣家脫手,直到353622高度(2020-12-07 01:15:30),時間跨度為20小時。在353643高度(2020-12-07 02:29:54),另外兩個賬號分別充值了70萬元和80萬元的token到交易所,總之,合計大約2900萬元的token在交易所內操作,其中一部分被轉出到其他交易所。

雙花攻擊

2020-12-07 10:16:33 在2020-12-07上午10點15分左右,攻擊者去掉網路阻塞,廣播了自己更長的私鏈,以353838的高度覆蓋了較短的公開鏈353803高度(2020-12-07 10:10:14);初步完成雙花攻擊,其所有網路節點的算力仍沒有立刻撤去,而是繼續參與挖礦,

攻擊結束

2020-12-08 03:08:13 攻擊者的算力挖出354116高度,此后沒有新的出塊。

7.2 交易所和平臺的反應

回顧

2020-12-07 10:16:33 攻擊者廣播了自己更長的私鏈,以353838的高度覆蓋了較短的公開鏈353803高度(2020-12-07 10:10:14);初步完成雙花攻擊。

此后的進展

2020-12-07 11:00 H交易所檢測到區塊的數據回滾,關閉充提(也就是說,停止各種交易),

2020-12-07 11:30 AE社區彭坤發出H交易所暫停提幣的消息,宣布錢包維護,暫停AE錢包的充值和提款;AEBox、AEKnow、WeTure幾個維護平臺初步認為H交易可能遭遇節點的數據無法同步,即交易無法正確記賬的問題(根據H交易后期公告,他們發現區塊回滾情況)。

2020-12-07 12:30 AE社區馬良再次在群聊提出,由于數據回滾,AEBox曾經成功的交易失效;我們開始深入討論,幣贏、Beepool也表示發現區塊同步問題,

2020-12-07 12:57 AEKnow對比區塊記錄資料庫和鏈上數據后,確認交易的正常數據遭遇數據回滾而丟失,Beepool確認交易丟失,區塊丟失,并提出極可能遭遇了51%攻擊;維護團隊開始整理數據,為遭遇51%攻擊尋找證據。

2020-12-07 14:02 Beepool、AEBox、AEKnow和Wetrue經過一個小時左右的分析討論,基本確定被攻擊情況,并初步確定嫌疑賬號ak_2n9ixHr4m6KvyyVxx47QPX3zNy9AgMtgc8bnsSpmTyqV3qmAjb(ak_2VgB6KRVkpG1UwHcZufnhcFKMEwVJwBc75U6VWKko8c5GrbU1i),可疑礦工ak_cfCSt13PW2Fwsft2CVY1BMmt7XhXW3aoSH49L1xSNW8DpJDC7,以及其攻擊開始的高度353225;初步確定關聯資金2700萬元的token,其中確定雙花成功150萬token;Weture和AEBox對賬號做了轉賬標記,

2020-12-07 14:30 AE社區通知各大交易所,并在全球電報群通告了51%攻擊的初步情況,交易所基本迅速應對,關閉充提。

7.3 虛擬幣的流向

攻擊者在攻擊準備工作中,在O交易所持續收集了約2900萬元的token,放到了自己的錢包;攻擊發生后,成功雙花的約2900萬元的token全部進入O交易所。在攻擊期間,約2680萬元的token從O交易所提出,賬面主要流入5個交易所。

攻擊結束后,攻擊期間的交易被交易所及維護團隊全部取消,并將正確數據重新打包恢復,所以攻擊者只有部分成功交易,有約1687萬元的token通過最長鏈成功轉入各交易所,具體情況如下表所示:


由于各交易所風控差異,攻擊者在到賬后操作空間不同,帶來損失有所差異;但具體情況沒有相關的數據,

7.4 現狀

發動攻擊的礦工已經被定位(已經在網路世界里確定了嫌疑人的賬號和礦工的資訊,但是無法確定現實世界里的肉身),其交易的token也做了標記;雙花的錢只有很少的一部分真的“花”出去了,大部分仍然被困在他自己手上,交易所當然也有損失,但是因為發現得及時,形勢還不算太壞。

整個局勢仍在演變,各交易所除了自掏腰包彌補虧空,也有限制被標記的token的交易等等手段來繼續圍困對手,未來如何發展,還有待觀察。

8

總 結

在虛擬幣發展的歷史上,這不是第一次發生分叉。這次攻擊又一次證明,當遭遇算力強大的對手時,中本聰關于防止51%攻擊的方法是無法達成目標的,

虛擬幣的設計和產生是隨網路發展而逐步形成的,并不是某個天才的機靈勁兒上來的結果,在其發展中,各種實踐背后,都有斗智斗勇的過程,有些場面是相當血腥的。

比如這一次,2900萬元就突然消失了。虛擬世界的天空,仍然是云淡風輕,仿佛一切都沒有發生過似的,

只有劉洋才知道,這虛擬幣世界里,戰斗,真實又殘酷,

12月7日,那是個溫暖的日子,桌上的貓,睡得正香,地里的韭菜,也正值壯年,


9

致 謝

本文經過姬揚的整體調整和刪改;技術細節由劉洋提供;文章在張藝瓊的堅持下改了名,題目中沒有了我所喜歡的“雙花”。特此致謝!

韭菜和剪刀是劉洋家的,出來擺拍的貓也是劉洋家的,所以謝謝劉洋家的韭菜、剪刀和貓!

在群中討論有關韭菜和貓的照片時,群眾在群主曾泳春的帶領下,直接就跑偏了。先是紡織學家曾泳春討論了韭菜的做法,語言學家張藝瓊說要上樓摘韭菜,農業專家劉占宇就直接介紹韭菜的肥料,然后物理學家劉艷紅和化工專家李學寬就一個勁兒推薦自家的貓……一片混亂中,姬揚就把群名改為:“只有貓知道”,

Anyway,謝謝各位!

參考文獻

[1] http:http://bbs.tianya.cn/post-free-41169-1.shtml

[2] https:http://wenku.baidu.com/view/2e3f91bb1a37f111f1855b50.html

[3] https:http://www.oklink.com/academy/zh/bitcoin-white-paper-cn

[4] A. Back, “Hashcash – a denial of service counter-measure,” http:http://www.hashcash.org/papers/hashcash.pdf, 2002.

[5] http:http://blog.sciencenet.cn/blog-1750-1262277.html

來源:返樸

編輯:Watson

4 条回复 A文章作者 M管理員
  1. 你繼續靠譜做莊,我不玩

  2. 虛擬貨幣必需與一種貴金屬掛鉤!不可以不受控制無限擴張!

  3. 就是圈子內一群人拿電子數據變現成真錢,信則入圈,不信則虛無——標準的擊鼓傳花!

  4. 比特幣只有2100萬個,不可能無限擴張,從這一點來說,比各國法幣要靠譜多了