區塊鏈發生永久性分歧,在新共識規則發布後,部分沒有升級的節點無法驗證已經升級的節點生產的區塊,通常硬分叉就會發生。代碼出現一個硬分叉,會改變挖礦算法的難度級別。
基本介紹
- 中文名:硬分叉
- 外文名:permanent divergence
- 適用範圍:區塊鏈術語
定義,官方定義,抽象定義,比特幣區塊鏈上執行硬分叉的具體案例,正在策劃的區塊擴容硬分叉,軟分叉,對比軟分叉和硬分叉的優缺點,
定義
官方定義
硬分叉和軟分叉在bitcoin.org上都有定義,但定義其實很模糊,原文中硬分叉被定義成這樣:
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。
區塊鏈發生永久性分歧,在新共識規則發布後,部分沒有升級的節點無法驗證已經升級的節點生產的區塊,通常硬分叉就會發生。
抽象定義
硬分叉是指比特幣區塊格式或交易格式(這就是廣泛流傳的“共識”)發生改變時,未升級的節點拒絕驗證已經升級的節點生產出的區塊,不過已經升級的節點可以驗證未升級節點生產出的區塊,然後大家各自延續自己認為正確的鏈,所以分成兩條鏈。
比特幣區塊鏈上執行硬分叉的具體案例
在2013年3月12日,當時是bitcoin qt 0.8.0 版本軟體發布了,0.8版本採用了一種新的資料庫level db。有的礦工節點升級了bitcoin qt 0.8版本,有的礦工還繼續使用bitcoin qt 0.7版本的軟體。雙方各自生產區塊,但bitcoin qt 0.8採用的新資料庫生產出的區塊被被qt 0.7版本節點拒絕掉。具體的原因是舊的資料庫對超過800Kb的區塊有時不接受。因此在區塊高度 225430 比特幣區塊鏈分成了兩條鏈,結果導致了比特幣區塊鏈產生兩條鏈,一條是包含大於800kb區塊的鏈,另一條是拒絕承認這些包含更大區塊的鏈,這就發生了硬分叉。
當時是採用bitcoin qt 0.8版本的礦工放棄了他們挖的鏈,退回到bitcoin qt 0.7版本上繼續挖礦。
這次硬分叉是一次意外,是bitcoin qt 0.8版本的軟體出了bug,導致採用舊軟體的節點拒絕驗證新軟體節點生產的區塊。但硬分叉的成因就是採用舊軟體版本的節點拒絕驗證採用新軟體版本的節點生產的區塊,然後雙方各自挖礦。
在2015年7月4日比特幣區塊鏈在區塊高度363731發生一次硬分叉。當時是Bitcoin Core 開發者往新版本的Bitcoin Core 0.10.0添加了BIP 66。這本來是一起軟分叉的修改,在比特幣網路上主要礦池都使用了0.10版本的軟體時,但有一個礦池BTC Nuggets沒有升級,導致BTC Nuggets挖出來的兩個區塊其他礦工拒絕掉,然後雙方就各自挖礦延續自己認為是正確的區塊鏈,由此產生硬分叉,分成了兩條鏈。
隨後bitcoin.org發布公告,呼籲礦工升級到bitcoin core 0.10.2版本來消滅分叉。
這也是一次意外,硬分叉的成因是採用新軟體版本的節點拒絕驗證採用舊軟體版本的節點生產的區塊,然後雙方各自挖礦。
到目前為止這兩次硬分叉都是意外,但硬分叉的成因前一個是因為對新產生的區塊格式在不同節點上產生分歧,後一個是因為對交易格式在不同節點上產生分歧。
正在策劃的區塊擴容硬分叉
目前比特幣社區正在策劃一次硬分叉,來由是目前的區塊被塞滿了交易,為了能在十分鐘一個區塊里容納更多的交易,就需要對區塊的數據結構做修改。區塊的數據結構如下圖。
目前比特幣網路主要的完整節點軟體是bitcoin core 0.12,這個軟體規定“區塊大小”這個欄位最大值為1M。這就導致最後一個欄位“交易”能夠容納的比特幣交易數據有限,一筆交易至少是250位元組,1Mb只能裝下4000多筆交易,平均每秒最多只能處理7筆交易。而因為實際的交易往往會達到500位元組的大小,實際上平均每秒往往只能容納3筆交易。
所以有人就提出將這個欄位的最大值調高,比如Bitcoin Classic這個軟體就將這個欄位的最大值調到2M,並且以後有計畫取前2016個區塊大小的中位數再乘一個約定好的倍數來決定下一批區塊的大小上限。而Bitcoin XT則將這個值修改為20M,並且每兩年翻一倍,直到上限值達到8.3G。而Bitcoin Unlimited則直接將這個欄位修改為由礦池決定自己打包多大。
問題是,使用這些修改了這個欄位的軟體的節點生產出的區塊就會和沒有升級的節點不兼容,沒升級的會拒絕驗證這些新節點生產的區塊。這就會導致硬分叉。
由此可見,所謂的硬分叉需要修改的“共識”就是指的是修改區塊數據結構格式,或修改交易數據結構格式。
軟分叉
在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.
當新共識規則發布後,沒有升級的節點會因為不知道新共識規則下,而生產不合法的區塊,就會產生臨時性分叉。
對比軟分叉和硬分叉的優缺點
軟分叉可以保證不想升級的人不去升級,這種不想升級的需求在現實生活中其實是很常見的。
硬分叉必須要求所有舊節點進行升級,否則舊節點就無法識別新節點生產的交易和區塊,導致區塊鏈分成兩條鏈。
軟分叉的升級空間有限,因為目前的比特幣交易數據結構和區塊數據結構所有欄位都已經詳細定義好了,你想保證向前兼容,就不可能增加新的欄位,否則舊節點就會拒絕你。所以軟分叉的升級空間補束縛在對現有欄位的重新定義。就包括軟分叉就無法重新定義區塊數據結構里的“區塊大小”這個欄位,也就是軟分叉永遠實現不了對1M區塊的突破。而且這種極端複雜的兼容性稍微出點錯,就會新舊節點不兼容,即導致硬分叉。這個事情已經發生過一次了。
硬分叉的升級空間則要大很多,因為硬分叉只要考慮能夠接受以前舊節點生產的交易和區塊就可以了,硬分叉不需要考慮舊節點是否會接受新節點生產的交易和區塊。那硬分叉就可以對交易數據結構和區塊數據結構更大膽的修改。
最後,比特幣交易數據結構和區塊數據結構都有一個欄位叫“版本號”,意義是“明確這筆交易或區塊參照的規則”。這意味著中本聰是希望使用硬分叉來修改這些規則,就是說如果要修改規則,那就重新定義版本號。但軟分叉在不修改“版本號”的前提下,卻修改了規則。