很多人知道比特幣,區(qū)塊鏈。但是整個(gè)網(wǎng)絡(luò)是怎么保證這個(gè)去中心化的?可能很多人并不了解,或者說想了解但是不知道從何入手。其實(shí)從挖礦這個(gè)角度去理解區(qū)塊鏈會(huì)更能抓住重點(diǎn),了解了挖礦,你就了解了區(qū)塊鏈,了解了去中心化。
簡(jiǎn)介

可以將區(qū)塊鏈看作一本記錄所有交易的公開總帳簿(列表),比特幣網(wǎng)絡(luò)中的每個(gè)參與者都把它看作一本所有權(quán)的權(quán)威記錄。
比特幣沒有中心機(jī)構(gòu),幾乎所有的完整節(jié)點(diǎn)都有一份公共總帳的備份,這份總帳可以被視為認(rèn)證過的記錄。
至今為止,在主干區(qū)塊鏈上,沒有發(fā)生一起成功的攻擊,一次都沒有。
通過創(chuàng)造出新區(qū)塊,比特幣以一個(gè)確定的但不斷減慢的速率被鑄造出來。大約每十分鐘產(chǎn)生一個(gè)新區(qū)塊,每一個(gè)新區(qū)塊都伴隨著一定數(shù)量從無到有的全新比特幣。每開采210,000個(gè)塊,大約耗時(shí)4年,貨幣發(fā)行速率降低50%。

在2016年的某個(gè)時(shí)刻,在第420,000個(gè)區(qū)塊被“挖掘”出來之后降低到12.5比特幣/區(qū)塊。在第13,230,000個(gè)區(qū)塊(大概在2137年被挖出)之前,新幣的發(fā)行速度會(huì)以指數(shù)形式進(jìn)行64次“二等分”。到那時(shí)每區(qū)塊發(fā)行比特幣數(shù)量變?yōu)楸忍貛诺淖钚∝泿艈挝弧?聰。最終,在經(jīng)過1,344萬個(gè)區(qū)塊之后,所有的共20,999,999.9769億聰比特幣將全部發(fā)行完畢。換句話說,到2140年左右,會(huì)存在接近2,100萬比特幣。在那之后,新的區(qū)塊不再包含比特幣獎(jiǎng)勵(lì),礦工的收益全部來自交易費(fèi)。

