什麼是雙花攻擊?
“雙花攻擊”(double spend attack)又叫“雙重消費攻擊”,通俗的理解,就是一筆資金,透過某種方式被花費了兩次,取得了超過該筆資金的服務。
舉一個誇張的例子
Hacker在銀行有存款1000萬,向商戶A購買了一匹鋼材,價值1000萬;商戶A支援透過支票支付的方式。
那麼商戶A是如何確認這張支票不是“空頭”的呢?
他會向對應的銀行(中心化的有認證資質的機構)去查詢這張支票的擁有者是否賬戶上有足夠1000萬的餘額可供提取。商戶A查詢的即時結果是:足額。所以商戶A就(基於某種信任)hacker發貨。
然後,hacker 又到了商戶B去購買了價值1000萬的實木傢俱,同樣是採用支票支付方式。過程同上。
上述過程中,hacker透過欺詐的手段(藉助於可信任的中心化認證機構),將銀行中的1000萬資產消費了兩次,獲取到了兩次的收益,這就是“雙花攻擊”。
雙花攻擊一般發生在數字貨幣領域。
正常情況
區塊鏈的共識機制就能將雙花消滅在萌芽狀態。
假設hacker構造了兩筆交易T1和T2,將自己價值1btc的UTXO分別轉給了B和C,妄圖同時從B和C那裡獲得好處。然後hacker幾乎在同一時間將構造好的這兩筆交易廣播至網路。
大部分情況下,這個礦工節點會在不久後又收到交易T2,此時因為T2所指向的交易輸入與已經加入交易池的T1相同,於是礦工節點會拒絕處理該交易。網路中其他的礦工節點都類似,因此hacker試圖雙花的嘗試胎死腹中。
分叉情況
假設礦工節點M1和M2幾乎在同一時間挖出了區塊,並且很不幸M1挖到區塊時只收到了交易T1,而M2挖到的區塊時只收到了交易T2,這樣交易T1和T2被分別打包進兩個區塊。因為這兩個區塊是差不多同一時間被挖出,於是造成了區塊鏈的分叉,
網路中某些節點(可能是離M1近的)先收到了M1打包的區塊BLK1,於是用該區塊延長自己的區塊鏈,而另外一些節點(鄰近M2的)則先收到M2打包的區塊BLK2,用該區塊延長自己的區塊鏈,於是整個區塊鏈網路中呈現出了不一致的問題。
像這種不一致問題,一般只需要一個確認就能得到解決:假設隨後又收到新區塊,而新區塊是以BLK1作為父區塊,那麼之前用BLK1延長自己區塊鏈的節點,只需要將新區塊連結到自己的區塊鏈上,而之前以BLK2延長自己區塊鏈的節點,則需要切換到新的最長鏈上,如下圖:
因此在出現分叉的情況下,通常也只需要等一個區塊的確認時間網路節點中的區塊鏈就可以重新一致,在這個例子中,經過一個區塊的確認期以後,B最終確認自己收到A的1btc,而因為包含有轉賬給C的交易T2的區塊BLK2位於備用鏈上,因此無法透過支付驗證。hacker的雙花嘗試也以失敗告終。
什麼是雙花攻擊?
“雙花攻擊”(double spend attack)又叫“雙重消費攻擊”,通俗的理解,就是一筆資金,透過某種方式被花費了兩次,取得了超過該筆資金的服務。
舉一個誇張的例子
Hacker在銀行有存款1000萬,向商戶A購買了一匹鋼材,價值1000萬;商戶A支援透過支票支付的方式。
那麼商戶A是如何確認這張支票不是“空頭”的呢?
他會向對應的銀行(中心化的有認證資質的機構)去查詢這張支票的擁有者是否賬戶上有足夠1000萬的餘額可供提取。商戶A查詢的即時結果是:足額。所以商戶A就(基於某種信任)hacker發貨。
然後,hacker 又到了商戶B去購買了價值1000萬的實木傢俱,同樣是採用支票支付方式。過程同上。
上述過程中,hacker透過欺詐的手段(藉助於可信任的中心化認證機構),將銀行中的1000萬資產消費了兩次,獲取到了兩次的收益,這就是“雙花攻擊”。
雙花攻擊一般發生在數字貨幣領域。
怎麼解決雙花攻擊正常情況
區塊鏈的共識機制就能將雙花消滅在萌芽狀態。
假設hacker構造了兩筆交易T1和T2,將自己價值1btc的UTXO分別轉給了B和C,妄圖同時從B和C那裡獲得好處。然後hacker幾乎在同一時間將構造好的這兩筆交易廣播至網路。
大部分情況下,這個礦工節點會在不久後又收到交易T2,此時因為T2所指向的交易輸入與已經加入交易池的T1相同,於是礦工節點會拒絕處理該交易。網路中其他的礦工節點都類似,因此hacker試圖雙花的嘗試胎死腹中。
分叉情況
假設礦工節點M1和M2幾乎在同一時間挖出了區塊,並且很不幸M1挖到區塊時只收到了交易T1,而M2挖到的區塊時只收到了交易T2,這樣交易T1和T2被分別打包進兩個區塊。因為這兩個區塊是差不多同一時間被挖出,於是造成了區塊鏈的分叉,
網路中某些節點(可能是離M1近的)先收到了M1打包的區塊BLK1,於是用該區塊延長自己的區塊鏈,而另外一些節點(鄰近M2的)則先收到M2打包的區塊BLK2,用該區塊延長自己的區塊鏈,於是整個區塊鏈網路中呈現出了不一致的問題。
像這種不一致問題,一般只需要一個確認就能得到解決:假設隨後又收到新區塊,而新區塊是以BLK1作為父區塊,那麼之前用BLK1延長自己區塊鏈的節點,只需要將新區塊連結到自己的區塊鏈上,而之前以BLK2延長自己區塊鏈的節點,則需要切換到新的最長鏈上,如下圖:
因此在出現分叉的情況下,通常也只需要等一個區塊的確認時間網路節點中的區塊鏈就可以重新一致,在這個例子中,經過一個區塊的確認期以後,B最終確認自己收到A的1btc,而因為包含有轉賬給C的交易T2的區塊BLK2位於備用鏈上,因此無法透過支付驗證。hacker的雙花嘗試也以失敗告終。