1. 程式人生 > >Pow挖礦流程

Pow挖礦流程

Pow挖礦流程

POW即工作量的證明,主要特徵是客戶端需要做一定難度的工作得出一個結果,驗證方卻很容易通過結果來檢查出客戶端是不是做了相應的工作。
Pow挖礦即不斷接入新的Block延續Block Chain的過程。
  • 當某個節點提供出一個合理的Block Hash值,驗證方能簡單證明該節點確實經過了大量的嘗試計算。一個符合要求的Block Hash由N個前導零構成,零的個數取決於網路的難度值。Block Hash值的計算是使用“blockchain”,在字串後面加上nonce的整數值串。nonce是隨機數,不停地更換嘗試,才能計算得到N個0開頭的hash值。在“blockchain”+nonce進行SHA256雜湊運算,如果得到雜湊結果(以十六進位制表示)是以若干個0開頭,則驗證通過。0 的個數越多,計算難度越大,比如要尋找4個前導0的雜湊值,預期就要大概進行2^16嘗試。

  • 任何一個節點的POW 證明通過,生成一個新的區塊並寫入區塊鏈,都必須解出比特幣網路的PoW的題目。解出位元比網路PoW題目關鍵3個要素是:工作證明函式、區塊和難度值。工作證明函式、區塊和難度值。
    • 工作量證明函式是計算方法。在比特幣系統使用SHA256作為工作量證明函式。
    • 難度值決定大約需要經過多少次雜湊運算產生一個合法區塊。在全網算力不斷變化,需要維持平均10分鐘出一個區塊,難度值必須根據全網算力的變化進行調整。難度調整是每個完整節點中獨立自動發生。每2016個區塊,所有節點都會按統一公式自動調整難度,調整公式:新難度值=舊難度值*(過去2016個區塊花費時長/20160分鐘)
  • POW 證明通過產生Block Chain首先將數個欄位包含nonce隨機數和時間戳每秒變化一次合併成一塊資料,然後對這塊資料進行雙SHA256運算。
  • Block Chain是節點計算符合要求的前N個零的hash結果,Block的Nonce 是不停是嘗試計算,找到合理的hash,才能打包Block,裝入block meta資訊,然後產生交易資料,對外廣播新的block,其他節點驗證通過,連結至Block Chain,主鏈高度加一,然後切換至新block後面挖礦。由於hashPrevBlock欄位的存在,使得大家總是在最新的block後面開挖,

  • 從block hash演算法推斷合理的block並不是唯一的,同一高度存在多個block的可能性。那麼,當同一個高度出現多個時,主鏈即出現分叉(Fork)。遇到分叉時,網路會根據下列原則選舉出Best Chain:
    • 不同高度的分支,總是接受最高(即最長)的那條分支
    • 相同高度的,接受難度最大的
    • 高度相同且難度一致的,接受時間最早的
    • 若所有均相同,則按照從網路接受的順序
    • 等待Block Chain高度增一,則重新選擇Best Chain
  • 分支博弈
    • 挖礦也會為了不惜任何手段獲取利益
    • 如果所有節點均獨自挖礦不理會其他節點,並將所得收益放入自己口袋,就會出現一個節點挖一個分支的結果。由於機器的配置總是有差別的,那麼算力最強的節點挖得的分支必然是最長的,如果一個節點的分支不是最長的,意味其收益存在不被認可的風險(即零收益)。為了降低、逃避此風險,一些節點肯定會聯合起來一起挖某個分支,試圖成為最長的分支或保持最長分支優勢。
    • 一旦出現有少量的節點聯合,那麼其他節點必然會效仿,否則他們收益為零的風險會更大。於是,分支迅速合併彙集,所有節點都會選擇算力更強的分支,只有這樣才能保持收益風險最小。最終,只會存在一個這樣的分支,就是主幹分支(Best/Main Chain)。
    • 對於不誠實節點來說,結局是無奈的:能且只能加入主幹挖礦。不加入即意味被拋棄,零收益;加入就是老實幹活,按佔比分成。