深入比特幣原理(十三)——硬分叉與軟分叉

NO IMAGE

上一節我們瞭解了比特幣如何達成最終一致性,其中可能發生的區塊鏈分叉通常是自然發生又自然結束的。
比特幣目前已有100多項改進提案(詳細可見https://github.com/bitcoin/bips),可以看到比特幣社群開發者一直在致力於改進比特幣。但是不像傳統軟體的升級,一個分散式共識系統的升級是非常困難的,需要協調好所有的系統參與者。
每次升級可能會伴隨著區塊鏈的共識規則改變,這會導致整個網路中升級了軟體的節點與未升級軟體的節點執行在不同的規則下,於是分叉就產生了。

硬分叉
如果區塊鏈軟體的共識規則被改變,並且這種規則改變無法向前相容,舊節點無法認可新節點產生的區塊,即為硬分叉。

image.png

這時候舊節點會拒絕新規則的區塊,於是新節點和舊節點會開始在不同的區塊鏈上執行(挖礦、交易、驗證等),由於新舊節點可能長期存在,這種分叉也可能會長期持續下去。

image.png

上圖中Block 4a與Block 4b是自然分叉的結果,最終在Block 5整個區塊鏈達成了最終一致性(詳細可見《深入比特幣原理(十二)》)
假設當區塊鏈擴充套件到Block 6時釋出了改變共識規則的新客戶端版本,於是執行不同客戶端的節點出現分歧:
執行新版本的礦工將接受新規則下產生的區塊Block 7b;
執行舊版本的礦工由於不能認可新規則,將拒絕Block 7b,並挖出基於舊規則的Block 7a;
此時區塊鏈即發生了硬分叉,新舊礦工將在各自的區塊鏈上進行挖礦,他們的去留將決定兩條鏈的生死和價值。

硬分叉的過程
1.開發者釋出新的客戶端,新的客戶端改變了區塊鏈的共識規則且不被舊客戶端相容,於是客戶端軟體出現了分叉(software fork)。
2.區塊鏈網路中部分節點開始執行新的客戶端,在新規則下產生的交易與區塊將被舊節點拒絕,舊節點開始短暫的斷開與這些傳送被自己拒絕的交易與區塊新節點的連線,於是整個區塊鏈網路出現了分叉(network fork)。
3.執行新客戶端的礦工開始基於新規則挖礦,並會接受新規則下的交易與區塊,於是執行不同客戶端版本的礦工算力出現了分叉(mining fork)。
4.執行新客戶端的礦工開始挖出基於新規則的區塊,而舊客戶端的礦工仍然會挖掘基於舊規則的區塊,於是整個區塊鏈出現了分叉(chain fork)。

硬分叉的兩面性
在沒有得到幾乎所有生態中的參與者同意的情況下,硬分叉很可能會分裂整個比特幣生態,所以這是一種極具爭議和危險的區塊鏈升級技術。整個比特幣社群對於硬分叉非常謹慎,到目前為止,比特幣一共發生過兩次軟體升級造成的硬分叉,但都是意外情況(軟體BUG)引起,最終礦工們通過回退或全體升級達成了一致使事態影響沒有擴大。
但我認為硬分叉在未來關鍵的時刻將發揮巨大的作用,是比特幣可以長期發展的根基。
可以預見當比特幣即將遭遇重大風險,甚至滅頂之災時,這時候整個比特幣生態由於利益相關很容易就會達成共識,對比特幣客戶端進行升級以避免危機。
舉個形象的例子,如果有一天人類可以移民火星生活,一定會有人站會出來說人類不應該移民火星,因為那樣分裂了人類社會。但如果有一天地球資源枯竭,無法滿足人類生存的時候,相信幾乎所有人都會達成要移民的共識。
現在經常會聽到各種比特幣死亡論,比如量子計算機的發展,比特幣密碼演算法被破解等等,很多專家信誓旦旦的宣稱“如果發生XXX情況,比特幣就死亡了,所以比特幣沒有未來”。
現在你瞭解了硬分叉的存在,相信你可以理解要解決這些問題在技術上並不困難,在一個去中心化的系統中困難的是達成共識。要達成共識大部分時候可能很困難,但有時候也可能很簡單。

IFO(Initial Fork Offerings)
IFO是繼ICO後被創造出的新概念,一些社群或集團為了改進比特幣的機制而分叉出一條新的區塊鏈,這實際是一種硬分叉的場景。
如2017年8月1號,Bitcoin Cash(BCH)區塊鏈成功在區塊高度478559與主鏈分離。這一新的加密貨幣預設區塊大小為8MB,並且可以實現區塊容量的動態調整。
由於舊節點只認可小於1MB的區塊,所以執行BCH客戶端節點產生的區塊無法向前相容,將被舊節點拒絕,最後執行不同客戶端的礦工將會長期執行在兩條不同的區塊鏈上(BTC和BCH)。

IFO本來可以是一種很不錯的對比特幣改造的實驗方法,但在BCH後短時間內連續出現了BTG(比特幣黃金)、BCD(比特幣鑽石)、SBTC(超級比特幣)等十幾條分叉鏈,卻成為了許多利益集團斂財的工具。
在2018年3月18日某著名自媒體給出了分叉幣在上市後的市值下跌幅度,可以看出市場對於他們的態度:
BCH:跌幅78%
BTG:跌幅84%
BCD:跌幅96%
SBTC:跌幅98%
BTF:跌幅90%
BTN:跌幅99.96%
BTP:跌幅89%
BTV:跌幅99.47%
UBTC:跌幅97%
BTH:跌幅99%
BCX:跌幅67%
LBTC:跌幅86%
BCK:跌幅99.75%
GOD:跌幅90%
QBTC:跌幅88%
WBTC:跌幅92.92%
ABTC:跌幅99.99%
BIFI:跌幅99.1%

這些分叉幣不但絲毫沒有影響比特幣的價值與地位,反而他們自己看起來大部分即將歸零。
《區塊鏈漫談:比特幣是否有價值》中很多朋友反問我,比特幣可以無限複製出無數種加密貨幣,為什麼只有比特幣有價值?現在事實給了你們一些答案,你可以複製比特幣的程式碼,創造無數個比特幣,但是比特幣背後的生態(開發者、礦工、交易所、商家、使用者)你無法複製。就像如果把淘寶、微信的原始碼給你,你能再造一個淘寶和微信嗎?

軟分叉
如果區塊鏈的共識規則改變後,這種改變是向前相容的,舊節點可以相容新節點產生的區塊,即為軟分叉。

image.png

實際上,軟分叉通常剛開始並不會產生兩條區塊鏈,因為新規則下產生的塊會被舊節點接受,舊節點只是無法識別新規則的真實意義。所以新舊節點仍然處於同一條區塊鏈上,對整個系統的影響也就較小。

軟分叉在比特幣歷史上發生過多次,這裡以BIP-34舉例:
我們在《深入比特幣原理(十)》中說過Coinbase交易的輸入中有一個欄位coinbase data內容可以任意定製。BIP-34就是要求在coinbase data中必須包含塊高度(Block Height)資訊且將塊版本(Block version)從“1”修改為“2”。
顯然在舊規則下,節點並不關心coinbase data是什麼內容,完全可以相容包含塊高度資訊的區塊,所以不會就此產生分叉。
BIP-34的升級過程如下:
1.剛開始礦工將塊版本號變為“2”以表示準備好進行升級,此時並不要求coinbase data必須包含塊高度資訊。
2.當最近1000個區塊中超過75%的版本號為“2”時,整個系統開始強制要求版本號為“2”的區塊coinbase data中必須包含塊高度資訊。但版本號為“1”的區塊仍然被所有節點接受。
3.當最近1000個區塊中超過95%的版本號為“2”時,版本號為“1”的區塊開始被認為無效,節點會拒絕版本號為“1”的區塊,於是會逼迫最後一小部分節點進行升級。(否則完成挖礦獲得的獎勵將失去價值)。

軟分叉提供了一種逐步升級比特幣的方式,除了BIP-34,還有BIP-65、BIP-66、BIP-9等特性進行了軟分叉升級,它們的升級方式也有一定的區別,有興趣的朋友可以去文首提供的BIP連結中檢視具體的升級內容和方法。

軟分叉的爭議
軟分叉相比硬分叉雖然“溫和”了不少,但由於軟分叉必須向前相容,也就是說不能增加新欄位,只能在已有結構下做修改,所以升級空間有限。且軟分叉同樣也存在著一些爭議,比如:
技術債務
軟分叉相比硬分叉技術實現要複雜很多,會使區塊鏈的程式碼變得更復雜,這不利於未來的程式碼維護,也更容易出現BUG。

驗證放鬆
未升級的客戶端視新規則下的區塊為有效,但是對新規則並不進行驗證,對於舊節點而言它不再能做完整的驗證,似乎有悖去中心化的理念

不可逆轉
硬分叉通常是擴充套件共識規則,而軟分叉是收緊共識規則,所以一旦進行了軟分叉,想要回退就非常困難了,很可能造成硬分叉而導致資金損失。

分叉的博弈
最後我們聊一下在比特幣的升級(分叉)中存在的不同“角色”,大家可以自己思考下他們各自的博弈關係。
社群開發者:這是比特幣最核心的團體,沒有他們孜孜不倦的貢獻高質量的程式碼,比特幣可能早就不存在了,任何的比特幣核心客戶端升級都需要由他們發起。可以說比特幣的未來主要靠這些開發者決定。
礦工:比特幣主要的既得利益者,礦工的算力支援對於比特幣升級(分叉)至關重要,如果沒有礦工的支援,任何升級都不可能成功。礦工越多,算力越大,去中心化程度就越高,安全性越強,往往礦工的數量與規模和數字貨幣的價值是呈正相關的。
交易所:早期並沒有交易所的存在,但是現在交易所對於數字貨幣的發展越來越重要,對於一項區塊鏈分叉,如果沒有交易所的支援,礦工獲得的數字貨幣將難以兌現,價值會大大縮水,所以交易所的支援對於分叉幣或山寨幣是非常關鍵的。
商家:也是早期不存在的“角色”,但是商家的支援對於比特幣的商用化程序非常重要,如果沒有任何商家願意支援比特幣,比特幣要成為貨幣的理想將無法實現,所以商家的支援度也是未來數字貨幣生死的關鍵因素。
終端使用者:一種數字貨幣的推廣,離不開廣大終端使用者的支援,如果一種數字貨幣沒有人願意使用,那它最終也會消亡。

目前比特幣分叉的博弈中前三者的影響力較大,比如社群開發者和礦工長期存在擴容的爭議,BCH就是礦工單方面的分叉行為,我理解礦工是希望擴大區塊的,這樣他們可以收取更多的交易費,而且區塊的增大會淘汰一些小礦工(需要更大的儲存和更好的頻寬條件);而社群開發者卻希望通過二層協議(閃電網路我們將在後面單獨講解)的方式去解決擴容問題,將一些交易從鏈上放到鏈下,讓比特幣主網路作為一種“清算網路”,顯然這對於礦工來說沒有什麼好處。
後兩者目前的影響力有限,但是一旦數字貨幣技術等各方面條件成熟,商家與終端使用者的選擇會變得極其重要,網際網路的“網路效應”會開始發揮作用,不同領域的數字貨幣可能出現贏者通吃的局面。

本文部分圖片來自知乎貓本聰:[block #9] 分叉、睡教與SegWit2X

作者|張吉杭 


點選瞭解:《深入區塊鏈原理》系列連載