比特幣的去中心化共識(shí)由所有網(wǎng)絡(luò)節(jié)點(diǎn)的4種獨(dú)立過程相互作用而產(chǎn)生:
· 每個(gè)全節(jié)點(diǎn)依據(jù)綜合標(biāo)準(zhǔn)對(duì)每個(gè)交易進(jìn)行獨(dú)立驗(yàn)證
· 通過完成工作量證明算法的驗(yàn)算,挖礦節(jié)點(diǎn)將交易記錄獨(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ū)塊鏈
一、獨(dú)立驗(yàn)證
在收到交易后,每一個(gè)節(jié)點(diǎn)都會(huì)在全網(wǎng)廣播前對(duì)這些交易進(jìn)行校驗(yàn),并以接收時(shí)的相應(yīng)順序,為有效的新交易建立一個(gè)池(交易池)。
每一個(gè)節(jié)點(diǎn)在校驗(yàn)每一筆交易時(shí),都需要對(duì)照一個(gè)長(zhǎng)長(zhǎng)的標(biāo)準(zhǔn)列表:
交易的語法和數(shù)據(jù)結(jié)構(gòu)必須正確。
輸入與輸出列表都不能為空。
交易的字節(jié)大小是小于MAX_BLOCK_SIZE的。
每一個(gè)輸出值,以及總量,必須在規(guī)定值的范圍內(nèi) (小于2,100萬個(gè)幣,大于0)。
沒有哈希等于0,N等于-1的輸入(coinbase交易不應(yīng)當(dāng)被中繼)。
nLockTime是小于或等于INT_MAX的。
交易的字節(jié)大小是大于或等于100的。
交易中的簽名數(shù)量應(yīng)小于簽名操作數(shù)量上限。
解鎖腳本(Sig)只能夠?qū)?shù)字壓入棧中,并且鎖定腳本(Pubkey)必須要符合isStandard的格式 (該格式將會(huì)拒絕非標(biāo)準(zhǔn)交易)。
池中或位于主分支區(qū)塊中的一個(gè)匹配交易必須是存在的。
對(duì)于每一個(gè)輸入,如果引用的輸出存在于池中任何的交易,該交易將被拒絕。
對(duì)于每一個(gè)輸入,在主分支和交易池中尋找引用的輸出交易。如果輸出交易缺少任何一個(gè)輸入,該交易將成為一個(gè)孤立的交易。如果與其匹配的交易還沒有出現(xiàn)在池中,那么將被加入到孤立交易池中。
對(duì)于每一個(gè)輸入,如果引用的輸出交易是一個(gè)coinbase輸出,該輸入必須至少獲得COINBASE_MATURITY (100)個(gè)確認(rèn)。
對(duì)于每一個(gè)輸入,引用的輸出是必須存在的,并且沒有被花費(fèi)。
使用引用的輸出交易獲得輸入值,并檢查每一個(gè)輸入值和總值是否在規(guī)定值的范圍內(nèi) (小于2100萬個(gè)幣,大于0)。
如果輸入值的總和小于輸出值的總和,交易將被中止。
如果交易費(fèi)用太低以至于無法進(jìn)入一個(gè)空的區(qū)塊,交易將被拒絕。
每一個(gè)輸入的解鎖腳本必須依據(jù)相應(yīng)輸出的鎖定腳本來驗(yàn)證。
二、將交易記錄獨(dú)立打包進(jìn)新區(qū)塊
以下挖礦節(jié)點(diǎn)取名為A挖礦節(jié)點(diǎn)
挖礦節(jié)點(diǎn)時(shí)刻監(jiān)聽著傳播到比特幣網(wǎng)絡(luò)的新區(qū)塊。而這些新加入的區(qū)塊對(duì)挖礦節(jié)點(diǎn)有著特殊的意義。礦工間的競(jìng)爭(zhēng)以新區(qū)塊的傳播而結(jié)束,如同宣布誰是最后的贏家。對(duì)于礦工們來說,獲得一個(gè)新區(qū)塊意味著某個(gè)參與者贏了,而他們則輸了這場(chǎng)競(jìng)爭(zhēng)。然而,一輪競(jìng)爭(zhēng)的結(jié)束也代表著下一輪競(jìng)爭(zhēng)的開始。
驗(yàn)證交易后,比特幣節(jié)點(diǎn)會(huì)將這些交易添加到自己的內(nèi)存池中。內(nèi)存池也稱作交易池,用來暫存尚未被加入到區(qū)塊的交易記錄。
2.1 交易塊齡,礦工費(fèi)和優(yōu)先級(jí)

