本文首發於深刻淺出區塊鏈社區 原文連接:比特幣如何達成共識 - 最長鏈的選擇原文已更新,請讀者前往原文閱讀網絡
比特幣沒有中心機構,幾乎全部的完整節點都有一份公共總賬本,那麼你們如何達成共識:確認哪一份纔是公認權威的總帳本呢?異步
這實際上是一個經濟問題,在經濟活動中的每一個人都是自私自利的,追求的是利益的最大化,一個節點工做量只有在其餘的節點認同其是有效的(打包的新區塊,其餘的節點只有驗證經過纔會加入到區塊鏈中,並在網絡上傳播),纔可以過得收益, 而只有遵照規則纔會獲得其餘的節點認同。 所以,基於逐利,節點就會自發的遵照協議。共識就是數以萬計的獨立節點遵照了簡單的規則(經過異步交互)自發造成的。學習
共識:共同遵照的協議規範區塊鏈
在工做量證實一篇,咱們瞭解經過工做量證實來競爭記帳,權威的總賬本是怎麼達到共識的,沒有徹底說清楚,今天補上, 實際上,比特幣的共識由全部節點的4個獨立過程相互做用而產生:設計
共識最終目的是保證比特幣不停的在工做量最大的區塊鏈上運轉,工做量最大的區塊鏈就是權威的公共總賬本。get
第1 2 3步在比特幣如何挖礦-工做量證實一篇有提到過,下面着重講第4步。博客
先來一個定義,把累計了最多難度的區塊鏈。在通常狀況下,也是包含最多區塊的那個鏈稱爲主鏈 每個(挖礦)節點老是選擇並嘗試延長主鏈。it
當有兩名礦工在幾乎在相同的時間內,各自都算得了工做量證實解,便當即傳播本身的「獲勝」區塊到網絡中,先是傳播給鄰近的節點然後傳播到整個網絡。每一個收到有效區塊的節點都會將其併入並延長區塊鏈。 當這個兩個區塊傳播時,一些節點首先收到#3458A, 一些節點首先收到#3458B,這兩個候選區塊(一般這兩個候選區塊會包含幾乎相同的交易)都是主鏈的延伸,分叉就會產生,這時分叉出有競爭關係的兩條鏈,如圖: 兩個塊都收到的節點,會把其中有更多工做量的一條會繼續做爲主鏈,另外一條做爲備用鏈保存(保存是由於備用鏈未來可能會超過主鏈難度稱爲新主鏈)。社區
收到#3458A的(挖礦)節點,會馬上以這個區塊爲父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工做量證實解。一樣地,接受#3458B區塊的節點會以這個區塊爲鏈的頂點開始生成新塊,延長這個鏈(下面稱爲B鏈)。 這時總會有一方搶先發現工做量證實解並將其傳播出去,假設以#3458B爲父區塊的工做量證實首先解出,如圖: 比特幣
當本來以#3458A爲父區塊求解的節點在收到#3458B, #3459B以後,會馬上將B鏈做爲主鏈(由於#3458A爲頂點的鏈已經不是最長鏈了)繼續挖礦。
節點也有可能先收到#3459B,再收到#3458B,收到#3459B時,會被認爲是「孤塊「(由於還找不到#3459B的父塊#3458B)保存在孤塊池中,一旦收到父塊#3458B時,節點就會將孤塊從孤塊池中取出,而且鏈接到它的父區塊,讓它做爲區塊鏈的一部分。
比特幣將區塊間隔設計爲10分鐘,是在更快速的交易確認和更低的分叉機率間做出的妥協。更短的區塊產生間隔會讓交易確認更快地完成,也會致使更加頻繁地區塊鏈分叉。與之相對地,長的間隔會減小分叉數量,卻會致使更長的確認時間。 ☛ 深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
☛ 個人知識星球爲各位解答區塊鏈技術問題,歡迎加入討論。
☛ 關注公衆號「深刻淺出區塊鏈技術」第一時間獲取區塊鏈技術信息。