1. 程式人生 > >比特幣如何達成共識 - 最長鏈的選擇

比特幣如何達成共識 - 最長鏈的選擇

區塊鏈 比特幣

比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳本,那麽大家如何達成共識:確認哪一份才是公認權威的總賬本呢?

為什麽要遵守協議

這其實是一個經濟問題,在經濟活動中的每個人都是自私自利的,追求的是利益的最大化,一個節點工作量只有在其他的節點認同其是有效的(打包的新區塊,其他的節點只有驗證通過才會加入到區塊鏈中,並在網絡上傳播),才能夠過得收益,
而只有遵守規則才會得到其他的節點認同。
因此,基於逐利,節點就會自發的遵守協議。共識就是數以萬計的獨立節點遵守了簡單的規則(通過異步交互)自發形成的。

共識:共同遵守的協議規範

去中心化共識

在工作量證明一篇,我們了解通過工作量證明來競爭記賬,權威的總帳本是怎麽達到共識的,沒有完全說清楚,今天補上,

實際上,比特幣的共識由所有節點的4個獨立過程相互作用而產生:

  1. 每個節點(挖礦節點)依據標準對每個交易進行獨立驗證
  2. 挖礦節點通過完成工作量證明,將交易記錄獨立打包進新區塊
  3. 每個節點獨立的對新區塊進行校驗並組裝進區塊鏈
  4. 每個節點對區塊鏈進行獨立選擇,在工作量證明機制下選擇累計工作量最大的區塊鏈

共識最終目的是保證比特幣不停的在工作量最大的區塊鏈上運轉,工作量最大的區塊鏈就是權威的公共總帳本。

第1 2 3步在比特幣如何挖礦-工作量證明一篇有提到過,下面著重講第4步。

最長鏈的選擇

先來一個定義,把累計了最多難度的區塊鏈。在一般情況下,也是包含最多區塊的那個鏈稱為主鏈
每一個(挖礦)節點總是選擇並嘗試延長主鏈。

分叉

當有兩名礦工在幾乎在相同的時間內,各自都算得了工作量證明解,便立即傳播自己的“獲勝”區塊到網絡中,先是傳播給鄰近的節點而後傳播到整個網絡。每個收到有效區塊的節點都會將其並入並延長區塊鏈。
當這個兩個區塊傳播時,一些節點首先收到#3458A, 一些節點首先收到#3458B,這兩個候選區塊(通常這兩個候選區塊會包含幾乎相同的交易)都是主鏈的延伸,分叉就會產生,這時分叉出有競爭關系的兩條鏈,如圖:
技術分享圖片
兩個塊都收到的節點,會把其中有更多工作量的一條會繼續作為主鏈,另一條作為備用鏈保存(保存是因為備用鏈將來可能會超過主鏈難度稱為新主鏈)。

分叉解決

收到#3458A的(挖礦)節點,會立刻以這個區塊為父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受#3458B區塊的節點會以這個區塊為鏈的頂點開始生成新塊,延長這個鏈(下面稱為B鏈)。

這時總會有一方搶先發現工作量證明解並將其傳播出去,假設以#3458B為父區塊的工作量證明首先解出,如圖:
技術分享圖片

當原本以#3458A為父區塊求解的節點在收到#3458B, #3459B之後,會立刻將B鏈作為主鏈(因為#3458A為頂點的鏈已經不是最長鏈了)繼續挖礦。

節點也有可能先收到#3459B,再收到#3458B,收到#3459B時,會被認為是“孤塊“(因為還找不到#3459B的父塊#3458B)保存在孤塊池中,一旦收到父塊#3458B時,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作為區塊鏈的一部分。

比特幣將區塊間隔設計為10分鐘,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易確認更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,長的間隔會減少分叉數量,卻會導致更長的確認時間。

比特幣如何達成共識 - 最長鏈的選擇