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