區(qū)塊鏈發(fā)生永久性分歧,在新共識(shí)規(guī)則發(fā)布后,部分沒有升級的節(jié)點(diǎn)無法驗(yàn)證已經(jīng)升級的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,通常硬分叉就會(huì)發(fā)生。代碼出現(xiàn)一個(gè)硬分叉,會(huì)改變挖礦算法的難度級別。1
定義官方定義硬分叉和軟分叉在bitcoin.org上都有定義,但定義其實(shí)很模糊,原文中硬分叉被定義成這樣:
A permanent divergence in the the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules。
區(qū)塊鏈發(fā)生永久性分歧,在新共識(shí)規(guī)則發(fā)布后,部分沒有升級的節(jié)點(diǎn)無法驗(yàn)證已經(jīng)升級的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,通常硬分叉就會(huì)發(fā)生。
抽象定義硬分叉是指比特幣區(qū)塊格式或交易格式(這就是廣泛流傳的“共識(shí)”)發(fā)生改變時(shí),未升級的節(jié)點(diǎn)拒絕驗(yàn)證已經(jīng)升級的節(jié)點(diǎn)生產(chǎn)出的區(qū)塊,不過已經(jīng)升級的節(jié)點(diǎn)可以驗(yàn)證未升級節(jié)點(diǎn)生產(chǎn)出的區(qū)塊,然后大家各自延續(xù)自己認(rèn)為正確的鏈,所以分成兩條鏈。
比特幣區(qū)塊鏈上執(zhí)行硬分叉的具體案例在2013年3月12日,當(dāng)時(shí)是bitcoin qt 0.8.0 版本軟件發(fā)布了,0.8版本采用了一種新的數(shù)據(jù)庫level db。有的礦工節(jié)點(diǎn)升級了bitcoin qt 0.8版本,有的礦工還繼續(xù)使用bitcoin qt 0.7版本的軟件。雙方各自生產(chǎn)區(qū)塊,但bitcoin qt 0.8采用的新數(shù)據(jù)庫生產(chǎn)出的區(qū)塊被被qt 0.7版本節(jié)點(diǎn)拒絕掉。具體的原因是舊的數(shù)據(jù)庫對超過800Kb的區(qū)塊有時(shí)不接受。因此在區(qū)塊高度 225430 比特幣區(qū)塊鏈分成了兩條鏈,結(jié)果導(dǎo)致了比特幣區(qū)塊鏈產(chǎn)生兩條鏈,一條是包含大于800kb區(qū)塊的鏈,另一條是拒絕承認(rèn)這些包含更大區(qū)塊的鏈,這就發(fā)生了硬分叉。
當(dāng)時(shí)是采用bitcoin qt 0.8版本的礦工放棄了他們挖的鏈,退回到bitcoin qt 0.7版本上繼續(xù)挖礦。
這次硬分叉是一次意外,是bitcoin qt 0.8版本的軟件出了bug,導(dǎo)致采用舊軟件的節(jié)點(diǎn)拒絕驗(yàn)證新軟件節(jié)點(diǎn)生產(chǎn)的區(qū)塊。但硬分叉的成因就是采用舊軟件版本的節(jié)點(diǎn)拒絕驗(yàn)證采用新軟件版本的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,然后雙方各自挖礦。
在2015年7月4日比特幣區(qū)塊鏈在區(qū)塊高度363731發(fā)生一次硬分叉。當(dāng)時(shí)是Bitcoin Core 開發(fā)者往新版本的Bitcoin Core 0.10.0添加了BIP 66。這本來是一起軟分叉的修改,在比特幣網(wǎng)絡(luò)上主要礦池都使用了0.10版本的軟件時(shí),但有一個(gè)礦池BTC Nuggets沒有升級,導(dǎo)致BTC Nuggets挖出來的兩個(gè)區(qū)塊其他礦工拒絕掉,然后雙方就各自挖礦延續(xù)自己認(rèn)為是正確的區(qū)塊鏈,由此產(chǎn)生硬分叉,分成了兩條鏈。
隨后bitcoin.org發(fā)布公告,呼吁礦工升級到bitcoin core 0.10.2版本來消滅分叉。
這也是一次意外,硬分叉的成因是采用新軟件版本的節(jié)點(diǎn)拒絕驗(yàn)證采用舊軟件版本的節(jié)點(diǎn)生產(chǎn)的區(qū)塊,然后雙方各自挖礦。
到目前為止這兩次硬分叉都是意外,但硬分叉的成因前一個(gè)是因?yàn)閷π庐a(chǎn)生的區(qū)塊格式在不同節(jié)點(diǎn)上產(chǎn)生分歧,后一個(gè)是因?yàn)閷灰赘袷皆诓煌?jié)點(diǎn)上產(chǎn)生分歧。
正在策劃的區(qū)塊擴(kuò)容硬分叉目前比特幣社區(qū)正在策劃一次硬分叉,來由是目前的區(qū)塊被塞滿了交易,為了能在十分鐘一個(gè)區(qū)塊里容納更多的交易,就需要對區(qū)塊的數(shù)據(jù)結(jié)構(gòu)做修改。區(qū)塊的數(shù)據(jù)結(jié)構(gòu)如下圖。
目前比特幣網(wǎng)絡(luò)主要的完整節(jié)點(diǎn)軟件是bitcoin core 0.12,這個(gè)軟件規(guī)定“區(qū)塊大小”這個(gè)字段最大值為1M。這就導(dǎo)致最后一個(gè)字段“交易”能夠容納的比特幣交易數(shù)據(jù)有限,一筆交易至少是250字節(jié),1Mb只能裝下4000多筆交易,平均每秒最多只能處理7筆交易。而因?yàn)閷?shí)際的交易往往會(huì)達(dá)到500字節(jié)的大小,實(shí)際上平均每秒往往只能容納3筆交易。
所以有人就提出將這個(gè)字段的最大值調(diào)高,比如Bitcoin Classic這個(gè)軟件就將這個(gè)字段的最大值調(diào)到2M,并且以后有計(jì)劃取前2016個(gè)區(qū)塊大小的中位數(shù)再乘一個(gè)約定好的倍數(shù)來決定下一批區(qū)塊的大小上限。而Bitcoin XT則將這個(gè)值修改為20M,并且每兩年翻一倍,直到上限值達(dá)到8.3G。而Bitcoin Unlimited則直接將這個(gè)字段修改為由礦池決定自己打包多大。
問題是,使用這些修改了這個(gè)字段的軟件的節(jié)點(diǎn)生產(chǎn)出的區(qū)塊就會(huì)和沒有升級的節(jié)點(diǎn)不兼容,沒升級的會(huì)拒絕驗(yàn)證這些新節(jié)點(diǎn)生產(chǎn)的區(qū)塊。這就會(huì)導(dǎo)致硬分叉。
由此可見,所謂的硬分叉需要修改的“共識(shí)”就是指的是修改區(qū)塊數(shù)據(jù)結(jié)構(gòu)格式,或修改交易數(shù)據(jù)結(jié)構(gòu)格式。
軟分叉在bitcoin.org上,軟分叉的定義是這樣的:
A temporary fork in the block chain which commonly occurs when miners using non-upgraded nodes violate a new consensus rule their nodes don’t know about.
當(dāng)新共識(shí)規(guī)則發(fā)布后,沒有升級的節(jié)點(diǎn)會(huì)因?yàn)椴恢佬鹿沧R(shí)規(guī)則下,而生產(chǎn)不合法的區(qū)塊,就會(huì)產(chǎn)生臨時(shí)性分叉。
對比軟分叉和硬分叉的優(yōu)缺點(diǎn)軟分叉可以保證不想升級的人不去升級,這種不想升級的需求在現(xiàn)實(shí)生活中其實(shí)是很常見的。
硬分叉必須要求所有舊節(jié)點(diǎn)進(jìn)行升級,否則舊節(jié)點(diǎn)就無法識(shí)別新節(jié)點(diǎn)生產(chǎn)的交易和區(qū)塊,導(dǎo)致區(qū)塊鏈分成兩條鏈。
**軟分叉的升級空間有限,因?yàn)槟壳暗谋忍貛沤灰讛?shù)據(jù)結(jié)構(gòu)和區(qū)塊數(shù)據(jù)結(jié)構(gòu)所有字段都已經(jīng)詳細(xì)定義好了,你想保證向前兼容,就不可能增加新的字段,否則舊節(jié)點(diǎn)就會(huì)拒絕你。**所以軟分叉的升級空間補(bǔ)束縛在對現(xiàn)有字段的重新定義。就包括軟分叉就無法重新定義區(qū)塊數(shù)據(jù)結(jié)構(gòu)里的“區(qū)塊大小”這個(gè)字段,也就是軟分叉永遠(yuǎn)實(shí)現(xiàn)不了對1M區(qū)塊的突破。而且這種極端復(fù)雜的兼容性稍微出點(diǎn)錯(cuò),就會(huì)新舊節(jié)點(diǎn)不兼容,即導(dǎo)致硬分叉。這個(gè)事情已經(jīng)發(fā)生過一次了。
**硬分叉的升級空間則要大很多,**因?yàn)橛卜植嬷灰紤]能夠接受以前舊節(jié)點(diǎn)生產(chǎn)的交易和區(qū)塊就可以了,硬分叉不需要考慮舊節(jié)點(diǎn)是否會(huì)接受新節(jié)點(diǎn)生產(chǎn)的交易和區(qū)塊。那硬分叉就可以對交易數(shù)據(jù)結(jié)構(gòu)和區(qū)塊數(shù)據(jù)結(jié)構(gòu)更大膽的修改。
最后,**比特幣交易數(shù)據(jù)結(jié)構(gòu)和區(qū)塊數(shù)據(jù)結(jié)構(gòu)都有一個(gè)字段叫“版本號”,意義是“明確這筆交易或區(qū)塊參照的規(guī)則”。**這意味著中本聰是希望使用硬分叉來修改這些規(guī)則,就是說如果要修改規(guī)則,那就重新定義版本號。但軟分叉在不修改“版本號”的前提下,卻修改了規(guī)則。
本詞條內(nèi)容貢獻(xiàn)者為:
李嘉騫 - 博士 - 同濟(jì)大學(xué)