壞礦工的雙重支付攻擊,51%攻擊

在何謂區塊鏈(一)提過,如果世界上有太多壞礦工,就不能保障區塊鏈的安全。 那到底要有幾多個壞壙工才會有影響,壞壙工又可以如可攻擊區塊鏈,下面會詳細解釋。

先重溫一下挖礦的基本知識,所謂挖礦,是指壙工之間鬥快解出一條SHA256的不等式:
SHA256(tx1/tx2/tx3/…/nonce) < target

其中tx1/tx2/tx3是指區塊內的交易訊息,nonce是礦工是找出的數使得上述不等式成立。

為了找出答案nonce,礦工不停計算SHA256,最快找出答案的礦工會公佈答案,並將自己挖出的區塊加上現在的區塊鏈上。

偶而會發生兩個礦工同時成功挖出區塊,這候就要比併網絡速度了。 如果兩個礦工的區塊都是正確的區塊,則以先到先得的方式來決定。

挖得較慢的礦工如果不忿氣,堅持要基於自己挖出來的區塊繼續挖,如下圖:

blockchain confirm

全世界的礦工已經基於Block C 的結果去挖下一個區塊,唯獨是加拿大礦工不忿氣,明明挖到了Block B 卻因為比其他人慢,所以沒有人理會他的結果。

留意: 正常的礦工只會在最長的區塊鏈上工作,不在最長區塊鏈上的區塊叫做orphan block,孤兒區塊。

所以上圖Block B 就是一個孤兒block。

Double Spend Attack 雙重支付攻擊

那麼加拿大礦工死不認輸的性格有沒有可能得到回報呢? 有!

如果加拿大礦工非常幸運,當其他礦工仍未挖出基於區塊C 的下一個區塊,他獨力找出了基於Block B 之後的兩個Block,如下圖:

orphan block 孤兒區塊

那麼Block B/D/E 瞬間成為最長的區塊鏈,Block A/C 反而變成孤兒了。

孤兒block的下場是甚麼? 所有記載在孤兒Block的交易都不算數,跟沒發生過一樣。只有在最長區塊鏈(Longest Block Chain)上發生的交易才算數。

看到這裏開始感覺到有問題吧?

時光倒流一下,重回到Block B 仍然係孤兒區塊的時候,來看看Block A 入面包含了的交易:

Block A 區塊交易

上圖Block A 包含了一條交易: 加拿大礦工傳送了0.001BTC 給咖啡店

現實生活中的比特幣交易通常要等一次confirmation 才算成功。雖然Block A 已經包含了買咖啡的轉帳,但為了安全起見,咖啡店可能會等到Block C 出現之後才將咖啡交給加拿大礦工。

但是,如果加拿大礦工是壞人,在最後一個Block E 上寫上另一條交易: 用他本來買咖啡的0.001BTC 來買大家樂焗豬排飯,而且他有如神助地迅速挖到兩個區塊出來,如下圖:

Block E 區塊交易

那麼咖啡店就要虧大本了,因為寫在Block A上的交易突然間全部失效,取而代支的時買焗豬排飯的交易。

咖啡店送了咖啡出去,但原本已經到了wallet的bitcoin 卻消失了......

若同一個bitcoin,可以在多於一個地方消費,這就是惡名昭彰的double spend attack 雙重支付攻擊。

加拿大礦工要發動這種攻擊,不可能單靠幸運,靠的是算力hash rate。

說到底挖礦就是鬥快計SHA256的比賽,只要算得夠快就可以發動攻擊。 何謂之夠快? 這是壞礦工與正義礦工的hash rate 比賽。

51% Attack 攻擊

假設全世界的礦工加起來每秒可以算100次SHA256,其中10次是壞礦工算出來的,那麼壞礦工就佔10% hash rate,正義礦工佔90%。在這種算力分佈情況下,每10個新區塊裏面,就有一個是壞礦工挖出來的。

