本文試圖從技術角度分析一下,在區塊鏈節點軟件升級的過程中會發生什麼情況,爲什麼會出現分叉,以及出現分叉之後區塊鏈的走向。

作者:胡捷,上海高級金融學院教授、前美聯儲高級經濟學家、長江商學院兼職教授

爲什麼會分叉?

節點軟件承載着共識算法,當部分節點的軟件升級到新版之後,由於互相之間的共識算法不完全一致,在面對新挖出的區塊時,會按照各自共識算法的要求做出取捨,把自己認爲合法的區塊納入主鏈。於是在區塊鏈網路里就會出現不同的主鏈,各自被一部分礦工節點所擁護並在其上開挖新塊,這就是分叉。

本文只討論這種由於共識算法差異所產生的分叉,至於因網絡傳播速度差異等原因導致的分叉則不在討論範圍內。

不一致的共識算法之間可能存在着一定的兼容性,不同的組合情況決定了分叉最後的歸宿。

新舊版本軟件之間兼容性的各種情況

以下內容可能會比較拗口,爲了方便表達,先定義兩個簡稱——

舊版塊:舊版軟件挖出的新區塊

新版塊:新版軟件挖出的新區塊

看不懂區塊鏈分叉,怎敢自稱技術「老司機」

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 同樣是產生了分叉,爲什麼一個軟一個硬呢?可以這麼理解,正是因爲有了「新 / 舊」的對比,才導致了這種區別,舊版軟件的前向兼容性是兩者的分水嶺 [3]。當部分節點升級到新版之後,產生了分叉,分叉的軟和硬是站在舊版節點的立場上來說的。

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 再要實名發起攻擊就要承擔更多的社會壓力了。