最新內(nèi)容會(huì)更新在主站深入淺出區(qū)塊鏈社區(qū)
原文鏈接:比特幣如何達(dá)成共識(shí) - 最長(zhǎng)鏈的選擇
比特幣沒(méi)有中心機(jī)構(gòu),幾乎所有的完整節(jié)點(diǎn)都有一份公共總帳本,那么大家如何達(dá)成共識(shí):確認(rèn)哪一份才是公認(rèn)權(quán)威的總賬本呢?
為什么要遵守協(xié)議
這其實(shí)是一個(gè)經(jīng)濟(jì)問(wèn)題,在經(jīng)濟(jì)活動(dòng)中的每個(gè)人都是自私自利的,追求的是利益的最大化,一個(gè)節(jié)點(diǎn)工作量只有在其他的節(jié)點(diǎn)認(rèn)同其是有效的(打包的新區(qū)塊,其他的節(jié)點(diǎn)只有驗(yàn)證通過(guò)才會(huì)加入到區(qū)塊鏈中,并在網(wǎng)絡(luò)上傳播),才能夠過(guò)得收益,
而只有遵守規(guī)則才會(huì)得到其他的節(jié)點(diǎn)認(rèn)同。
因此,基于逐利,節(jié)點(diǎn)就會(huì)自發(fā)的遵守協(xié)議。共識(shí)就是數(shù)以萬(wàn)計(jì)的獨(dú)立節(jié)點(diǎn)遵守了簡(jiǎn)單的規(guī)則(通過(guò)異步交互)自發(fā)形成的。
共識(shí):共同遵守的協(xié)議規(guī)范
去中心化共識(shí)
在工作量證明一篇,我們了解通過(guò)工作量證明來(lái)競(jìng)爭(zhēng)記賬,權(quán)威的總帳本是怎么達(dá)到共識(shí)的,沒(méi)有完全說(shuō)清楚,今天補(bǔ)上,
實(shí)際上,比特幣的共識(shí)由所有節(jié)點(diǎn)的4個(gè)獨(dú)立過(guò)程相互作用而產(chǎn)生:
- 每個(gè)節(jié)點(diǎn)(挖礦節(jié)點(diǎn))依據(jù)標(biāo)準(zhǔn)對(duì)每個(gè)交易進(jìn)行獨(dú)立驗(yàn)證
- 挖礦節(jié)點(diǎn)通過(guò)完成工作量證明,將交易記錄獨(dú)立打包進(jìn)新區(qū)塊
- 每個(gè)節(jié)點(diǎn)獨(dú)立的對(duì)新區(qū)塊進(jìn)行校驗(yàn)并組裝進(jìn)區(qū)塊鏈
- 每個(gè)節(jié)點(diǎn)對(duì)區(qū)塊鏈進(jìn)行獨(dú)立選擇,在工作量證明機(jī)制下選擇累計(jì)工作量最大的區(qū)塊鏈
共識(shí)最終目的是保證比特幣不停的在工作量最大的區(qū)塊鏈上運(yùn)轉(zhuǎn),工作量最大的區(qū)塊鏈就是權(quán)威的公共總帳本。
第1 2 3步在比特幣如何挖礦-工作量證明一篇有提到過(guò),下面著重講第4步。
最長(zhǎng)鏈的選擇
先來(lái)一個(gè)定義,把累計(jì)了最多難度的區(qū)塊鏈。在一般情況下,也是包含最多區(qū)塊的那個(gè)鏈稱(chēng)為主鏈
每一個(gè)(挖礦)節(jié)點(diǎn)總是選擇并嘗試延長(zhǎng)主鏈。
分叉
當(dāng)有兩名礦工在幾乎在相同的時(shí)間內(nèi),各自都算得了工作量證明解,便立即傳播自己的“獲勝”區(qū)塊到網(wǎng)絡(luò)中,先是傳播給鄰近的節(jié)點(diǎn)而后傳播到整個(gè)網(wǎng)絡(luò)。每個(gè)收到有效區(qū)塊的節(jié)點(diǎn)都會(huì)將其并入并延長(zhǎng)區(qū)塊鏈。
當(dāng)這個(gè)兩個(gè)區(qū)塊傳播時(shí),一些節(jié)點(diǎn)首先收到#3458A, 一些節(jié)點(diǎn)首先收到#3458B,這兩個(gè)候選區(qū)塊(通常這兩個(gè)候選區(qū)塊會(huì)包含幾乎相同的交易)都是主鏈的延伸,分叉就會(huì)產(chǎn)生,這時(shí)分叉出有競(jìng)爭(zhēng)關(guān)系的兩條鏈,如圖:
兩個(gè)塊都收到的節(jié)點(diǎn),會(huì)把其中有更多工作量的一條會(huì)繼續(xù)作為主鏈,另一條作為備用鏈保存(保存是因?yàn)閭溆面湆?lái)可能會(huì)超過(guò)主鏈難度稱(chēng)為新主鏈)。
分叉解決
收到#3458A的(挖礦)節(jié)點(diǎn),會(huì)立刻以這個(gè)區(qū)塊為父區(qū)塊來(lái)產(chǎn)生新的候選區(qū)塊,并嘗試尋找這個(gè)候選區(qū)塊的工作量證明解。同樣地,接受#3458B區(qū)塊的節(jié)點(diǎn)會(huì)以這個(gè)區(qū)塊為鏈的頂點(diǎn)開(kāi)始生成新塊,延長(zhǎng)這個(gè)鏈(下面稱(chēng)為B鏈)。
這時(shí)總會(huì)有一方搶先發(fā)現(xiàn)工作量證明解并將其傳播出去,假設(shè)以#3458B為父區(qū)塊的工作量證明首先解出,如圖:
當(dāng)原本以#3458A為父區(qū)塊求解的節(jié)點(diǎn)在收到#3458B, #3459B之后,會(huì)立刻將B鏈作為主鏈(因?yàn)?3458A為頂點(diǎn)的鏈已經(jīng)不是最長(zhǎng)鏈了)繼續(xù)挖礦。
節(jié)點(diǎn)也有可能先收到#3459B,再收到#3458B,收到#3459B時(shí),會(huì)被認(rèn)為是“孤塊“(因?yàn)檫€找不到#3459B的父塊#3458B)保存在孤塊池中,一旦收到父塊#3458B時(shí),節(jié)點(diǎn)就會(huì)將孤塊從孤塊池中取出,并且連接到它的父區(qū)塊,讓它作為區(qū)塊鏈的一部分。
比特幣將區(qū)塊間隔設(shè)計(jì)為10分鐘,是在更快速的交易確認(rèn)和更低的分叉概率間作出的妥協(xié)。更短的區(qū)塊產(chǎn)生間隔會(huì)讓交易確認(rèn)更快地完成,也會(huì)導(dǎo)致更加頻繁地區(qū)塊鏈分叉。與之相對(duì)地,長(zhǎng)的間隔會(huì)減少分叉數(shù)量,卻會(huì)導(dǎo)致更長(zhǎng)的確認(rèn)時(shí)間。
深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客