如果壞礦工的運算力是10%,而咖啡店會等待2次confirmation才送出咖啡的話,壞礦工發動Double Spend attack的成功機會是5.6%。

如果壞礦工的運算力是10%,而咖啡店會等待6次confirmation才送出咖啡的話,壞礦工發動Double Spend attack的成功機會是0.05%。

Confirm次數越高咖啡店就越安全,因為壞礦工的運算能力始終不及正義礦工。暫時公認是6次confirmation 為最佳。

但如果壞礦工的運算力提升至40%,而咖啡店仍然等待6次confirmation才送出咖啡的話,壞礦工發動Double Spend attack的成功機會則提升至50%。

下圖是壞礦工算力比率,咖啡店等待確認次數,與Double Spend Attack成功機會的關係:

double spend attack

(ref: https://bitcoil.co.il/Doublespend.pdf)

如果壞礦工的運算力提升至全個網絡的51%,會發生甚麼事情?

Double Spend Attack 一定會成功,只是時間問題!這就是51% 攻擊。

代價太大沒有人會是嬴家

這聽上去很恐怖,設計Bitcoin的時候已經知道會有這個問題。 礦工/Bitcoin developer全部都知道,偶而會有反對Bitcoin的人以此攻擊Bitcoin的安全性。

但要發動51%攻擊的代價實在太高了…

以2018年4月中計,假設用上AntMiner S5+,每一部價值2307美金,S5+的hash rate是7722GHash/s,3436W。

光是買礦機你就要花上9,198,641,021美金,還未計礦機電費! 假設電費是每千瓦時0.05美金,每天電費已經要16,440,327美金,是每天!(ref: https://gobitcoin.io/tools/cost-51-attack/)

還有租地方放置礦機呢? 冷氣費呢? 要同時cool down 上千萬部螞蟻礦機可不是簡單的事花上上百億美金發動一次51%攻擊,然後呢?

同一個bitcoin 可以多花一次吧...然後呢?

最懷的情況是,所有人都知道51%攻擊發生了,然後世人對bitcoin的瞬間信心消失,“原來用bitcoin消費是這麼沒保障的啊"...

bitcoin 價值歸0

然後你花上百億買回來的礦機就可以送到堆填區啦^_^~

歷史上有沒有發生過成功的51% Attack呢? 有,不過不是Bitcoin。

2018年4月初,有黑客發現Verge (另一種加密貨幣)的掘礦算法中有bug,令他可以短時間內挖出大量區塊(1秒1個區塊),模擬了51% hash rate的情況。(ref: https://bitcointalk.org/index.php?topic=3256693.0)

原理跟51% Attack非常相似,不同之處是他無需購置大量礦機,只是偽做了區塊上的Timestamp。

Verge Team 3小時內透過硬分叉HardFork 排除了攻擊期間生成的區塊。 但Verge不算是甚麼出名的加密貨幣,所以hard fork的影響還不算很大。

Appendix:

上面提到壞礦工算力比率,咖啡店等待確認次數,與Double Spend Attack成功機會的關係。

計算這個機會率需要統計學的知識,特別係Poisson Distribution泊松分佈,及discrete time Markov chain 馬可夫鏈。

在中本聰所寫的Bitcoin White Paper,Chapter 11詳細解釋了算力分佈與雙重支付攻擊的關係。(ref: https://bitcoin.org/bitcoin.pdf)


p = 正義礦工佔全網絡的算力比率
q = 壞礦工佔全網絡的算力比率
(p+q=1)

咖啡店會等待z次confirmation才送出咖啡,
然後用Poisson distribution,其中λ=z*(q/p)
λ是指每挖出一個新區塊的時候,壞礦工從後追上區塊的機會。

double spend attack 機會率

如果現時壞礦工落後了z個block,用上面這算式就可以計算出壞礦工從後趕上的機會率。


延伸閱讀