《Christopher Jeffery公布最新bug,可以摧毀比特幣網路》
以下內容僅代表Qtum量子鏈鍾文斌個人觀點
近日,開發者Christopher Jeffery(JJ)在出席BreakingBitcoin活動時公布了一個關於比特幣網路的新型DoS攻擊。該攻擊理論上可作用於運行BitcoinCore v0.8 ~ v0.14及其衍生版本客戶端的節點,並且在v0.15中已經被修復。
Qtum基於bitcoin v0.14開發,目前Qtum項目組正在同步修復該bug。需要說明的是,該攻擊目前對Qtum無影響,因為攻擊的前提是產生足夠多的交易,所以在量子幣未正式兌換髮放前,都無法進行此類攻擊。
下面簡單介紹該DoS攻擊的工作模式:
1.產生原因
Bitcoin Corev0.8開始採用vector-based模型存儲UTXO數據,也就是說資料庫的結構是txid到tx的output列表的映射。當時採用這種模型主要是為了節省空間,避免內存中大量重複的txid。其工作原理如圖所示:
當Tx3把Tx1和Tx2產生的UTXO當做input時,需要如下操作:
1)把Tx1和Tx2的所有output列表載入到內存中
2)贖回Tx3需要的UTXO作為新的input
3)將內存中所有的UTXO,包括新的UTXO重新序列化後再次寫入資料庫
這種實現方式會帶來以下的問題:
1)即使是只用到Tx1眾多output中某一個,你仍需要載入整個output列表
2)在操作完成時,你需要將載入的所有的數據重新寫入資料庫中
這就為DoS攻擊帶來了可能性。一個最簡單的想法就是令載入到內存的UTXO列表超出限制。
2.如何攻擊
理論上,可以採用如下方法進行攻擊:
1)首先,創建多個具有盡量多output的tx。理論上最多的P2SHoutput數為31,000(約1MB數據);
2)同理,最大的input數大約為24,000個;
3)在攻擊區塊中,生成一筆有24,000個input的交易,並分別選取來自不同tx的UTXO。注意,每一個用到UTXO列表大小都接近1MB;
4)最後,將會有24GB的數據被載入到內存中(實際根據實現方式不用,載入的內存可能會高達100GB),導致節點崩潰。
上述的攻擊從理論上可行,但可能需要礦工的協助,並且1MB大小的交易太過於明顯,很容易被監測到。實際上對其稍作修改,就可能實現可行的攻擊。攻擊者可以將output數據限制在100kB,這樣理論上要載入2.4GB數據到內存中(實際可能是10GB),對普通用戶的節點來說,同樣也能達到攻擊的目的。同時,這樣的交易也不容易被監測到。
這種攻擊的最可怕之處在於:一旦完成了前面所述的準備工作(這當然需要一定的代價,生成許多準備交易,可能要花費上百萬美元),之後再次發起攻擊的代價就變得非常低廉,可以說幾乎為零。因為攻擊者只需要發起一筆滿足攻擊條件的交易即可實現攻擊。
3.如何修復
該問題已經在Bitcoin Core v0.15中得到修復,具體的思路如圖所示:
1)將UTXO存在本地的資料庫中;
2)數據存儲的結構改為從outpoint到output的映射;
3)有了前面兩點,就能夠在內存中只載入需要用到的UTXO,生成新的交易;
4)在生成交易後,只需要重新寫入部分更新的數據,大大提高了效率。
TAG:量子鏈平台Qtum |