一文看懂區塊鏈分叉是怎麼回事
原標題:一文看懂區塊鏈分叉是怎麼回事
本文從技術角度分析一下,在區塊鏈節點軟體升級的過程中會發生什麼情況,為什麼會出現分叉,以及出現分叉之後區塊鏈的走向。
區塊鏈為什麼會分叉?
節點軟體承載著共識演算法,當部分節點的軟體升級到新版之後,由於互相之間的共識演算法不完全一致,在面對新挖出的區塊時,會按照各自共識演算法的要求做出取捨,把自己認為合法的區塊納入主鏈。於是在區塊鏈網路里就會出現不同的主鏈,各自被一部分礦工節點所擁護並在其上開挖新塊,這就是分叉。
本文只討論這種由於共識演算法差異所產生的分叉,至於因網路傳播速度差異等原因導致的分叉則不在討論範圍內。
不一致的共識演算法之間可能存在著一定的相容性,不同的組合情況決定了分叉最後的歸宿。
新舊版本軟體之間相容性的各種情況
以下內容可能會比較拗口,為了方便表達,先定義兩個簡稱——
舊版塊:舊版軟體挖出的新區塊
新版塊:新版軟體挖出的新區塊

區塊鏈分叉後的推演
YA:任何版本都會承認版本升級前的歷史
YB:任何版本都會承認自己挖出的新區塊
YC:舊版軟體接受新版塊(具有前向相容性)
ND:舊版軟體不接受新版塊(不具有前向相容性)
YE:新版軟體接受舊版塊
NF:新版軟體不接受舊版塊
注:前向相容性(forward compatibility)是指當一個軟體推出新版本之後,以前的舊版軟體仍然能夠接受並處理新版軟體輸出的資料。比如用Word 2013儲存的檔案能夠用Word 2011開啟並繼續編輯。
為什麼有時候相容有時候不相容?
舊版軟體對新版塊的相容性(YC/ND)往往是版本升級本身的內容決定的,比如擴容(區塊尺寸從8M調整為32M),這時候新版塊在舊版軟體看來就是非法的(ND);而像升級後禁用某個操作碼,這時候新版塊在舊版軟體看來是合法的(YC)。
新版軟體對舊版塊的相容性(YE/NF)有可能是版本升級本身的內容所決定,比如擴容,這時候舊版塊在新版軟體看來就是合法的(YE);而像升級後禁用某個操作碼,這時候舊版塊在新版軟體看來是非法的(NF)。但NF也可能只是一種升級策略上的選擇,比如希望強制升級,這一點後文會有論述。
4種升級場景中不同軟體版本所面臨的局面
這4種場景對比著看,是有對稱性的:
S1和S4正好是相反的場景。S1是兩個版本互相接受,一起愉快地玩耍;S4是兩個版本互相不接受,各玩各的。
S2和S3這一對,如果拋開新版/舊版之間的傳承關係,就當作是甲、乙兩個獨立的版本來看待,其實是同一種情形,一個版本單向地接受另一個版本。
設甲接受乙,而乙不接受甲,那麼:
◉ 使用甲版本的礦工節點
兩個分叉對於他來說都是合法的,他會接受最長鏈作為自己工作的新起點。
挖出的新區塊只能被同類礦工節點(同樣使用甲版本)接受。如果網路內同類節點數量(不是算力!)不佔優勢,則挖出來的新區塊無法有效傳播,就無效了。
◉ 使用乙版本的礦工節點
兩個分叉中只能接受其中一個作為自己工作的起點。所有同類礦工節點只能頑固地堅守在這一個分叉上。
如果網路內同類礦工節點算力佔優勢,最終會替掉另一叉。
只要自己不放棄,無論如何自己這叉不會消失,已付出的工作量會保持有效。
硬分叉與軟分叉的區別
S2和S3同樣是產生了分叉,為什麼一個軟一個硬呢?可以這麼理解,正是因為有了“新/舊”的對比,才導致了這種區別,舊版軟體的前向相容性是兩者的分水嶺。當部分節點升級到新版之後,產生了分叉,分叉的軟和硬是站在舊版節點的立場上來說的。
S2場景下,舊版節點會認為兩個分叉都是合法的,按照以往的邏輯同等看待兩個分叉,哪個長就接受哪個,所以這個分叉是“軟”的。
S3場景下,有一個分叉是不合法的,舊版節點肯定不會接受它,所以這個分叉是“硬”的。
當使用舊版軟體的礦工節點面臨硬分叉的時候,他就不得不做一個艱難的決定:是堅守自己的版本還是更新到新版本。比如當初BCH與BTC分道揚鑣的時候,一部分礦工選擇了堅守在原來那條鏈上,繼續執行BTC;而另一部分則選擇更新到新版本,轉而接受另一條鏈,這意味著進入了一個新的分叉幣世界。
當然,硬分叉之後,哪一條鏈能夠繼續享有原來的名字,這就不是技術問題了,而是社群的認可(交易所的認可)決定的。比如BCH從BTC分叉出來的時候,BTC這個名字被原來的那條鏈繼續享有,分叉出來的就是BCH;而BCH歷史上幾次重要的硬分叉,都是分叉出來的鏈沿用BCH這個名字,原本的鏈則被棄用了;BCH剛剛完成的這次硬分叉,目前看基本結論是吳忌寒陣營ABC版本產生的新鏈能夠繼續享有BCH這個名字,而CSW陣營的BSV版本則堅守在原鏈上,反倒淪為分叉幣,那個分叉幣發展如何還有待觀察,但大概率是不會享有BCH這個名字了。
兩種硬分叉的區別
S3與S4兩種場景,站在舊版節點的立場上來說,都是不接受新版塊,所以都是硬分叉。但對於新版節點而言,是否能夠接受舊版塊,結果是不同的。
作為硬分叉的主導者,他的目的是推廣新版軟體,希望儘快結束過渡期。基於這種訴求,ND+NF(新版軟體不接受舊版塊)會比ND+YE(新版軟體接受舊版塊)更有優勢。
NF還是YE(新版軟體是否接受舊版塊)?前面提到,這個事情可能取決於軟體升級本身所涉及的內容,但有時候升級所發生的改變並不排斥舊版塊(比如擴容),那麼是否接受舊版塊就可以是一個策略選擇。升級(硬分叉)的主導者往往與新版軟體的提供者是一體的,他們可以在新版軟體中設定對自己有利的安排。
設想一種極端情況,假定吳忌寒希望支援ABC團隊完成一次硬分叉升級,吳控制的礦池調集了佔BCH全網50%的算力啟用了新版軟體,其他所有礦工節點暫時停留在舊版軟體上。
如果新版軟體選擇了YE方式,吳礦池雖然有50%的概率率先挖出新塊,但沒有人替他傳播,只有他自己在這個叉上工作,而其他節點都在挖另一個叉,一旦那個叉長度佔優,吳礦池會接受那個叉繼續工作,實際上就是把自己前面的工作報廢掉了。
為了保證不浪費,就要確保自己的獨特叉永遠長度佔優(保持超過全網50%的算力),等待局勢發生變化(更多的礦工節點升級到新版)。
而如果新版軟體選擇NF方式,就簡單很多了,吳礦池不會接受另一個分叉,一心一意挖自己的叉,其算力佔全網算力的比重低一些也不會導致自己這個叉被吃掉,可以更從容地等待變化來臨。
所以,從主導者的角度來看,尤其是投入算力支援的主導者,選擇NF會讓升級過程更簡單,更乾脆,減少變數,避免經濟損失。當然,這也是一條不歸路,雖然自己在這個叉上投入的工作量會一直保持有效,但如果這個分叉最終被市場拋棄,那麼一切投入都會歸零。
BCH在2018年11月16日實施的這次升級包含兩項更新:
1)對區塊內交易增加規範交易排序(CTOR);
2)增加兩個操作碼(OP_CHECKDATASIG和OP_CHECKDATASIGVERIFY)。
簡單分析不難判斷,第1條是YC+NF的,第2條是ND+YE的,綜合下來就是ND+NF的,所以這是一次屬於S4場景的硬分叉。
既然這樣,分叉後兩條鏈各行其道,誰也不會“吃掉”誰,為什麼還要不惜血本調集大量算力進行這種隔空搏殺呢?我想這裡面可能有兩個原因:
一個是要爭奪BCH的冠名權。分叉之後,哪條鏈才是正宗的BCH,哪條是分叉幣?一般慣例是“最長鏈”勝出。目前看吳陣營已經達到了預期的目的。(注:這裡的最長鏈指的是最大累積難度,而不是單純指區塊鏈的高度)
另一個就是“護法”。這次硬分叉的反對方CSW來勢洶洶,放言要對新鏈進行攻擊。新鏈初生,江湖地位不穩,所以調集算力進行保護是有必要的。不過截至目前,據稱在新鏈上並未發現明顯的被攻擊跡象。隨著新BCH地位穩固,被社群廣泛接受,CSW再要實名發起攻擊就要承擔更多的社會壓力了。
延伸閱讀:<a href="http://www.bbcaijing.cn/geek/25015.html" target="_blank" rel="noopener">極客_BCH分叉(Fork)在即,分叉到底解決了什麼問題?</a>