區塊鏈是一個存在於互連網中的大型分散式系統,存在於每一個網路參與者(礦工)的電腦中。
換句話說,一但區塊鏈要進行版本更新或系統修改,所有網路參與都必須下載並執行新版本的區塊鏈客戶端,區塊鏈系統才能完成版本更新。
然而,分散式共識系統升級時困難的地方在於,很難要求網路參與者在同一時間完成更新,只要有參與者沒有即時更新客戶端,網路上就會存在不同版本的區塊鏈,換句話說,區塊鏈會出現分叉。
區塊鏈更新產生的共識問題
因此,區塊鏈進行更新時, 必須協調好所有的系統參與 者,否則可能會影響到區塊鏈系統的安全性。
另一個分散式共識系統升級困難的地方在於,必須讓所有網路參與者達成共識。
如果只有一部分礦工同意更新,另外一部分舊礦工不同意更新,礦工之間便會產生共識問題。
而區塊鏈更新時的共識問題大致上會有以下 四種可能 :
1)新礦工接受舊礦工挖出的區塊
2)新礦工不接受舊礦工挖出的區塊
3)舊礦工接受新礦工挖出的區塊
4)舊礦工不接受新礦工挖出的區塊
硬分叉
新礦工產生的區塊可以相容舊礦工產出的區塊,而舊礦工產生的區塊無法相容新礦工產出的區塊。
硬分叉與軟分叉-硬分叉
當系統中出現了新版本的更新,並且和前版本不能相容,舊礦工無法接受新礦工挖出的全部或部分割槽塊,區塊鏈就會出現硬分叉。
以比特幣為例 ,若更改協議的重要引數,例如區塊大小、挖礦題目的難度或出塊速度等,這些規則中的任何一個的更改都可能導致新區塊無法被前版本的共識規則接受。
例如,如果更新後,區塊容量限制從1mb增加到4mb,則執行新版本的礦工將接受4mb的區塊,但執行舊版本的礦工則會拒絕該塊。
1
社群達成共識
硬分叉與軟分叉-達成共識
在新礦工佔有大部分算力的情況下,舊礦工有兩個選擇,第一種就是接受更新並升級客戶端軟體,這個情況意味著社群對版本更新達成共識,區塊鏈可以安全且順利完成更新。
2
社群無法達成共識
硬分叉與軟分叉-無法達成共識
如果舊礦工堅持維護舊版本的系統,那區塊鏈將因此分裂為兩條鏈。(在這個情況下,新礦工與舊礦工已經無法達成共識了,即便接受更新的新礦工算力>51%,舊礦工依然不願意接受新版本,因此不適用“最長鏈共識”。)
若大部分的人都選擇更新,那新版本的算力勢必比較強,剩下的就看舊版本的算力夠不夠支援維護一條鏈的安全,倘若還是有一定數量的礦工堅持維護舊版本,那區塊鏈就會分裂成兩條鏈。
當區塊鏈分裂為兩條鏈,且在有各自的礦工維護各自的鏈的情況下,就會產生兩種不一樣的幣(大部分硬分叉,例如以太坊的君士坦丁堡硬分叉,礦工都會願意接受新版本的區塊鏈,礦工之間沒有共識問題,就不會有分裂的情況),這就是所謂的“分叉幣”。
例如比特幣社群在2017年的擴容方案理念產生分歧,無法達成共識導致硬分叉,比特幣現金 (bitcoin cash) 因此誕生。
對使用者而言,這種社群分裂的硬分叉,最有感的就是可以領分叉幣,舉個例子,分叉前你在錢包有 “1btc”,分叉後你將擁有 “1btc+1bch ”。
在沒有得到所有生態中的參與者同意的情況下,硬分叉有很大的風險,很容易導致該區塊鏈的生態系分裂、算力分裂以及陷入重放攻擊的危險中。
所以這是一種 極具爭議和危險 的區塊鏈升級技術,因此區塊鏈社群對於硬分叉非常謹慎。
軟分叉
在新礦工算力>51%時,新礦工產生的區塊不能相容舊礦工產出的區塊,舊礦工可以相容新礦工產出的區塊。
硬分叉與軟分叉-軟分叉
如果以“更嚴格的規則”進行更新,實現協議修改或新增不影響結構的功能時,則舊礦工將接受新礦工所產的區塊;
相反的,由於新礦工所認定的協議較嚴格,新礦工將會拒絕舊礦工所產的區塊,此時舊礦工在正常情況下,會選擇升級,否則其所產的區塊會無法被新礦工接受,無法獲得挖礦獎勵。
遇到例如意識形態或開發觀點不同等特殊情況時,舊礦工仍然有可能會選擇不接受新礦工產出的區塊,繼續維護舊版本的鏈,進而導致硬分叉甚至分裂。
以比特幣為例,理想的情況是,舊礦工會意識到他們的區塊被拒絕了,便會選擇升級。
隨著越來越多的礦工升級,這將進一步孤立舊版本的區塊,在利益的驅使下,會誘使更多舊礦工升級,於是,系統便能以較溫和的方式完成更新。
例如,社羣決定將塊大小從目前的1mb限制減少到0.5mb。
佔多數的新礦工會拒絕舊礦工產出的1mb區塊,並選擇其他礦工產出的符合條件的區塊。
軟分叉的更新時常發生 。
最初比特幣沒有區塊大小的限制,是在之後透過軟分叉引入1mb的限制,還透過軟分叉成功新增了pay-to-script-hash函式,該函式在不改變結構的情況下增強了程式碼。
這種型別的更新通常只需要大多數礦工進行升級,其他礦工便會隨之升級,這使得它更可行,破壞性更小。
研究員總結
軟分叉與硬分叉相比,軟分叉的過程中,在正常情況下,只會存在一條鏈,沒有分成兩條鏈的風險,且軟分叉不要求所有礦工同一時間升級,而是以較溫和的方式逐步升級,不影響軟分叉過程中的系統穩定性和有效性。
然而兩者並沒有孰優孰劣之分,而是適用性的問題,假如進行大規模的區塊鏈更新,勢必會牽涉到不被舊協議接受的規則。
即便我們都知道軟分叉比硬分叉來的安全,還是隻能選擇以硬分叉進行區塊鏈升級。
不過也不需要把硬分叉想得太過可怕,因為只要全網礦工對升級有相同的共識,就不會分叉成兩條區塊鏈,影響到安全性。
總歸一句,對區塊鏈升級而言,重要的不是硬分叉還是軟分叉,而是 礦工與礦工之間的共識是否一致 ,這部分稱之為“區塊鏈治理”。
若共識處理不好則容易導致革命,這也是為什麼區塊鏈的升級相較傳統軟體還要來的困難。