A節(jié)點(diǎn)需要為內(nèi)存池中的每筆交易分配一個(gè)優(yōu)先級(jí),并選擇較高優(yōu)先級(jí)的交易記錄來構(gòu)建候選區(qū)塊。
一個(gè)交易想要成為“較高優(yōu)先級(jí)”,需滿足的條件:優(yōu)先值大于57,600,000,這個(gè)值的生成依賴于3個(gè)參數(shù):一個(gè)比特幣(即1億聰),年齡為一天(144個(gè)區(qū)塊),交易的大小為250個(gè)字節(jié):
High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000
區(qū)塊中用來存儲(chǔ)交易的前50K字節(jié)是保留給較高優(yōu)先級(jí)交易的。節(jié)點(diǎn)在填充這50K字節(jié)的時(shí)候,會(huì)優(yōu)先考慮這些最高優(yōu)先級(jí)的交易,不管它們是否包含了礦工費(fèi)。這種機(jī)制使得高優(yōu)先級(jí)交易即便是零礦工費(fèi),也可以優(yōu)先被處理。
然后,A挖礦節(jié)點(diǎn)會(huì)選出那些包含最小礦工費(fèi)的交易,并按照“每千字節(jié)礦工費(fèi)”進(jìn)行排序,優(yōu)先選擇礦工費(fèi)高的交易來填充剩下的區(qū)塊。
如區(qū)塊中仍有剩余空間,A挖礦節(jié)點(diǎn)可以選擇那些不含礦工費(fèi)的交易。有些礦工會(huì)竭盡全力將那些不含礦工費(fèi)的交易整合到區(qū)塊中,而其他礦工也許會(huì)選擇忽略這些交易。
在區(qū)塊被填滿后,內(nèi)存池中的剩余交易會(huì)成為下一個(gè)區(qū)塊的候選交易。因?yàn)檫@些交易還留在內(nèi)存池中,所以隨著新的區(qū)塊被加到鏈上,這些交易輸入時(shí)所引用UTXO的深度(即交易“塊齡”)也會(huì)隨著變大。由于交易的優(yōu)先值取決于它交易輸入的“塊齡”,所以這個(gè)交易的優(yōu)先值也就隨之增長(zhǎng)了。最后,一個(gè)零礦工費(fèi)交易的優(yōu)先值就有可能會(huì)滿足高優(yōu)先級(jí)的門檻,被免費(fèi)地打包進(jìn)區(qū)塊。
UTXO(Unspent Transaction Output) : 每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(fèi)(spend)一筆輸入,產(chǎn)生一筆輸出,而其所產(chǎn)生的輸出,就是“未花費(fèi)過的交易輸出”,也就是 UTXO。
塊齡:UTXO的“塊齡”是自該UTXO被記錄到區(qū)塊鏈為止所經(jīng)歷過的區(qū)塊數(shù),即這個(gè)UTXO在區(qū)塊鏈中的深度。
2.2 創(chuàng)幣交易
區(qū)塊中的第一筆交易是筆特殊交易,稱為創(chuàng)幣交易或者coinbase交易。這個(gè)交易是由挖礦節(jié)點(diǎn)構(gòu)造并用來獎(jiǎng)勵(lì)礦工們所做的貢獻(xiàn)的。假設(shè)此時(shí)一個(gè)區(qū)塊的獎(jiǎng)勵(lì)是25比特幣,A挖礦的節(jié)點(diǎn)會(huì)創(chuàng)建“向A的地址支付25.1個(gè)比特幣(包含礦工費(fèi)0.1個(gè)比特幣)”這樣一個(gè)交易,把生成交易的獎(jiǎng)勵(lì)發(fā)送到自己的錢包。A挖出區(qū)塊獲得的獎(jiǎng)勵(lì)金額是coinbase獎(jiǎng)勵(lì)(25個(gè)全新的比特幣)和區(qū)塊中全部交易礦工費(fèi)的總和。
三、構(gòu)造區(qū)塊
A節(jié)點(diǎn)已經(jīng)構(gòu)建了一個(gè)候選區(qū)塊,那么就輪到A的礦機(jī)對(duì)這個(gè)新區(qū)塊進(jìn)行“挖掘”,求解工作量證明算法以使這個(gè)區(qū)塊有效。比特幣挖礦過程使用的是SHA256哈希函數(shù)。
用最簡(jiǎn)單的術(shù)語來說,挖礦節(jié)點(diǎn)不斷重復(fù)進(jìn)行嘗試,直到它找到的隨機(jī)調(diào)整數(shù)使得產(chǎn)生的哈希值低于某個(gè)特定的目標(biāo)。哈希函數(shù)的結(jié)果無法提前得知,也沒有能得到一個(gè)特定哈希值的模式。舉個(gè)例子,你一個(gè)人在屋里打臺(tái)球,白球從A點(diǎn)到達(dá)B點(diǎn),但是一個(gè)人推門進(jìn)來看到白球在B點(diǎn),卻無論如何是不知道如何從A到B的。哈希函數(shù)的這個(gè)特性意味著:得到哈希值的唯一方法是不斷的嘗試,每次隨機(jī)修改輸入,直到出現(xiàn)適當(dāng)?shù)墓V怠?/p>
需要以下參數(shù)
? block的版本 version
? 上一個(gè)block的hash值: prev_hash
? 需要寫入的交易記錄的hash樹的值: merkle_root
? 更新時(shí)間: ntime
? 當(dāng)前難度: nbits
挖礦的過程就是找到x使得
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
上式的x的范圍是0~2^32, TARGET可以根據(jù)當(dāng)前難度求出的。
簡(jiǎn)單打個(gè)比方,想象人們不斷扔一對(duì)色子以得到小于一個(gè)特定點(diǎn)數(shù)的游戲。第一局,目標(biāo)是12。只要你不扔出兩個(gè)6,你就會(huì)贏。然后下一局目標(biāo)為11。玩家只能扔10或更小的點(diǎn)數(shù)才能贏,不過也很簡(jiǎn)單。假如幾局之后目標(biāo)降低為了5?,F(xiàn)在有一半機(jī)率以上扔出來的色子加起來點(diǎn)數(shù)會(huì)超過5,因此無效。隨著目標(biāo)越來越小,要想贏的話,扔色子的次數(shù)會(huì)指數(shù)級(jí)的上升。最終當(dāng)目標(biāo)為2時(shí)(最小可能點(diǎn)數(shù)),只有一個(gè)人平均扔36次或2%扔的次數(shù)中,他才能贏。
3.1 難度的調(diào)整
如前所述,目標(biāo)決定了難度,進(jìn)而影響求解工作量證明算法所需要的時(shí)間。那么問題來了:為什么這個(gè)難度值是可調(diào)整的?由誰來調(diào)整?如何調(diào)整?
比特幣的區(qū)塊平均每10分鐘生成一個(gè)。這就是比特幣的心跳,是貨幣發(fā)行速率和交易達(dá)成速度的基礎(chǔ)。不僅是在短期內(nèi),而是在幾十年內(nèi)它都必須要保持恒定。在此期間,計(jì)算機(jī)性能將飛速提升。此外,參與挖礦的人和計(jì)算機(jī)也會(huì)不斷變化。為了能讓新區(qū)塊的保持10分鐘一個(gè)的產(chǎn)生速率,挖礦的難度必須根據(jù)這些變化進(jìn)行調(diào)整。事實(shí)上,難度是一個(gè)動(dòng)態(tài)的參數(shù),會(huì)定期調(diào)整以達(dá)到每10分鐘一個(gè)新區(qū)塊的目標(biāo)。簡(jiǎn)單地說,難度被設(shè)定在,無論挖礦能力如何,新區(qū)塊產(chǎn)生速率都保持在10分鐘一個(gè)。
那么,在一個(gè)完全去中心化的網(wǎng)絡(luò)中,這樣的調(diào)整是如何做到的呢?難度的調(diào)整是在每個(gè)完整節(jié)點(diǎn)中獨(dú)立自動(dòng)發(fā)生的。每2,016個(gè)區(qū)塊(2周產(chǎn)生的區(qū)塊)中的所有節(jié)點(diǎn)都會(huì)調(diào)整難度。難度的調(diào)整公式是由最新2,016個(gè)區(qū)塊的花費(fèi)時(shí)長(zhǎng)與20,160分鐘(兩周,即這些區(qū)塊以10分鐘一個(gè)速率所期望花費(fèi)的時(shí)長(zhǎng))比較得出的。難度是根據(jù)實(shí)際時(shí)長(zhǎng)與期望時(shí)長(zhǎng)的比值進(jìn)行相應(yīng)調(diào)整的(或變難或變易)。簡(jiǎn)單來說,如果網(wǎng)絡(luò)發(fā)現(xiàn)區(qū)塊產(chǎn)生速率比10分鐘要快時(shí)會(huì)增加難度。如果發(fā)現(xiàn)比10分鐘慢時(shí)則降低難度。
為了防止難度的變化過快,每個(gè)周期的調(diào)整幅度必須小于一個(gè)因子(值為4)。如果要調(diào)整的幅度大于4倍,則按4倍調(diào)整。由于在下一個(gè)2,016區(qū)塊的周期不平衡的情況會(huì)繼續(xù)存在,所以進(jìn)一步的難度調(diào)整會(huì)在下一周期進(jìn)行。因此平衡哈希計(jì)算能力和難度的巨大差異有可能需要花費(fèi)幾個(gè)2,016區(qū)塊周期才會(huì)完成。
3.2 成功構(gòu)建區(qū)塊
舉個(gè)例子,當(dāng)前A節(jié)點(diǎn)在挖277,316個(gè)區(qū)塊,A挖礦節(jié)點(diǎn)一旦完成計(jì)算,立刻將這個(gè)區(qū)塊發(fā)給它的所有相鄰節(jié)點(diǎn)。這些節(jié)點(diǎn)在接收并驗(yàn)證這個(gè)新區(qū)塊后,也會(huì)繼續(xù)傳播此區(qū)塊。當(dāng)這個(gè)新區(qū)塊在網(wǎng)絡(luò)中擴(kuò)散時(shí),每個(gè)節(jié)點(diǎn)都會(huì)將它作為第277,316個(gè)區(qū)塊(父區(qū)塊為277,315)加到自身節(jié)點(diǎn)的區(qū)塊鏈副本中。當(dāng)挖礦節(jié)點(diǎn)收到并驗(yàn)證了這個(gè)新區(qū)塊后,它們會(huì)放棄之前對(duì)構(gòu)建這個(gè)相同高度區(qū)塊的計(jì)算,并立即開始計(jì)算區(qū)塊鏈中下一個(gè)區(qū)塊的工作。
3.3 校驗(yàn)新區(qū)塊
比特幣共識(shí)機(jī)制的第三步是通過網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)獨(dú)立校驗(yàn)每個(gè)新區(qū)塊。當(dāng)新區(qū)塊在網(wǎng)絡(luò)中傳播時(shí),每一個(gè)節(jié)點(diǎn)在將它轉(zhuǎn)發(fā)到其節(jié)點(diǎn)之前,會(huì)進(jìn)行一系列的測(cè)試去驗(yàn)證它。這確保了只有有效的區(qū)塊會(huì)在網(wǎng)絡(luò)中傳播。
每一個(gè)節(jié)點(diǎn)對(duì)每一個(gè)新區(qū)塊的獨(dú)立校驗(yàn),確保了礦工無法欺詐。在前面的章節(jié)中,我們看到了礦工們?nèi)绾稳ビ涗浺还P交易,以獲得在此區(qū)塊中創(chuàng)造的新比特幣和交易費(fèi)。為什么礦工不為他們自己記錄一筆交易去獲得數(shù)以千計(jì)的比特幣?這是因?yàn)槊恳粋€(gè)節(jié)點(diǎn)根據(jù)相同的規(guī)則對(duì)區(qū)塊進(jìn)行校驗(yàn)。一個(gè)無效的coinbase交易將使整個(gè)區(qū)塊無效,這將導(dǎo)致該區(qū)塊被拒絕,因此,該交易就不會(huì)成為總賬的一部分。
四、區(qū)塊鏈的組裝與選擇
比特幣去中心化的共識(shí)機(jī)制的最后一步是將區(qū)塊集合至有最大工作量證明的鏈中。一旦一個(gè)節(jié)點(diǎn)驗(yàn)證了一個(gè)新的區(qū)塊,它將嘗試將新的區(qū)塊連接到到現(xiàn)存的區(qū)塊鏈,將它們組裝起來。
節(jié)點(diǎn)維護(hù)三種區(qū)塊:
· 第一種是連接到主鏈上的,
· 第二種是從主鏈上產(chǎn)生分支的(備用鏈),
· 第三種是在已知鏈中沒有找到已知父區(qū)塊的。
有時(shí)候,新區(qū)塊所延長(zhǎng)的區(qū)塊鏈并不是主鏈,這一點(diǎn)我們將在下面“ 區(qū)塊鏈分叉”中看到。
如果節(jié)點(diǎn)收到了一個(gè)有效的區(qū)塊,而在現(xiàn)有的區(qū)塊鏈中卻未找到它的父區(qū)塊,那么這個(gè)區(qū)塊被認(rèn)為是“孤塊”。孤塊會(huì)被保存在孤塊池中,直到它們的父區(qū)塊被節(jié)點(diǎn)收到。一旦收到了父區(qū)塊并且將其連接到現(xiàn)有區(qū)塊鏈上,節(jié)點(diǎn)就會(huì)將孤塊從孤塊池中取出,并且連接到它的父區(qū)塊,讓它作為區(qū)塊鏈的一部分。當(dāng)兩個(gè)區(qū)塊在很短的時(shí)間間隔內(nèi)被挖出來,節(jié)點(diǎn)有可能會(huì)以相反的順序接收到它們,這個(gè)時(shí)候孤塊現(xiàn)象就會(huì)出現(xiàn)。
選擇了最大難度的區(qū)塊鏈后,所有的節(jié)點(diǎn)最終在全網(wǎng)范圍內(nèi)達(dá)成共識(shí)。隨著更多的工作量證明被添加到鏈中,鏈的暫時(shí)性差異最終會(huì)得到解決。挖礦節(jié)點(diǎn)通過“投票”來選擇它們想要延長(zhǎng)的區(qū)塊鏈,當(dāng)它們挖出一個(gè)新塊并且延長(zhǎng)了一個(gè)鏈,新塊本身就代表它們的投票。
區(qū)塊鏈分叉
因?yàn)閰^(qū)塊鏈?zhǔn)侨ブ行幕臄?shù)據(jù)結(jié)構(gòu),所以不同副本之間不能總是保持一致。區(qū)塊有可能在不同時(shí)間到達(dá)不同節(jié)點(diǎn),導(dǎo)致節(jié)點(diǎn)有不同的區(qū)塊鏈視角。解決的辦法是,每一個(gè)節(jié)點(diǎn)總是選擇并嘗試延長(zhǎng)代表累計(jì)了最大工作量證明的區(qū)塊鏈,也就是最長(zhǎng)的或最大累計(jì)難度的鏈。
當(dāng)有兩個(gè)候選區(qū)塊同時(shí)想要延長(zhǎng)最長(zhǎng)區(qū)塊鏈時(shí),分叉事件就會(huì)發(fā)生。正常情況下,分叉發(fā)生在兩名礦工在較短的時(shí)間內(nèi),各自都算得了工作量證明解的時(shí)候。兩個(gè)礦工在各自的候選區(qū)塊一發(fā)現(xiàn)解,便立即傳播自己的“獲勝”區(qū)塊到網(wǎng)絡(luò)中,先是傳播給鄰近的節(jié)點(diǎn)而后傳播到整個(gè)網(wǎng)絡(luò)。每個(gè)收到有效區(qū)塊的節(jié)點(diǎn)都會(huì)將其并入并延長(zhǎng)區(qū)塊鏈。如果該節(jié)點(diǎn)在隨后又收到了另一個(gè)候選區(qū)塊,而這個(gè)區(qū)塊又擁有同樣父區(qū)塊,那么節(jié)點(diǎn)會(huì)將這個(gè)區(qū)塊連接到候選鏈上。其結(jié)果是,一些節(jié)點(diǎn)收到了一個(gè)候選區(qū)塊,而另一些節(jié)點(diǎn)收到了另一個(gè)候選區(qū)塊,這時(shí)兩個(gè)不同版本的區(qū)塊鏈就出現(xiàn)了。
分叉之前

