Blockchain Weaknesses¶
Double-spending attack¶
雙花問題是電子現金系統中的一個潛在問題,即相同的資金同時支付給兩個接收者。區塊鏈系統通過公開賬本的方式來避免雙花問題,用戶廣播交易時不會立即將其添加到區塊鏈中,而是等待礦工通過挖礦將其打包在區塊中,接收者在確定合法的交易已經添加到區塊鏈之後,纔可以認爲該交易有效。用戶通過在區塊鏈上接收付款時等待確認來保護自己免受雙花欺詐,隨着確認數量的增加,交易變得更加不可逆轉。
但區塊鏈系統並不能完全防止雙花,攻擊者仍可以通過龐大的哈希計算資源來重新完成已確認區塊的工作量證明並使自己所在鏈成爲最長鏈來逆轉交易實現雙花,以及可以針對某些未確認交易實現雙花攻擊。目前有一下常見的幾種方式能夠引發雙花攻擊:
51% attack¶
51%攻擊通是指礦工試圖控制超過50%的哈希率(挖礦算力)來實現雙花,在此攻擊中,攻擊者可以阻止新交易被確認或撤銷他們控制網絡時已經確認的交易。
由於比特幣等Pow共識的區塊鏈遵循最長鏈原則,當礦工發現全網有一條更長的鏈時,他就會拋棄他當前的鏈,把新的更長的鏈全部複製回來,在這條鏈的基礎繼續挖礦,而分叉出的短鏈則被丟棄掉。因此攻擊者在與商家完成交易後從交易前分叉區塊並通過掌握的足夠多的算力持續挖出更長的鏈使發生交易所在的鏈丟棄來實現雙花。
理論上無法通過技術來防範51%攻擊,而是通過經濟學原理來避免,使達到全網51%的算力成本非常高,且擁有如此強大算力的攻擊者進行正常挖礦比作惡作的收益更高。但對於小規模的山寨幣來說,攻擊成本較低,如Ethereum Classic網絡曾遭受多次51%攻擊。
參閱: https://en.bitcoin.it/wiki/Weaknesses#Attacker_has_a_lot_of_computing_power
- 題目名稱 miniblockchain
Finney attack¶
Finney attack(芬尼攻擊)是由Hal Finney命名的,他是第一個描述扣塊攻擊的人。這種攻擊是一種雙花攻擊的變化,攻擊對象主要針對的是接受0確認的商家。
攻擊者將一個給自己轉賬的交易預挖爲一個區塊,但不立即將其廣播到網絡中,相反用同一筆代幣花費在接受 0 確認的商家的交易中,攻擊者在獲得商家的交換物後、這筆交易A真正確認前,才廣播他之前所預挖的區塊使轉給自己的交易合法,這時比特幣網絡會接受該有效塊並使對商家的交易無效,最終達到雙花的目的。
0確認是指一筆交易被廣播到全網,即將被打包進入區塊前的狀態。因爲區塊鏈目前的出塊時間過慢,交易確認需要等待的時間較長,部分商家爲了節省時間接受0確認的交易,也就是你把交易信息廣播到全網就可以了,不需要等待打包入區塊。
Race attack¶
攻擊者使用相同的資金連續廣播兩個衝突的交易,但最終只有一個交易得到確認。該攻擊主要是控制礦工費來實現雙花,同樣針對接收0確認的商家,最終使發給自己的交易被打包確認而使另一個支付交易無效。
與芬妮攻擊 的區別是,芬妮攻擊是 0確認交易 vs 衝突塊,競爭攻擊是0確認交易 vs 衝突交易。
Vector76 attack¶
也被稱爲一次確認攻擊,是 Race attack 和 Fenny attack 的結合,使得具有一個確認的交易仍然可被撤銷。
在這種攻擊中,一名礦工創建了兩個節點,其中一個連接到商家節點,另一個節點連接到區塊鏈網絡中連接良好的節點。然後,礦工使用相同的資金創建兩筆交易創建了兩項交易,一筆交易發送給商家地址,我們稱爲交易1;一筆交易發送給自己的錢包地址且設置較高的礦工費,我們稱爲交易2。
攻擊者不立即廣播這兩筆交易而是在交易1的分支上進行挖礦,攻擊者挖到區塊後,向商家節點廣播交易1,向另一個節點廣播交易 2。交易2被認爲有效後,攻擊者立即把自己之前在交易1分支上挖到的區塊廣播給商家,這時,這個接受一次確認就支付的商家會確認交易成功。
由於交易2發送給了連接到更多節點的節點,所以礦工在這個分支上挖出了更長鏈的機率更大,在這種情況下交易1會被回滾,從而實現了雙花。
參閱:
http://bitcointalk.org/index.php?topic=36788.msg463391#msg463391 http://www.reddit.com/r/Bitcoin/comments/2e7bfa/vector76_double_spend_attack/cjwya6x
Block withholding attack¶
扣塊攻擊最簡單的形式是上述的芬妮攻擊,但同樣存在針對礦池的扣塊攻擊方式。
礦池最常見的支付機制是PPS(Pay-Per-Share),該機制中礦工所貢獻的每一個“share(股份)”都將收到固定的報酬,Share是用來記錄礦工貢獻的哈希值,這裏的share並不是區塊鏈網絡中有效的哈希,而只是由礦池所設置的匹配條件。由於找到符合Pow區塊鏈系統要求的解對於單獨的礦工來說是極小概率事件,礦池爲了更好衡量礦工們的工作量,會給礦工們設置一個合理的提交工作成果(Share)的門檻。
扣塊攻擊是指惡意礦工在找到滿足礦池要求結果,但不滿足比特幣系統要求的結果時,正常向礦池提交工作證明;一旦得到滿足比特幣系統要求的結果時,也就是真的挖到區塊時,則把這個結果私自扣下,不向礦池提交,礦池便因此損失了對應的獎勵。扣塊攻擊會使礦工和礦池都受損失,礦工只是得不到礦池分攤的Share獎勵,但使礦池損失了出塊獎勵。
Selfish-Mining attack¶
攻擊者挖到新區塊後藏起來不公佈,其他誠實礦工因爲不知道新區塊的存在,還是繼續在舊區塊基礎上挖礦。等到攻擊者挖到第二個區塊後便會同時公佈手中藏着的兩枚區塊,這時,區塊鏈分叉就出現了。只要攻擊者比誠實礦工多挖一枚區塊,攻擊者所在的分叉就是最長鏈。因此,原本誠實礦工們所在的那條鏈,因爲比攻擊者的分叉鏈短便被作廢了,此時攻擊者因爲挖到了兩枚新區塊而獲得相應收益,而誠實礦工的獎勵則被回滾。
Note
注:題目附件相關內容可至 ctf-challenges/blockchain 倉庫尋找。