大家可能經常會在區塊鏈相關的新聞和技術介紹中聽過 分叉(Fork)這個詞,往往會分為 硬分叉 Hard fork 和 軟分叉 Soft fork。
聽上去好像很高深的感覺!其實不然,並不是一些什麼特別的事,實際上,分叉無時無刻都在發生,何解?請繼續往下看。
眾所周知,區塊鏈是一種去中心化的分散式賬冊系統,由於鏈上各個節點所處的位置和時鐘均不相同,網絡傳輸數據或多或少也會造成延遲,所以會造成區塊不同步的情況,從而導致每條被複製的"賬本"都不一定一致,所以分叉會經常發生,但由於中本聰在設計之初已考慮到這個情況,所有節點將會選擇長度最長的鏈為最可信任的賬本,鏈上所有節點將會以此為準,所以往往都能解決暫時性分叉的問題。
而接下來所要討論的兩種特殊的分叉 硬分叉 Hard fork 和 軟分叉 Soft fork ,這兩種特殊的分叉將是因為「共識規則」的修改而導致。
造成硬分叉和軟分叉的原因
在使用傳統中心化系統的時候,為了對系統進行"升級",只需要在系統中部署即可完成;而要對區塊鏈進行"升級",比如說區塊鏈中的共識機制、區塊大小等等的一些「共識規則」進行修改,但由於不像傳統中心化系統那樣,各個節點的版本不一致,從而會造成不兼容的情況發生,然而當中有些節點認可新修改的系統,而有些不認可,那就導致因為意見分歧,新系統成為分支,各自獨立發展。
什麼是硬分叉 Hard fork
先來看一下官方定義
A permanent divergence in the block chain, commonly occurs when non-upgraded nodes can’t validate blocks created by upgraded nodes that follow newer consensus rules.
在區塊鏈上發生永久性的分歧,通常會發生在新共識規劃發生後,沒有升級的節點無法驗證由已升級的節點創造的區塊。
簡單來說,硬分叉就是舊版系統的節點無法驗證的新版系統的節點打包的區塊,互不兼容。
什麼是軟分叉 Soft fork
A softfork is a change to the bitcoin protocol wherein only previously valid blocks/transactions are made invalid. Since old nodes will recognise the new blocks as valid, a softfork is backward-compatible.
軟分叉是對比特幣協議的改變,其中只有先前有效的區塊/事務無效。由於舊節點將新系統產生區塊識別為有效,所以軟分叉是向後兼容的
簡單來說,軟分叉就是原有節點能夠識別升級後的節點打包的區塊,而升級後的節點也能驗證舊版打包的區塊,互相兼容。
發生分叉的四種情況
1. 區塊鏈產生孤塊(軟分叉)
在正在記賬的情況下,由於網絡延遲等的技術原因,出現了兩個不同的區塊,其中一個區塊後面緊隨的區塊更多的時候,另一個較少的區塊則會被丟棄。(最長鏈原則)
2. 版本升級(軟分叉)
舊的節點並不會感知到區塊鏈的代碼已經發生改變,將繼續接受新節點打包的區塊,無痛兼容。
3. 版本升級(硬分叉)
就如上面提到,當系統升級時要求大家都升級至最新版本,如有人不同意新版本還使用舊版本,這種情況下就會形成硬分叉,但由於大部份節點都升級到新版本,所以舊版節點發現打包出塊都沒有人所支持,所以變得沒有價值,將從而轉向新版本的鏈上,這種情況將會隨著時間推演,慢慢過渡到新版本(當前前題是大部份節點都向新版本升級),最終將會消除這種分叉。
4. 社區、鏈、幣的分裂(硬分叉-永久性)
如果兩個不兼容的版本各自都有支持者,互相不接受包含對方版本特徵的鏈,所打包出來的區塊就逐漸會形成兩條鏈,而鏈上的加密貨幣也會被分成兩種,而這種由於涉及人性和利益的情況較難解決,所以唯獨可以算是永久性的分叉。
硬分叉經典例子
2016年 - 以太坊 ethereum 的一個知名項目 The DAO 被黑客攻擊,損失大約6000萬美元的以太幣 ETH,當時以太坊團隊就通過硬分叉的方式"追回"(回溯)被盜資產,從而令以太坊硬分叉出兩條鏈,原來的鏈 ETC(ethereum classic)以及新的鏈(ETH)
2017年8月1日 - BitCoin 硬分叉成 BitCoin (BTC) 和 BitCoin Cash (BTH)
硬分叉和軟分叉的優缺點
優點
軟分叉:可以保證不想升級的人不去升級,繼續使用原有版本;
硬分叉:可升級空間相對較大,因為硬分叉只要考慮能夠接受以前舊節點生產的交易和區塊就可以了,使得硬分叉可以對交易數據結構和區塊數據結構做更大膽的修改;
缺點
軟分叉:可升級空間有限。由於比特幣交易數據結構和區塊數據結構所有欄位都已經詳細定義好了,如果想保證向前兼容,就不可能增加新的欄位,否則舊節點就會拒絕,所以軟分叉的升級空間被束縛在對現有欄位的重新定義。就包括軟分叉就無法重新定義區塊數據結構中的「區塊大小」這個欄位,也就是說軟分叉永遠實現不了對1M區塊大小的突破。
硬分叉:硬分叉必須要求所有舊節點進行升級,否則舊節點就無法識別新節點生產的交易和區塊,導致區塊鏈分成兩條鏈;
總結
產生分叉是在區塊鏈中最常見不過的情況,而特殊情況可分為硬分叉和軟分叉,一般而言,發生軟分叉和硬分叉共有四種情況,而只有當出現利益或社區分裂的情況下,所產生的硬分叉是永久性的,其他的分叉(包括軟分叉和硬分叉)都是暫時性的,往往會被"最長鏈規則"所消除,回歸成一條主鏈。回到比特幣設計者中本聰的設計思路,不難看出在比特幣交易的數據結構和區塊結構中都有一個欄位「版本號」,其表明的意義就是「這筆交易或區塊所參照的規則」,所以能夠看出原意是希望使用硬分叉來修改大家之間的「共識規則」,如果我們要修改「共識規則」,那就需要使用新的「版本號」,而另一方面,軟分叉可在不修改「版本號」的前題下,修改「共識規則」。無論硬分叉或者軟分叉,最好的情況是在提議分叉前盡量取得大部份礦工節點之間的「共識」,這樣對整個系統來說才是最佳的方案。當然,人是最具不確定性的。