1. 程式人生 > >共識協議之工作量證明(比特幣的挖礦原理)

共識協議之工作量證明(比特幣的挖礦原理)

記賬工作

由於記賬是有獎勵的,每次記賬都可以給自己憑空增加一定數量的個比特幣(當前是12.5比特幣,博文寫作時每個比特幣是4萬人民幣以上,大家可以算算多少錢),因此就出現大家爭相記賬,大家一起記賬就會引起問題:出現記賬不一致的問題,比特幣系統引入工作量證明來解決這個問題,規則如下:
一段時間內(10分鐘左右,具體時間會與密碼學難題難度相互影響)只有一人可以記賬成功
通過解決密碼學難題(即工作量證明)競爭獲得唯一記賬權
其他節點複製記賬結果
不過在進行工作量證明之前,記賬節點會做進行如下準備工作:

  • 收集廣播中還沒有被記錄賬本的原始交易資訊
  • 檢查每個交易資訊中付款地址有沒有足夠的餘額
  • 驗證交易是否有正確的簽名
  • 把驗證通過的交易資訊進行打包記錄
  • 新增一個獎勵交易:給自己的地址增加12.5比特幣

如果節點爭奪記賬權成功的話,就可以得到12.5比特幣的獎勵。

工作量證明

為了保證十分鐘左右只有一個人記賬,我們通過提高記賬難度來實現。
具體是通過在雜湊函式中增加一個隨機數:
Hash(上一個Hash值,序號,時間,交易記錄集,隨機數) = 0000aFD635BCD
我們知道改變Hash的原始資訊的任何一部分,Hash值也會隨之不斷的變化,因此在運算Hash時,不斷的改變隨機數的值,總可以找的一個隨機數使的Hash的結果以若干個0開頭(下文把這個過程稱為猜謎),率先找到隨機數的節點就獲得此次記賬的唯一記賬權。

計算量分析

我們簡單分析下記賬難度有多大。
Hash值是由數字和大小寫字母構成的字串,每一位有62種可能性(可能為26個大寫字母、26個小寫字母,10個數字中任一個),假設任何一個字元出現的概率是均等的,那麼第一位為0的概率是1/62(其他位出現什麼字元先不管),理論上需要嘗試62次Hash運算才會出現一次第一位為0的情況,如果前兩2位為0,就得嘗試62的平方次Hash運算,以n個0開頭就需要嘗試62的n次方次運算。我們結合當前實際區塊#493050資訊來看看:
這裡寫圖片描述
注:資料來源於https://blockchain.info
我們可以看到Hash值以18個0開頭,理論上需要嘗試62的18次方次,這個數是非常非常巨大的,我已經算不清楚了,應該是億億級別以上了。如此大的計算量需要投入大量的計算裝置、電力等,
目前應該沒有單礦工獨立參與挖礦了,基本都是由礦工聯合起來組成礦池進行挖礦(礦池裡的礦工按算力百分比來分收益)。
從經濟的角度講,只有挖礦還有收益(比特幣價格不斷上漲也讓收益變大),就會有新的礦工加入,從而加劇競爭,提高算力難度,挖礦就需要耗費更多的運算和電力,相互作用引起最終成本會接近收益。

題外話:國內由於電力成本較低,相對收益更高,中國的算力佔整個網路的一半以上。

驗證

在節點成功找到滿足的Hash值之後,會馬上對全網進行廣播打包區塊,網路的節點收到廣播打包區塊,會立刻對其進行驗證。
如果驗證通過,則表明已經有節點成功解迷,自己就不再競爭當前區塊打包,而是選擇接受這個區塊,記錄到自己的賬本中,然後進行下一個區塊的競爭猜謎。
網路中只有最快解謎的區塊,才會新增的賬本中,其他的節點進行復制,這樣就保證了整個賬本的唯一性。
假如節點有任何的作弊行為,都會導致網路的節點驗證不通過,直接丟棄其打包的區塊,這個區塊就無法記錄到總賬本中,作弊的節點耗費的成本就白費了,因此在巨大的挖礦成本下,也使得礦工自覺自願的遵守比特幣系統的共識協議,也就確保了整個系統的安全。

說明

礦工的收益其實不僅僅包含新發行的12.5比特幣獎勵,同時還有交易費收益(本文忽略一些細節是為了讓主幹更清晰)。