分叉開始

我們看到兩個(gè)礦工幾乎同時(shí)挖到了兩個(gè)不同的區(qū)塊。為了便于跟蹤這個(gè)分叉事件,我們?cè)O(shè)定有一個(gè)被標(biāo)記為紅色的、來自加拿大的區(qū)塊,還有一個(gè)被標(biāo)記為綠色的、來自澳大利亞的區(qū)塊。
假設(shè)有這樣一種情況,一個(gè)在加拿大的礦工發(fā)現(xiàn)了“紅色”區(qū)塊的工作量證明解,在“藍(lán)色”的父區(qū)塊上延長(zhǎng)了塊鏈。幾乎同一時(shí)刻,一個(gè)澳大利亞的礦工找到了“綠色”區(qū)塊的解,也延長(zhǎng)了“藍(lán)色”區(qū)塊。那么現(xiàn)在我們就有了兩個(gè)區(qū)塊:一個(gè)是源于加拿大的“紅色”區(qū)塊;另一個(gè)是源于澳大利亞的“綠色”。這兩個(gè)區(qū)塊都是有效的,均包含有效的工作量證明解并延長(zhǎng)同一個(gè)父區(qū)塊。這個(gè)兩個(gè)區(qū)塊可能包含了幾乎相同的交易,只是在交易的排序上有些許不同。
分叉導(dǎo)致網(wǎng)絡(luò)分裂

