比特幣雙花攻擊的原理分析

    在學習區塊鏈的過程中,大家一定對會聽到“雙花”這個詞,意思就是雙重支付,或者更直白點就是一筆資金被花費了兩次。這篇文章我們來簡單的分析一下爲什麼會有雙花,比特幣是如何避免雙花的。

    在傳統的交易中,因爲有銀行這樣的中心化機構,所以是不會存在雙花問題的:每一筆支付都將從你的銀行賬戶中扣除相應的資金,所有的明細在銀行都有記錄。但是在比特幣中,因爲沒有賬戶的概念,而是引入了UTXO即未花費交易輸出。因爲沒有銀行這樣的中心化機構的保證,當發生一筆交易時就可能存在着雙花的危險:比方說A有一個比特幣,然後他同時構造兩筆交易T1和T2來花費這1個比特幣,其中一個給了B,從B那裏買件衣服,一個給了C,從C那裏買雙鞋。如果不引入某種機制來避免這種情況,那作爲數字貨幣的比特幣將沒有任何存在的意義。接下來就來分析一下比特幣是如何做到防止這種“雙花”攻擊的。

    (1) 正常情況

    首先我們來看看正常情況,說白了就是絕大多數時候,區塊鏈的共識機制就能將雙花消滅在萌芽狀態。我們還是以上面提到的例子來做說明:

    假設A構造了兩筆交易T1和T2,將自己價值1btc的UTXO分別轉給了B和C,妄圖同時從B和C那裏獲得好處。然後A幾乎在同一時間將構造好的這兩筆交易廣播至網絡。

    假設網絡中的礦工節點先收到了交易T1,發現這筆交易的資金來源確實沒有被花費過,於是將T1加入到自己的內存交易池中等待打包進區塊。

    大部分情況下,這個礦工節點會在不久後又收到交易T2,此時因爲T2所指向的交易輸入與已經加入交易池的T1相同,於是礦工節點會拒絕處理該交易。網絡中其他的礦工節點都類似,因此A試圖雙花的嘗試胎死腹中。

    (2) 分叉情況

    上面說的是正常的情況,但是也有非正常的情況要考慮:假設礦工節點M1和M2幾乎在同一時間挖出了區塊,並且很不幸M1挖到區塊時只收到了交易T1,而M2挖到的區塊時只收到了交易T2,這樣交易T1和T2被分別打包進兩個區塊。因爲這兩個區塊是差不多同一時間被挖出,於是造成了區塊鏈的分叉:

    網絡中某些節點(可能是離M1近的)先收到了M1打包的區塊BLK1,於是用該區塊延長自己的區塊鏈,而另外一些節點(鄰近M2的)則先收到M2打包的區塊BLK2,用該區塊延長自己的區塊鏈,於是整個區塊鏈網絡中呈現出了不一致的問題:

    

    像這種不一致問題,一般只需要一個確認就能得到解決:假設隨後又收到新區塊,而新區塊是以BLK1作爲父區塊,那麼之前用BLK1延長自己區塊鏈的節點,只需要將新區塊鏈接到自己的區塊鏈上,而之前以BLK2延長自己區塊鏈的節點,則需要切換到新的最長鏈上,如下圖:

    因此在出現分叉的情況下,通常也只需要等一個區塊的確認時間網絡節點中的區塊鏈就可以重新一致,在這個例子中,經過一個區塊的確認期以後,B最終確認自己收到A的1btc,而因爲包含有轉賬給C的交易T2的區塊BLK2位於備用鏈上,因此無法通過支付驗證。A的雙花嘗試也以失敗告終。

    (3) 爲什麼說比特幣需要6個確認才安全

    上面提到一般情況下,只要經過1個區塊的確認時間基本上就能確保“相對的安全”。而在比特幣中,對於很小額的支付,爲了提高交易速度,一般也就是等1個區塊的確認即可。但是注意這裏說的是“相對安全”,對於數額特別大交易,1個區塊的確認遠遠不夠。我們考慮上面提到的分叉情況:假設經過1個區塊的確認後,B知道了A給他的1btc確實已經位於鏈上,於是發貨給A。此時A及其同夥掌握着很大的一部分算力,A通知其同夥開始使勁挖礦延長備用鏈(攻擊鏈),當A最終成功的使攻擊鏈的長度(累計工作量)超過當前主鏈時,會再一次導致網絡中的節點切換主鏈的情況,如下面的示意圖:

    於是包含了A轉給C的交易T2的區塊BLK2位於了主鏈之上,此時A通知C錢已到賬,C做支付驗證也沒問題,於是C給A發貨,A的雙花攻擊成功。

    因此對於額度稍大的交易,必須要等待6個區塊的確認才能保證安全,因爲攻擊者要想構造攻擊鏈追上已經經過6個區塊確認的主鏈需要花費的算力成本是非常大的,很有可能得不償失。

    最後總結一下:

    (1) 大部分情況下比特幣的UTXO機制和區塊鏈的共識機制都能有效應對雙花攻擊;

    (2) 對於小額支付,等待一個確認通常就可以認爲安全了,但是對於大額支付,需要等6個確認才能大概率的認爲安全,否則如果攻擊者掌握很強算力,有可能構造累計工作量超過當前主鏈的攻擊鏈導致雙花成功。

 

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章