前文我們已經(jīng)詳細(xì)介紹過“挖礦”的過程粘室,節(jié)點完成“工作量證明”算出隨機數(shù)后即可生成區(qū)塊并寫入?yún)^(qū)塊鏈,問題來了卜范,如果有兩個節(jié)點同時解出隨機數(shù)衔统,都把生成的區(qū)塊廣播到網(wǎng)絡(luò)中隨后寫入?yún)^(qū)塊鏈,必然會導(dǎo)致區(qū)塊鏈分叉海雪。那么所有節(jié)點就不可能有一本公共的總帳本锦爵。
如何確認(rèn)哪一份才是公認(rèn)權(quán)威的總賬本呢?
中本聰在論文《比特幣:一種點對點網(wǎng)絡(luò)中的電子現(xiàn)金》中曾介紹奥裸,比特幣工作量證明機制的本質(zhì)是一CPU一票险掀,而最長鏈包含了最大的工作量,所以“大多數(shù)人”的決定就可以表達(dá)為最長鏈湾宙。
通俗來講就是樟氢,比特幣區(qū)塊是依靠礦工們不斷進行數(shù)學(xué)運算而產(chǎn)生的,每一個區(qū)塊都必須引用其上一個區(qū)塊侠鳄,因此最長的鏈也是最難以推翻和篡改的埠啃,所以節(jié)點永遠(yuǎn)認(rèn)為最長鏈才是有效的區(qū)塊鏈,只有在最長鏈上挖礦的礦工才能夠獲得獎勵伟恶,這就是我們常說的比特幣最長鏈原則碴开。
去中心化共識
在挖礦一篇,我們了解節(jié)點通過工作量證明來競爭記賬博秫,權(quán)威的總帳本是怎么達(dá)到共識的潦牛,由以下四個獨立過程相互作用而產(chǎn)生:
1.每個節(jié)點(挖礦節(jié)點)依據(jù)標(biāo)準(zhǔn)對每個交易進行獨立驗證
2.挖礦節(jié)點通過完成工作量證明,將交易記錄獨立打包進新區(qū)塊挡育,并廣播至網(wǎng)絡(luò)巴碗。
3.每個節(jié)點獨立的對新區(qū)塊進行校驗并組裝進區(qū)塊鏈
4.每個節(jié)點對區(qū)塊鏈進行獨立選擇,在工作量證明機制下選擇累計工作量最大的區(qū)塊鏈
共識最終目的是保證比特幣不停的在工作量最大的區(qū)塊鏈上運轉(zhuǎn)即寒,工作量最大的區(qū)塊鏈就是權(quán)威的公共總帳本橡淆。
最長鏈的選擇
先來一個定義,在一般情況下蒿叠,把累計了最多難度的區(qū)塊鏈明垢,也是包含最多區(qū)塊的那個鏈稱為主鏈蚣常。每一個(挖礦)節(jié)點總是選擇并嘗試延長主鏈市咽。
1.分叉
當(dāng)有兩名礦工在幾乎在相同的時間內(nèi),各自都算得了工作量證明解抵蚊,便立即傳播自己的“獲勝”區(qū)塊到網(wǎng)絡(luò)中施绎,先是傳播給鄰近的節(jié)點而后傳播到整個網(wǎng)絡(luò)溯革。每個收到有效區(qū)塊的節(jié)點都會將其并入并延長區(qū)塊鏈。當(dāng)這個兩個區(qū)塊傳播時谷醉,一些節(jié)點首先收到#3458A, 一些節(jié)點首先收到#3458B致稀,這兩個候選區(qū)塊(通常這兩個候選區(qū)塊會包含幾乎相同的交易)都是主鏈的延伸,分叉就會產(chǎn)生俱尼,這時分叉出有競爭關(guān)系的兩條鏈抖单,如圖:
對于兩個區(qū)塊都收到的節(jié)點,會把其中有更多工作量的一條鏈作為主鏈遇八,另一條鏈作為備用鏈保存(保存是因為備用鏈將來可能會超過主鏈難度稱為新主鏈)矛绘。
2.分叉解決
收到#3458A的(挖礦)節(jié)點,會立刻以這個區(qū)塊為父區(qū)塊來產(chǎn)生新的候選區(qū)塊刃永,并嘗試尋找這個候選區(qū)塊的工作量證明解货矮。同樣,收到#3458B區(qū)塊的節(jié)點會以這個區(qū)塊為父區(qū)塊開始生成新區(qū)塊斯够,延長這個鏈(下面稱為B鏈)囚玫。這時總會有一方搶先發(fā)現(xiàn)工作量證明解并將其傳播出去,假設(shè)以#3458B為父區(qū)塊的工作量證明首先解出读规,如圖:
當(dāng)原本以#3458A為父區(qū)塊求解的節(jié)點在收到#3458B, #3459B之后抓督,會立刻將B鏈作為主鏈(因為#3458A為頂點的鏈已經(jīng)不是最長鏈了)繼續(xù)挖礦。
節(jié)點也有可能先收到#3459B掖桦,再收到#3458B本昏,收到#3459B時,會被認(rèn)為是“孤塊“(因為還找不到#3459B的父塊#3458B)保存在孤塊池中枪汪,一旦收到父塊#3458B時涌穆,節(jié)點就會將孤塊從孤塊池中取出,并且連接到它的父區(qū)塊雀久,讓它作為區(qū)塊鏈的一部分宿稀。
3.一點思考
比特幣將區(qū)塊間隔設(shè)計為10分鐘,是在更快速的交易確認(rèn)和更低的分叉概率間作出的妥協(xié)赖捌。更短的區(qū)塊產(chǎn)生間隔會讓交易確認(rèn)更快地完成祝沸,也會導(dǎo)致更加頻繁地區(qū)塊鏈分叉。與之相對地越庇,長的間隔會減少分叉數(shù)量罩锐,卻會導(dǎo)致更長的確認(rèn)時間。