天天看點

區塊鍊分叉

我們在接觸區塊鍊的時候,肯定會經常聽到分叉,有時候還會聽到軟分叉,硬分叉。那麼這些概念都是什麼意思呢?分叉又是如何産生的呢?

一個區塊鍊系統,不管是比特币以太币還是瑞波币系統,他們其實都是一個軟體。那我們來看,在剛一開始的時候呢,所有的節點運作同樣版本的軟體,遵循着同樣的共識協定,維護着同樣的一條區塊鍊(blockchain)。然後呢有一天,區塊鍊軟體有了新的版本,這時,有一部分節點會選擇更新為新的軟體版本,那,新的軟體生成的區塊,能不能被舊的軟體認可呢?當然結果無非兩種,一種是舊軟體認可新區塊,一種是舊軟體不認可新區塊。這兩種情況,曆史上都發生過,我們分别來看兩個例子。

第一個例子,我們看下圖:

區塊鍊分叉

這是比特币中的記錄一筆交易的數字格式,稱作交易的資料格式,也就是說我們用這樣的一個格式,就可以明确的表示一筆交易了。

我們來看上面紅字加粗的那個字段,原來這個地方他是沒有被明确定義的,也就是沒有被使用,在中本聰剛釋出的比特币系統裡,雖然預留了這麼一個字段,但是沒有使用。後來呢,在2016年,社群想在這個字段上做點手腳,把它利用起來,利這4個位元組的空間呢,在比特币區塊鍊上創造了用于支付的智能合約功能。這其實就是比特币軟體的一次更新了。

那由于這種未明确定義的字段在舊版本的比特币完整節點上就不會被仔細驗證,是以怎麼樣呢,是以選擇更新軟體的節點按照定義過的規則生産的新區塊,仍然是可以被舊版本的節點驗證通過的。

但這顯然不是長遠之計,因為這種字段就這麼一個,你用了一次,哪以後就沒有了。

我們在來看第二個例子。同樣發生在2016年,以太坊軟體進行了一次比較大的改動,由于改動大,是以新軟體生成的區塊不能通過舊軟體的驗證。對于這種情況,最好是大家都能選擇更新新的軟體。但是實際情況是,這次改動并未獲得所有人的認可,有些人選擇不更新軟體。那最終的結局是怎麼樣呢?就是新版本和舊版本各自為政,各自生成各自的區塊鍊,這樣,本來同屬一條的區塊鍊,在尾端就分叉成了兩條,也就是我們現在看到的ETH和ETC。

上面的兩個例子,其實就分别是軟分叉和硬分叉的例子,大概或許已經能明白了,我再總結一下:

軟分叉:當系統中出現了新版本的軟體(或稱協定),而舊軟體能接受新軟體的區塊,新老雙方從始至終都工作在同一條鍊上,這稱為軟分叉。

硬分叉是指:當系統中出現了新版本的軟體(或稱協定),并且和前版本軟體不能相容,老軟體節點無法接受新軟體節點挖出的全部或部分區塊(認為不合法),導緻同時出現兩條鍊。盡管新節點算力較大,比如99%的算力為新節點,1%的老節點依然會維護着不同的一條鍊,因為新節點産生的區塊老節點實在是無法接受(盡管它知道網絡上99%的節點都接受了),這稱為硬分叉。

從上面的概念大家可以看出,其實,隻有硬分叉才會導緻區塊鍊被分叉成兩條鍊。是以剛開始的時候,分叉就是指硬分叉,後來才引入了軟分叉這個概念,區分成我們現在經常聽到的軟分叉和硬分叉。

軟分叉不要求所有節點同一時間更新,允許逐漸更新,且并不影響軟分叉過程中的系統穩定性和有效性;可以保證不想更新的人不去更新,這種不想更新的需求在現實生活中其實是很常見的。

軟分叉的更新空間有限,因為目前的比特币交易資料結構和區塊資料結構所有字段都已經詳細定義好了,你想保證向前相容,就不可能增加新的字段,否則舊節點就會拒絕你。是以軟分叉的更新空間補束縛在對現有字段的重新定義。就包括軟分叉就無法重新定義區塊資料結構裡的“區塊大小”這個字段,也就是軟分叉永遠實作不了對1M區塊的突破。而且這種極端複雜的相容性稍微出點錯,就會新舊節點不相容,即導緻硬分叉。這個事情已經發生過一次了。

硬分叉必須要求所有舊節點進行更新,否則舊節點就無法識别新節點生産的交易和區塊,導緻區塊鍊分成兩條鍊。

硬分叉的更新空間則要大很多,因為硬分叉隻要考慮能夠接受以前舊節點生産的交易和區塊就可以了,硬分叉不需要考慮舊節點是否會接受新節點生産的交易和區塊。那硬分叉就可以對交易資料結構和區塊資料結構更大膽的修改。

最後,我們會看到,交易資料結構和區塊資料結構中都有一個字段叫“版本号”,意義是“明确這筆交易或區塊參照的規則”。這意味着原本是希望使用硬分叉來修改這些規則,就是說如果我們要修改規則,那就重新定義版本号。但軟分叉在不修改“版本号”的前提下,卻修改了規則。軟硬分叉涉及到的問題是去中心的化的節點軟體、協定、版本更新的問題。是一個非常重要且值得讨論的問題。是以如果我們有機會去開發一條區塊鍊,或者選擇投資一條區塊鍊的時候,分叉問題就是我們需要提前考慮的一個重要問題。

想了解更多?關注我們就夠了。

公衆号:ipfscom

微信(Q):18191727

Q群:71789361

微信掃一掃,加入知識星球

區塊鍊分叉