比特幣網(wǎng)絡(luò)中鄰近(網(wǎng)絡(luò)拓?fù)渖系泥徑?,而非地理上的)加拿大的?jié)點(diǎn)會(huì)首先收到“紅色”區(qū)塊,并建立一個(gè)最大累計(jì)難度的區(qū)塊,“紅色”區(qū)塊為這個(gè)鏈的最后一個(gè)區(qū)塊(藍(lán)色-紅色),同時(shí)忽略晚一些到達(dá)的“綠色”區(qū)塊。相比之下,離澳大利亞更近的節(jié)點(diǎn)會(huì)判定“綠色”區(qū)塊勝出,并以它為最后一個(gè)區(qū)塊來延長(zhǎng)區(qū)塊鏈(藍(lán)色-綠色),忽略晚幾秒到達(dá)的“紅色”區(qū)塊。那些首先收到“紅色”區(qū)塊的節(jié)點(diǎn),會(huì)即刻以這個(gè)區(qū)塊為父區(qū)塊來產(chǎn)生新的候選區(qū)塊,并嘗試尋找這個(gè)候選區(qū)塊的工作量證明解。同樣地,接受“綠色”區(qū)塊的節(jié)點(diǎn)會(huì)以這個(gè)區(qū)塊為鏈的頂點(diǎn)開始生成新塊,延長(zhǎng)這個(gè)鏈。
新區(qū)塊延長(zhǎng)了分支

