最长链原则
前文我們已經詳細介紹過“挖礦”的過程,節點完成“工作量證明”算出隨機數后即可生成區塊并寫入區塊鏈,問題來了,如果有兩個節點同時解出隨機數,都把生成的區塊廣播到網絡中隨后寫入區塊鏈,必然會導致區塊鏈分叉。那么所有節點就不可能有一本公共的總帳本。
如何確認哪一份才是公認權威的總賬本呢?
中本聰在論文《比特幣:一種點對點網絡中的電子現金》中曾介紹,比特幣工作量證明機制的本質是一CPU一票,而最長鏈包含了最大的工作量,所以“大多數人”的決定就可以表達為最長鏈。
通俗來講就是,比特幣區塊是依靠礦工們不斷進行數學運算而產生的,每一個區塊都必須引用其上一個區塊,因此最長的鏈也是最難以推翻和篡改的,所以節點永遠認為最長鏈才是有效的區塊鏈,只有在最長鏈上挖礦的礦工才能夠獲得獎勵,這就是我們常說的比特幣最長鏈原則。
去中心化共識
在挖礦一篇,我們了解節點通過工作量證明來競爭記賬,權威的總帳本是怎么達到共識的,由以下四個獨立過程相互作用而產生:
1.每個節點(挖礦節點)依據標準對每個交易進行獨立驗證
2.挖礦節點通過完成工作量證明,將交易記錄獨立打包進新區塊,并廣播至網絡。
3.每個節點獨立的對新區塊進行校驗并組裝進區塊鏈
4.每個節點對區塊鏈進行獨立選擇,在工作量證明機制下選擇累計工作量最大的區塊鏈
共識最終目的是保證比特幣不停的在工作量最大的區塊鏈上運轉,工作量最大的區塊鏈就是權威的公共總帳本。
最長鏈的選擇
先來一個定義,在一般情況下,**把累計了最多難度的區塊鏈,也是包含最多區塊的那個鏈稱為主鏈。**每一個(挖礦)節點總是選擇并嘗試延長主鏈。
1.分叉
當有兩名礦工在幾乎在相同的時間內,各自都算得了工作量證明解,便立即傳播自己的“獲勝”區塊到網絡中,先是傳播給鄰近的節點而后傳播到整個網絡。每個收到有效區塊的節點都會將其并入并延長區塊鏈。當這個兩個區塊傳播時,一些節點首先收到#3458A, 一些節點首先收到#3458B,這兩個候選區塊(通常這兩個候選區塊會包含幾乎相同的交易)都是主鏈的延伸,分叉就會產生,這時分叉出有競爭關系的兩條鏈,如圖:
對于兩個區塊都收到的節點,會把其中有更多工作量的一條鏈作為主鏈,另一條鏈作為備用鏈保存(保存是因為備用鏈將來可能會超過主鏈難度稱為新主鏈)。
2.分叉解決
收到#3458A的(挖礦)節點,會立刻以這個區塊為父區塊來產生新的候選區塊,并嘗試尋找這個候選區塊的工作量證明解。同樣,收到#3458B區塊的節點會以這個區塊為父區塊開始生成新區塊,延長這個鏈(下面稱為B鏈)。這時總會有一方搶先發現工作量證明解并將其傳播出去,假設以#3458B為父區塊的工作量證明首先解出,如圖:
當原本以#3458A為父區塊求解的節點在收到#3458B, #3459B之后,會立刻將B鏈作為主鏈(因為#3458A為頂點的鏈已經不是最長鏈了)繼續挖礦。
節點也有可能先收到#3459B,再收到#3458B,收到#3459B時,會被認為是“孤塊“(因為還找不到#3459B的父塊#3458B)保存在孤塊池中,一旦收到父塊#3458B時,節點就會將孤塊從孤塊池中取出,并且連接到它的父區塊,讓它作為區塊鏈的一部分。
3.一點思考
比特幣將區塊間隔設計為10分鐘,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易確認更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,長的間隔會減少分叉數量,卻會導致更長的確認時間。
總結
- 上一篇: 正确理解left join
- 下一篇: 多线程支持断点续传的文件传输--(摘自大