什麼是區塊鏈分叉? 什麼又是硬分叉/軟分叉?

Hard forks, soft forks, and blokchain forks ?

Crypto.Peng 比特彭
6 min readDec 2, 2018

由於區塊鏈是一種去中心化的資料結構(Data Structure),每個節點分布位置不同、以及接收到同一個區塊的時間點不同,所以常常導致每條複製的區塊鏈副本(copy)」、不一定是實時(每分每秒)都是一致的。

為了解決這個問題,每個節點都會選擇,延伸長度最長的鏈為最信任的帳本;也就是涵蓋最多工作量證明的鏈。只要通過對鏈中的每個區塊、所記錄的工作量進行加總,節點就可以計算出,在過去創建該鏈時、所花費的全部工作量為多少。

-最長的或最大累計工作的鏈(greatest cumulative work chain)

只要所有節點選擇含有最大累積工作量證明的鏈,那麼整個比特幣網路最終就會達到一個「一致」的狀態。

分叉(Fork)常常可以視為一種「暫時的非一致現象」,而這情況不會維持太久、最終會被後續愈多區塊的加入而解決,漸進到相似與勻稱。

※Hint: 區塊鏈的分叉其實是礙於「網路中傳遞資訊的延遲」所導致的;
網速傳輸延遲造成區塊不同步的影響,其實無時無刻都在發生。

區塊鏈分叉 — Blokchain Forks

舉個例子,當每個節點所持有的副本不同、依舊會繼續進行區塊的打包。

每個節點都只會以"自己手中收到區塊的順序"為排列的依據;每個節點從鄰居接收區塊時、同時會更新自己手中的區塊鏈帳本,選擇累積最大工作量的鏈。

從下圖開始,假設網路從一個統一的區塊鏈視角開始。

一開始: 一致性的區塊鏈網路

=======================================

接下來,當相異的節點、在相距的時間微乎其微下,同時算出了下一個區塊的答案,鏈的分叉就會發生了。兩個礦工節點會向周遭傳播出去自己運算成功的消息、並且散播出去。

可以預料的結果是,全網路中的節點、會收到兩個不同的子區塊(連接同樣的父區塊),這時節點們會選擇將「這兩個連接同一個父母、卻不同內容的子區塊」(可以視為攣生兄弟)保留下來。

=======================================

這時比特幣網路中的節點同時保留兩者區塊之後「繼續等待」;等待下一個區塊的誕生與廣播(也許是在白色三角、也許在橘色三角後面),便會出現最長的鏈與運算最長的鏈。

譬如下圖所示,是圖片分布中的中間節點的白色三角形、算出了第三個區塊。

整個流程簡略形容大概是:

  • 如果你將節點廣播區塊資訊出去,這一整個過程有點類似在水池裏面滴顏料進去。
  • 假如池子夠大、你在兩側滴入不同的顏色時,顏色會朝中蔓延過去。
  • 最終池子混和在一起,重疊的區域會先在池子中央出現,道理是差不多的。

小記

區塊鏈分叉是一種網路延遲所產生的問題;區塊有可能在不同時間到達不同節點。這也是為何節點們「總是選擇那些最長的鏈去繼續維護」,因為他們可以相信與確保,這會是讓遵守共識規則的人,達到一致性的方法;是種可量化的目標與共識。

就好比你跟你媽說話有代溝,她覺得你念書不夠努力、但你想要買遊戲機。達到共識的唯一方法除了隔壁鄰居讚揚你以外,便是跟你媽說你下次考試進前十名就買一部遊戲機。(前十名=可量化的共識)

Source: pixabay.com

這些短時間的分叉、收斂,重新達到一致,在比特幣網路中時常在發生,但還有另一種情形是「共識規則」的改變與分歧。

這種共識機制的改變,會導致礦工節點、或者一般節點,收到採用不同共識規則的兩個方案、並且獨立發展的更新消息。

這種更新軟體版本的分叉我們一般會分為硬分叉與軟分叉。

硬分叉

硬分叉往往發生在共識規則的更新,會導致舊有的那些”尚未更新”的節點,不能參與在新的共識機制裡面;而這些沒有更新的鏈,會被保留在單獨原先的鏈上、從此兩條鏈就分道揚鑣,互不幹預彼此的驗證與廣播區塊。

分別硬分叉的簡單方式是節點版本間、是前後不兼容的。

譬如下圖,在區塊高度4出現了我們前面提到的,”因為網路延遲”所出現的短暫自然分叉。只要等待區塊5的出現,區塊鏈達到重新收斂、情況就解決了。

而硬分叉假如是在【區塊高度6】時執行,彼此改變共識規則,可能是加密算法的改變、可能是區塊限制大小的改變….則彼此會因為執行的節點軟件版本不同、從此分割成兩條不同的主鏈。

  • 此時,A鏈上的礦工、無法處理B鏈的區塊打包
  • 彼此看對方區塊都不符合規則,所以會視為無效

軟分叉

軟分叉比較像是大家在Github提交代表時所碰到的情形,軟分叉便是共識規則的改變也能夠讓未修改的客戶端仍然按照先前的規則對待交易或者區塊,那麼就可以在不進行分叉的情況下實現共識修改

因為為了向前兼容、根據新規則創建的交易和區塊,也必須在舊規則下有效,所以共識規則往往是增加某些”約束”而已。

  • 共識規則的改變還依舊相容,有點像是搭公車票價規則的改變。
  • 舉例來說,如果明天地鐵設置一個新規則「明天無論如何,只有穿西裝的人能搭九號線」
  • 那這樣自然從明天開始、就只有符合穿西裝的人,可以搭九號線,其他人上不了。
  • 但你沒穿西裝,你還是可以繼續搭其他線的地鐵。
  • 同理,沒有更新的版本的節點只是不能參與新的共識機制,但依舊可以兼容某些情形。

最後

對於分叉的解釋,其實情形複雜得多,因為過程會考量各式的人員參與,礦工、錢包、不同功能的節點,甚至礦工手續費的變動對使用者的影響。

畢竟,手續費暴漲、或是幣價劇烈波動都會讓使用者對項目本身產生質疑。更別說難度的銳減,會讓礦工難以維持收益並且選擇放棄繼續待在這條鏈上、因為下次的難度調整依舊要2016個區塊被挖掘出來之後….難度調整與礦工利益的主題,又是個巨大的議題了。

如果對軟分叉/硬分叉不懂的話,可以看看下面幣安學院所做的影片。

What is fork ? by Binance Academy 字幕上傳: CryptoPeng

--

--

Crypto.Peng 比特彭

興趣使然的資工學生|比特幣|加密貨幣|區塊鏈 |DataAnalysis|Fintech|howard.peng.tw@gmail.com|【YouTube】 https://goo.gl/W29M88 |【FB】 https://www.facebook.com/Crypto.Peng/