分叉問題幾乎總是在一個(gè)區(qū)塊內(nèi)就被解決了。網(wǎng)絡(luò)中的一部分算力專注于“紅色”區(qū)塊為父區(qū)塊,在其之上建立新的區(qū)塊;另一部分算力則專注在“綠色”區(qū)塊上。即便算力在這兩個(gè)陣營中平均分配,也總有一個(gè)陣營搶在另一個(gè)陣營前發(fā)現(xiàn)工作量證明解并將其傳播出去。在這個(gè)例子中我們可以打個(gè)比方,假如工作在“綠色”區(qū)塊上的礦工找到了一個(gè)“粉色”區(qū)塊延長(zhǎng)了區(qū)塊鏈(藍(lán)色-綠色-粉色),他們會(huì)立刻傳播這個(gè)新區(qū)塊,整個(gè)網(wǎng)絡(luò)會(huì)都會(huì)認(rèn)為這個(gè)區(qū)塊是有效的,如上圖所示。
重新共識(shí)

所有在上一輪選擇“綠色”區(qū)塊為勝出者的節(jié)點(diǎn)會(huì)直接將這條鏈延長(zhǎng)一個(gè)區(qū)塊。然而,那些選擇“紅色”區(qū)塊為勝出者的節(jié)點(diǎn)現(xiàn)在會(huì)看到兩個(gè)鏈:“藍(lán)色-綠色-粉色”和“藍(lán)色-紅色”。如上圖所示,這些節(jié)點(diǎn)會(huì)根據(jù)結(jié)果將“藍(lán)色-綠色-粉色”這條鏈設(shè)置為主鏈,將“藍(lán)色-紅色”這條鏈設(shè)置為備用鏈。這些節(jié)點(diǎn)接納了新的更長(zhǎng)的鏈,被迫改變了原有對(duì)區(qū)塊鏈的觀點(diǎn),這就叫做鏈的重新共識(shí)。因?yàn)椤凹t”區(qū)塊做為父區(qū)塊已經(jīng)不在最長(zhǎng)鏈上,導(dǎo)致了他們的候選區(qū)塊已經(jīng)成為了“孤塊”,所以現(xiàn)在任何原本想要在“藍(lán)色-紅色”鏈上延長(zhǎng)區(qū)塊鏈的礦工都會(huì)停下來。全網(wǎng)將“藍(lán)色-綠色-粉色”這條鏈識(shí)別為主鏈,“粉色”區(qū)塊為這條鏈的最后一個(gè)區(qū)塊。全部礦工立刻將他們產(chǎn)生的候選區(qū)塊的父區(qū)塊切換為“粉色”,來延長(zhǎng)“藍(lán)色-綠色-粉色”這條鏈。
從理論上來說,兩個(gè)區(qū)塊的分叉是有可能的,這種情況發(fā)生在因先前分叉而相互對(duì)立起來的礦工,又幾乎同時(shí)發(fā)現(xiàn)了兩個(gè)不同區(qū)塊的解。然而,這種情況發(fā)生的幾率是很低的。單區(qū)塊分叉每周都會(huì)發(fā)生,而雙塊分叉則非常罕見。
比特幣將區(qū)塊間隔設(shè)計(jì)為10分鐘,是在更快速的交易確認(rèn)和更低的分叉概率間作出的妥協(xié)。更短的區(qū)塊產(chǎn)生間隔會(huì)讓交易清算更快地完成,也會(huì)導(dǎo)致更加頻繁地區(qū)塊鏈分叉。與之相對(duì)地,更長(zhǎng)的間隔會(huì)減少分叉數(shù)量,卻會(huì)導(dǎo)致更長(zhǎng)的清算時(shí)間。