時間:2023-06-24|瀏覽:277
在比特幣系統中,用戶想要發起一筆轉賬,首先要把轉賬信息組裝好,就像填寫銀行支票一樣,寫好付款方賬戶,收款方賬戶,轉賬金額,然后使用加密技術對轉賬信息簽名,我們把這種簽名好的轉賬請求叫作交易。交易被比特幣系統處理以后,付款方的賬戶就會被扣除指定金額,收款方的賬戶就會增加指定金額。
用戶的交易會被發送給比特幣系統中的節點,節點收到交易后將其放在一個新的區塊中,然后對這個區塊進行哈希計算,也就是之前文章所說的計算數學題。哪一個節點優先計算出了這個區塊的數學題答案,就獲得了這個區塊的打包權,被這個節點打包進區塊的交易就相當于成交了,然后所有的節點會在新區塊的基礎上開始計算下一個區塊的數學題。
知道了比特幣的轉賬原理,下面我們就來看一下比特幣的漏洞到底在哪里!
系統漏洞:最長鏈原則: 剛才我們說誰先算出答案誰負責打包區塊,那如果有兩個節點同時做出了同一個區塊的答案該怎么辦呢?為了解決這個問題,比特幣系統設計了一個特殊的機制,叫作最長鏈原則。
現在假設有兩個節點A和B同時計算出了區塊N的答案,那么他們就會同時把自己的答案向外廣播。由于網絡傳輸的問題,離節點A比較近的節點就會先收到A的答案,驗證后發現A的結果是正確的,然后就會在A的基礎上繼續計算區塊N+1的答案。離節點B比較近的節點會優先收到B的答案,驗證后發現B的結果也是正確的,然后就會在B的基礎上繼續計算區塊N+1的答案。
此時區塊鏈有兩個尾巴,分別是A打包的區塊和B打包的區塊,我們把這種情況叫作區塊鏈分叉。但是由于區塊答案的計算量很大,下一個區塊幾乎不會同時被計算出來。此時如果區塊N+1的答案是在A的基礎上計算出來的,那么A的這個分叉就要長一些,在B的基礎上計算區塊N+1答案的節點就會停止作答,而是在新區塊的基礎上開始計算區塊N+2的答案。此時所有節點都回到了A的那個分叉上繼續向下計算,B之前計算出來的區塊N就被廢棄了。
通過上面的描述我們可以看出,比特幣的這條鏈是有可能分叉的,分叉以后會以最長的鏈為準,那么在較短的分叉上的區塊就被廢棄了。這不正為我們攻擊比特幣系統帶來了可能性嗎!
對比特幣發起攻擊: 你可能已經想到了,既然比特幣系統只認最長的那條鏈,我們是不是可以通過這樣的方式對比特幣進行雙花攻擊:
首先發起一筆正常的比特幣轉賬交易,用來和對方交換其他的東西。交易在區塊N中被打包后,對方就收到了你的轉賬,然后將東西給你。
你在得到自己想要的東西后,開始收買節點重新創造一個區塊N,把你之前發的轉賬交易刪除掉,此時你成功地將比特幣進行了分叉。
由于比特幣系統只認最長鏈,所以你收買節點一直在你的分叉上繼續工作,直到讓你的分叉的區塊長度超過正常區塊的長度,那么系統中所有節點就會在你的分叉上繼續工作。
包含你轉賬的區塊N及其后面一直到N+n的區塊都被你的新分叉廢棄了,你的分叉成為了主鏈,在這條鏈上沒有你的轉賬記錄。
至此,你之前轉出的比特幣還在你的賬戶上,并且得到了你想要的東西,所以你的攻擊成功了。
比特幣中的博弈論: 對比特幣的攻擊真的這么簡單嗎?答案當然是否定的!雖然我們說可以通過上述方法對比特幣發起攻擊,但是攻擊是要付出代價的。
首先,無論你是在主鏈上工作還是自己創建一個分叉去工作,區塊答案的計算難度都是一樣的,所以你仍然需要計算10分鐘左右才能生產出一個區塊。
其次,難題的計算是隨機的,只和節點的計算能力有關,計算能力越強,優先計算出答案的概率就越大,并且還只是概率。
所以,如果你想要創建一個新的分叉,并且超過主鏈的區塊長度,那么你需要比主鏈上所有節點的計算速度加在一起都要快。要想實現這樣的結果,唯一的做法就是你要收買比特幣系統中超過51%的節點算力,這就是比特幣的51%攻擊原理。
想要攻擊比特幣系統并不是不可能,但是需要付出的代