什么是分叉區(qū)塊鏈又該如何分叉
區(qū)塊鏈為何及如何分裂?
分叉(fork),或是分叉的威脅,似乎是加密貨幣領(lǐng)域的公認(rèn)特征。但分叉是什么?為什么分叉會(huì)有這么大的影響?硬分叉與軟分叉的差異在哪?
“分叉”從編程術(shù)語(yǔ)來(lái)講,是一個(gè)開(kāi)源代碼的修改。通常,分叉代碼與原始代碼類似,但經(jīng)過(guò)重要的修改,兩個(gè)“叉”(prongs)和平共存。有時(shí),分叉被用來(lái)測(cè)試過(guò)程,但在加密貨幣里,它通常被用來(lái)實(shí)行基本面的更改,或使用與原有資產(chǎn)相似的(但不相等的)特征來(lái)創(chuàng)造新資產(chǎn)。
并非所有分叉的發(fā)生都是刻意的。使用廣泛分散的開(kāi)源代碼庫(kù)(open-source codebase),一旦當(dāng)不是所有節(jié)點(diǎn)都能復(fù)制相同信息時(shí),分叉有可能意外地產(chǎn)生。然而,通常這些分叉都能被識(shí)別并解決,主要的加密貨幣分叉都源于對(duì)植入哪些特性所產(chǎn)生的意見(jiàn)分歧。
記住一點(diǎn),這些分叉有著“共享的歷史”。每個(gè)鏈(舊的或新的)上在分叉之前的交易記錄都是完全相同的。
硬分叉
編程分叉主要有兩種類型:硬分叉與軟分叉。
硬分叉是對(duì)舊版本的無(wú)效協(xié)議進(jìn)行更改。假如舊版本持續(xù)運(yùn)行,它們最終將使用與新版本不同的協(xié)議與數(shù)據(jù)。這會(huì)導(dǎo)致嚴(yán)重的混淆與可能的錯(cuò)誤。
在比特幣里,需要硬分叉來(lái)更改像是區(qū)塊大小、解決加密難題的難度、新增額外信息之限制等定義參數(shù)。任何對(duì)這些規(guī)則的更改,都可能造成區(qū)塊被新協(xié)議接受但被舊版本拒絕,并可能導(dǎo)致嚴(yán)重問(wèn)題──甚至有可能造成資金的損失。
舉例來(lái)說(shuō),假如區(qū)塊的大小限制由 1 MB 增加到 4 MB,一個(gè) 2 MB 大小的區(qū)塊將能被運(yùn)行新版本的節(jié)點(diǎn)所接受,但會(huì)被運(yùn)行舊版本的節(jié)點(diǎn)所拒絕。
也就是說(shuō),2 MB 大小的區(qū)塊通過(guò)某一更新后節(jié)點(diǎn)的驗(yàn)證并新增到區(qū)塊鏈中。假若下一個(gè)區(qū)塊是需要被運(yùn)行舊版協(xié)議的節(jié)點(diǎn)所驗(yàn)證的呢?該節(jié)點(diǎn)會(huì)試圖新增這個(gè)區(qū)塊,但它會(huì)偵測(cè)到最新的這個(gè)區(qū)塊并沒(méi)有通過(guò)驗(yàn)證。因此,它將忽視該區(qū)塊,并將新驗(yàn)證結(jié)果附加到前面一區(qū)塊。突然間,你有了兩個(gè)區(qū)塊鏈,其中一條同時(shí)含有舊與新版本協(xié)議的區(qū)塊,另一條僅包含舊版本協(xié)議的區(qū)塊。哪條鏈的增長(zhǎng)較快取決于哪些節(jié)點(diǎn)可以獲得下一區(qū)塊的驗(yàn)證,并且最終可能還會(huì)有額外的分裂。兩條(或更多的)鏈?zhǔn)强梢詿o(wú)限平行增長(zhǎng)的。
這是一個(gè)硬分叉,它可能是混亂的,也可能充滿著風(fēng)險(xiǎn),因?yàn)樵谛聟^(qū)塊中花費(fèi)的比特幣可能會(huì)再次花費(fèi)在舊區(qū)塊里(因?yàn)檫\(yùn)行舊版本協(xié)議的商戶、錢(qián)包與用戶無(wú)法偵測(cè)到無(wú)效的新代碼支出)。
唯一的解決方法是放棄其中一個(gè)分支轉(zhuǎn)而支持某一分支,這涉及一些礦工的損失(交易本身是不會(huì)丟失的,它們只會(huì)被重新分配)?;蛘?,所有節(jié)點(diǎn)都需要在同時(shí)切換到較新的版本,而這在分散的、廣泛傳播的系統(tǒng)內(nèi)是不容易達(dá)到的。
或者,比特幣會(huì)分裂,這已經(jīng)發(fā)生了。(哈啰,比特幣現(xiàn)金)
軟分叉
軟分叉仍然可以與舊版本一同運(yùn)行。
舉例來(lái)說(shuō),假如以限縮規(guī)則的方法更改協(xié)議,實(shí)現(xiàn)表層修改或添加不影響結(jié)構(gòu)的功能,則舊版本的區(qū)塊將能接受新版本區(qū)塊。但反過(guò)來(lái)則行不通:新的、較為嚴(yán)格的版本將拒絕舊版本的區(qū)塊。
在區(qū)塊鏈中,理想狀態(tài)下,礦工發(fā)現(xiàn)它們的區(qū)塊被拒絕,就會(huì)自行升級(jí)。隨著越來(lái)越多礦工完成升級(jí)動(dòng)作后,擁有主要新區(qū)塊協(xié)議的鏈會(huì)變得越來(lái)越長(zhǎng),會(huì)更加孤立舊版本的區(qū)塊,這又能讓更多礦工進(jìn)行升級(jí)動(dòng)作,并且系統(tǒng)會(huì)自動(dòng)糾正。由于舊的和更新后的節(jié)點(diǎn)都接受新區(qū)塊,因此新版本的區(qū)塊協(xié)議最終將獲勝。
舉例來(lái)說(shuō),當(dāng)社區(qū)決定將區(qū)塊大小從現(xiàn)有的 1 MB 限制縮限到 0.5 MB。運(yùn)行新版本區(qū)塊協(xié)議的節(jié)點(diǎn)將拒絕 1 MB 大小的區(qū)塊,并且會(huì)建構(gòu)在前一個(gè)區(qū)塊上(如果它是使用新版本的代碼進(jìn)行挖礦),可能會(huì)導(dǎo)致暫時(shí)的分叉。
這是一個(gè)軟分叉,并且已經(jīng)發(fā)生過(guò)好多次。最初,比特幣并沒(méi)有區(qū)塊小的限制,是通過(guò)軟分叉將 1 MB 的大小限制引入的,因?yàn)樾乱?guī)則比舊規(guī)則更為“嚴(yán)格”。而可以在不改變結(jié)構(gòu)的情況下強(qiáng)化代碼的 pay - to - script - hash 功能,也是通過(guò)軟分叉成功增加的。這類型的修正通常僅需要大部分的礦工進(jìn)行升級(jí),便可以讓該分叉變得更可行,也降低了破壞性。
軟分叉并不會(huì)帶來(lái)困擾硬分叉的雙花風(fēng)險(xiǎn)(double-spend risk),因?yàn)檫\(yùn)行舊節(jié)點(diǎn)的商家與用戶將能同時(shí)讀取新舊版本的區(qū)塊協(xié)議。