很多人知道比特幣平痰,區(qū)塊鏈汞舱。但是整個(gè)網(wǎng)絡(luò)是怎么保證這個(gè)去中心化的?可能很多人并不了解宗雇,或者說(shuō)想了解但是不知道從何入手昂芜。其實(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)證過(guò)的記錄幼苛。
至今為止,在主干區(qū)塊鏈上焕刮,沒有發(fā)生一起成功的攻擊舶沿,一次都沒有。
通過(guò)創(chuàng)造出新區(qū)塊配并,比特幣以一個(gè)確定的但不斷減慢的速率被鑄造出來(lái)括荡。大約每十分鐘產(chǎn)生一個(gè)新區(qū)塊,每一個(gè)新區(qū)塊都伴隨著一定數(shù)量從無(wú)到有的全新比特幣溉旋。每開采210,000個(gè)塊畸冲,大約耗時(shí)4年,貨幣發(fā)行速率降低50%。
在2016年的某個(gè)時(shí)刻邑闲,在第420,000個(gè)區(qū)塊被“挖掘”出來(lái)之后降低到12.5比特幣/區(qū)塊算行。在第13,230,000個(gè)區(qū)塊(大概在2137年被挖出)之前,新幣的發(fā)行速度會(huì)以指數(shù)形式進(jìn)行64次“二等分”苫耸。到那時(shí)每區(qū)塊發(fā)行比特幣數(shù)量變?yōu)楸忍貛诺淖钚∝泿艈挝弧?聰州邢。最終,在經(jīng)過(guò)1,344萬(wàn)個(gè)區(qū)塊之后褪子,所有的共20,999,999.9769億聰比特幣將全部發(fā)行完畢量淌。換句話說(shuō),到2140年左右嫌褪,會(huì)存在接近2,100萬(wàn)比特幣类少。在那之后,新的區(qū)塊不再包含比特幣獎(jiǎng)勵(lì)渔扎,礦工的收益全部來(lái)自交易費(fèi)硫狞。
比特幣的去中心化共識(shí)由所有網(wǎng)絡(luò)節(jié)點(diǎn)的4種獨(dú)立過(guò)程相互作用而產(chǎn)生:
· 每個(gè)全節(jié)點(diǎn)依據(jù)綜合標(biāo)準(zhǔn)對(duì)每個(gè)交易進(jìn)行獨(dú)立驗(yàn)證
· 通過(guò)完成工作量證明算法的驗(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)列表:
交易的語(yǔ)法和數(shù)據(jù)結(jié)構(gòu)必須正確。
輸入與輸出列表都不能為空漏益。
交易的字節(jié)大小是小于MAX_BLOCK_SIZE的蛹锰。
每一個(gè)輸出值,以及總量绰疤,必須在規(guī)定值的范圍內(nèi) (小于2,100萬(wàn)個(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萬(wàn)個(gè)幣货葬,大于0)采幌。
如果輸入值的總和小于輸出值的總和,交易將被中止震桶。
如果交易費(fèi)用太低以至于無(wú)法進(jìn)入一個(gè)空的區(qū)塊休傍,交易將被拒絕。
每一個(gè)輸入的解鎖腳本必須依據(jù)相應(yīng)輸出的鎖定腳本來(lái)驗(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é)束忙厌,如同宣布誰(shuí)是最后的贏家。對(duì)于礦工們來(lái)說(shuō)江咳,獲得一個(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)存池也稱作交易池着饥,用來(lái)暫存尚未被加入到區(qū)塊的交易記錄。
2.1 交易塊齡惰赋,礦工費(fèi)和優(yōu)先級(jí)
A節(jié)點(diǎn)需要為內(nèi)存池中的每筆交易分配一個(gè)優(yōu)先級(jí)宰掉,并選擇較高優(yōu)先級(jí)的交易記錄來(lái)構(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ū)塊中用來(lái)存儲(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)高的交易來(lá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) : 每筆交易都有若干交易輸入陌粹,也就是資金來(lái)源撒犀,也都有若干筆交易輸出,也就是資金去向掏秩。一般來(lái)說(shuō)或舞,每一筆交易都要花費(fèi)(spend)一筆輸入,產(chǎn)生一筆輸出蒙幻,而其所產(chǎn)生的輸出映凳,就是“未花費(fèi)過(guò)的交易輸出”,也就是 UTXO邮破。
塊齡:UTXO的“塊齡”是自該UTXO被記錄到區(qū)塊鏈為止所經(jīng)歷過(guò)的區(qū)塊數(shù)诈豌,即這個(gè)UTXO在區(qū)塊鏈中的深度仆救。
2.2 創(chuàng)幣交易
區(qū)塊中的第一筆交易是筆特殊交易,稱為創(chuàng)幣交易或者coinbase交易矫渔。這個(gè)交易是由挖礦節(jié)點(diǎn)構(gòu)造并用來(lái)獎(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ū)塊有效叠聋。比特幣挖礦過(guò)程使用的是SHA256哈希函數(shù)。
用最簡(jiǎn)單的術(shù)語(yǔ)來(lái)說(shuō)受裹,挖礦節(jié)點(diǎn)不斷重復(fù)進(jìn)行嘗試碌补,直到它找到的隨機(jī)調(diào)整數(shù)使得產(chǎn)生的哈希值低于某個(gè)特定的目標(biāo)。哈希函數(shù)的結(jié)果無(wú)法提前得知棉饶,也沒有能得到一個(gè)特定哈希值的模式厦章。舉個(gè)例子,你一個(gè)人在屋里打臺(tái)球照藻,白球從A點(diǎn)到達(dá)B點(diǎn)袜啃,但是一個(gè)人推門進(jìn)來(lái)看到白球在B點(diǎn),卻無(wú)論如何是不知道如何從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
挖礦的過(guò)程就是找到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ù)才能贏,不過(guò)也很簡(jiǎn)單纵菌。假如幾局之后目標(biāo)降低為了5〔郏現(xiàn)在有一半機(jī)率以上扔出來(lái)的色子加起來(lái)點(diǎn)數(shù)會(huì)超過(guò)5,因此無(wú)效产艾。隨著目標(biāo)越來(lái)越小疤剑,要想贏的話滑绒,扔色子的次數(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í)間。那么問(wèn)題來(lái)了:為什么這個(gè)難度值是可調(diào)整的管钳?由誰(shuí)來(lái)調(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)單地說(shuō),難度被設(shè)定在聊闯,無(wú)論挖礦能力如何工猜,新區(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)單來(lái)說(shuō),如果網(wǎng)絡(luò)發(fā)現(xiàn)區(qū)塊產(chǎn)生速率比10分鐘要快時(shí)會(huì)增加難度回季。如果發(fā)現(xiàn)比10分鐘慢時(shí)則降低難度家制。
為了防止難度的變化過(guò)快正林,每個(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ī)制的第三步是通過(guò)網(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)呼猪,確保了礦工無(wú)法欺詐。在前面的章節(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è)無(wú)效的coinbase交易將使整個(gè)區(qū)塊無(wú)效,這將導(dǎo)致該區(qū)塊被拒絕诱篷,因此壶唤,該交易就不會(huì)成為總賬的一部分。
四棕所、區(qū)塊鏈的組裝與選擇
比特幣去中心化的共識(shí)機(jī)制的最后一步是將區(qū)塊集合至有最大工作量證明的鏈中闸盔。一旦一個(gè)節(jié)點(diǎn)驗(yàn)證了一個(gè)新的區(qū)塊,它將嘗試將新的區(qū)塊連接到到現(xiàn)存的區(qū)塊鏈琳省,將它們組裝起來(lái)迎吵。
節(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)被挖出來(lá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)通過(guò)“投票”來(lái)選擇它們想要延長(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)記為紅色的、來(lái)自加拿大的區(qū)塊沼死,還有一個(gè)被標(biāo)記為綠色的着逐、來(lái)自澳大利亞的區(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ū)塊來(lái)延長(zhǎng)區(qū)塊鏈(藍(lán)色-綠色)精绎,忽略晚幾秒到達(dá)的“紅色”區(qū)塊。那些首先收到“紅色”區(qū)塊的節(jié)點(diǎn)锌妻,會(huì)即刻以這個(gè)區(qū)塊為父區(qū)塊來(lái)產(chǎn)生新的候選區(qū)塊代乃,并嘗試尋找這個(gè)候選區(qū)塊的工作量證明解。同樣地,接受“綠色”區(qū)塊的節(jié)點(diǎn)會(huì)以這個(gè)區(qū)塊為鏈的頂點(diǎn)開始生成新塊搁吓,延長(zhǎng)這個(gè)鏈原茅。
新區(qū)塊延長(zhǎng)了分支
分叉問(wèn)題幾乎總是在一個(gè)區(qū)塊內(nèi)就被解決了。網(wǎng)絡(luò)中的一部分算力專注于“紅色”區(qū)塊為父區(qū)塊堕仔,在其之上建立新的區(qū)塊擂橘;另一部分算力則專注在“綠色”區(qū)塊上。即便算力在這兩個(gè)陣營(yíng)中平均分配摩骨,也總有一個(gè)陣營(yíng)搶在另一個(gè)陣營(yíng)前發(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ì)停下來(lái)卒暂。全網(wǎng)將“藍(lán)色-綠色-粉色”這條鏈識(shí)別為主鏈啄栓,“粉色”區(qū)塊為這條鏈的最后一個(gè)區(qū)塊。全部礦工立刻將他們產(chǎn)生的候選區(qū)塊的父區(qū)塊切換為“粉色”也祠,來(lái)延長(zhǎng)“藍(lán)色-綠色-粉色”這條鏈昙楚。
從理論上來(lái)說(shuō),兩個(gè)區(qū)塊的分叉是有可能的诈嘿,這種情況發(fā)生在因先前分叉而相互對(duì)立起來(lái)的礦工堪旧,又幾乎同時(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í)間谆扎。