軟分叉,硬分叉,默認性和強制性
作者:Vitalik Buterin
原标题:《Hard Forks, Soft Forks, Defaults and Coercion》
發表時間:2017 年 3 月 14 日
在區塊鏈的相關話題討論中,有一個非常重要的討論是關於:在協議升級機制中,是首選軟分叉好還是硬分叉好。軟分叉和硬分叉的一個基本區別在於,軟分叉通過嚴格地減少有效的交易數目來改變協議的規則,所以遵循舊協議規則的節點們依然可以保留在新的鏈條上(假定大多數的礦工們/驗證器來實現分叉),而硬分叉則是說允許先前無效的交易和區塊使它們變得有效,所以用戶們必須升級他們的客戶端,這樣他們才可以留在硬分叉後的新鏈條上。在硬分叉中,有兩種子類型的硬分叉:1. 完全擴展硬分叉(strictly expanding hard forks),其完全地拓展有效的交易集,並且因此舊規則能夠有效地兼容新規則,2. 雙向硬分叉(bilateral hard forks),並且其中的兩個規則集均不兼容。
這裡用一張維恩圖來說明分叉的類型:
通常引用的兩個優點如下所示:
- 硬分叉會使得開發人員在進行協議升級時會更具有靈活性,因為他們不需要額外考慮這個新的規則是否適合舊的規則。
- 軟分叉對用戶而言更加方便,因為用戶們不需要額外的升級就可以繼續保持在新的鏈條上。
- 軟分叉不太可能會導致鏈條分裂。
- 軟分叉在真正意義上來說,只需要得到礦工們/驗證器們的同意(即使用戶使用的是舊的規則,如果節點使這個鏈條使用新的規則,那麼只有在新規則下有效的事務才可以進入到鏈條當中,在任何情況下都是這樣)。而硬分叉則需要用戶選擇同意。
除此之外,硬分叉的主要批評點在於,硬分叉都是"強制性"的。這裡所指的強制性不是指得物理的力量,相反,她是網絡效應的一種強制性。也就是說,如果網絡將規則從A改到了B,那麼即便你個人更偏向於A,如果大多數用戶都喜歡B並且切換成了B,那麼即便你個人不喜歡B,也不贊同切換成B,但是為了能夠和其他人同步留在同一個網絡上,你也必須切換成B。
硬分叉的支持者們通常被嘲笑為:試圖對網絡產生"惡意接管"的影響,並且"強迫"用戶們與他們一起並行。此外,鏈條分裂的風險通常在於硬分叉是不安全的。
我個人的觀點是,這些批評指正是錯誤的。並且在許多情境下,這些情況往往是背道而馳的。這個觀點並不是特定針對以太坊,或者是比特幣,或者是其他的區塊鏈;它源於這些系統的一般特性,並且適用於它們中的任何一個。此外,下面的論點只適用於有争议的改變,其中至少有一個選區(礦工們/驗證器和用戶)有大部分不贊成;如果改變這件事情不是非常有爭議性的话,那麼它可以非常安全地完成,不管這個分叉的形式是怎麼樣。
首先,讓我們討論強制性的问题。無論是軟分叉還是硬分叉,都多多少少改變了協議的方式,使得部分用戶不喜歡。尤其是當這個協議得不到100%支持的時候,改變這個協議會讓一部分的用戶不喜歡。此外,幾乎不可避免的是,在任何情況下,異議者們更加重視與大部分人群保持同步的網絡效應,這超過了他們對於協議上自己的偏好。因此,在網絡效應這個意義上來說,兩種分叉都是強制性的。
然而,軟分叉和硬分叉之間存在著本質性的區別:硬分叉是選擇性加入,而軟分叉則讓用戶無路可選。為了方便一個用戶來加入一個硬分叉的鏈條,他們必須親自安裝軟件包來實現分叉規則,並且不同意規則改變的用戶群體們的反應,比他們重視的網絡效應還要強烈,理論上他們可以停留在舊的鏈條上-而且,實際上,這樣的事情已經發生了。
這在完全擴展硬分叉和雙向硬分叉的情況下都是適用的。然而,在軟分叉的情況下,如果分叉成功,那麼沒有分叉的鏈條就不存在了。因此,軟分叉顯然在體制上更偏向於強制而非分離,而硬分叉則有相反的傾向。我個人的道德觀念使得我更支持分離而不是強制,雖然其他人可能不這麼認為(最常見的論據是,網絡效應真的是非常非常的重要,對於"一幣規則",它是必不可少,雖然更溫和的版本也存在)。
如果我不得不猜測原因的話,儘管我剛剛說了這些依據,軟分叉與硬分叉相比,依舊被列為"更少強制性"的選擇,我會認為說,可能硬分叉給用戶的感覺是,硬分叉"強制"用戶們安裝軟件更新,而在軟分叉的情況下,用戶們什麼都可以不用幹。然而,我不得不說,這種直覺是錯誤的。重要的並不是個體用戶是否必須執行簡單的官僚步驟點擊"下載"按鈕,而在於用戶們是否被強制要求接受一個協議的變化,即使他們根本是不想接受的。並且通過這個指標,如上所示,這兩種類型的分叉最終都是強制性的,並且硬分叉在給予用戶自由的這一方便還是稍微比軟分叉要好的。
現在,讓我們來看看極具爭議的分叉,特別是那些礦工們/驗證器喜好和用戶喜好相衝突的分叉。這裡有三種情況:(i)雙向硬分叉(ii)完全擴展硬分叉, (iii)所謂的"用戶激活軟叉"(UASF),第四類是礦工在沒有用戶同意的情況下激活軟分叉。晚一點我們會在後文提到它。
首先,我來講講雙向硬分叉。在最為理想的情況下,這個情景就非常簡單了。兩個幣在市場上進行交易,交易者決定兩個幣的相對價值。從ETH/ETC的案例中,我們有著絕大多數的證據表明,礦工們絕大多數都喜歡根據價格的比率來分配他們的算力給到幣,以最大化他們的利潤和收益,而不會考慮他們的歷史形態觀點來決定他們的算力分配問題。
即使一些礦工將意識形態偏好傾向於一方或另一方,那麼極有可能會有足夠的礦工願意在價格比率和哈希算力之間的不匹配來套利,並且使價格比率和哈希算力形成一致。如果一系列礦工想要聯合起來在這個鏈條上不進行挖礦,那麼這個激勵就會存在過度缺陷的問題。
這裡有兩個邊緣位置的情況。第一個可能性是:由於低效的難度調整算法,挖礦的價值下降因為幣的價值下降,但是挖礦的難度卻並不會因此下降。這就會使得挖礦非常的不賺錢也不划算。沒有一個礦工會在虧算不盈利的情況下繼續推動鏈條往前走,直到它的困難恢復平衡。這不是以太坊的情況,但這及其可能是比特幣的情況。因此,少數算力鏈很可能永遠不會離開地面,因而它會死亡。請注意,這是不是一件好事,答案取決於你對強制和分裂的看法。從我上面寫的個人觀點來看,我認為這樣的少數算力鏈敵對難度調整算法不是一件好事。
第二種邊緣情況是,如果差異非常巨大,大算力的鏈條可以對小算力的鏈條發動51%的攻擊。但即使是ETH/ETC分流比例在10:1,這種攻擊情況也沒有發生。所以這肯定不是一個確定的答案。然而,如果礦工在主導的鏈條上更喜歡強制性並且允許偏離分裂,那麼這些礦工們總會有辦法達到的。
接下來,我們來看看完全擴展硬分叉(SEHF)。 在SEHF中,存在非分叉鏈條在分叉規則下有效的屬性,因此如果分叉鏈具有比非分叉鏈更低的價格,那麼分叉鏈的算力值會比非分叉鏈的算力值要更低,正因如此,非分叉鏈條最終會被原始客戶端和分叉客戶端所接受成為最長鏈。那麼漸漸的,分叉鏈會被"淹沒"。
有一個論點是這樣認為的,這樣的分叉成功是有強烈的故有偏見的,因為分叉鏈會被淹沒被拋在價格中,使得幣的價格更低,這使得分叉鏈被淹沒的可能性更大。這個論點對我來說還是非常有道理的,所以這是一個很好的理由來進行雙向硬分叉而不是一味地擴展。
比特幣非常多的開發者們建議,在硬分叉發生後來手動進行雙向硬分叉來解決這個問題。但是更好的選擇是,使用內置的雙向硬分叉。例如,在比特幣的情況下來舉例,你可以添加一些規則來禁止一些未使用的操作碼,然後在沒有分叉的鏈上進行包含了這個操作碼的交易,所以在分叉的規則下,沒有分叉的鏈在這個時候起,會永遠的無效。在以太坊的案例中,關於計算狀態如何工作的各種細節來看,幾乎所有雙向硬分叉都是自動的。根據不同基礎架構,其他鏈條也會有不同的屬性。
上面提到的最後一種類型的分叉是用戶激活軟分叉。在UASF中,用戶可直接激活軟分叉規則,而無需考慮是不是得到礦工們的共識;礦工們可能會被排擠在經濟利益之外。如果有非常多的用戶不跟隨這個UASF,那麼這個幣就會被分割開,這將導致一個與完全擴展硬分叉情景相同的情況。 即使UASF是選擇性的,它也使用了經濟的不對稱性來使自己更偏向於成功(雖然這種偏向並不是絕對的,如果這個UASF被認為是不受歡迎的,那麼它也不會成功,這樣做只會導致區塊鏈分裂)。
然而,用戶激活軟分叉是一個危險的遊戲。例如,我們來假設一個項目的開發人員想要創建一個UASF補丁,該補丁將以前接受所有交易的未使用操作碼轉換為只接受符合一些新功能的規則的交易操作碼,這無論在政治上還是技術上都會有所爭議,礦工都不太會會喜歡這個功能。礦工們有一個聰明又狡猾的方式來對抗這種情況:他們可以單方面地實施一個礦工激活軟分叉(miner-activated soft fork),能夠讓使用了軟分叉創建的功能總是會失敗。
現在,我們有三種規則:
- 操作碼X始終有效的原始規則。
- 操作碼X只有在其他交易符合新規則時才有效。
- 操作碼X始終無效的規則。
請注意,第2點是關於第1點的軟分叉,第3點是關於第2點的軟分叉。現在,第3點上有強烈的經濟壓力,因此軟分叉並不能實現它的目標。
因此,我的結論是這樣的:軟分叉是一個危險的遊戲,尤其是在它們是有爭議的情況下,礦工們開始進行反擊,這個遊戲將會越來越危險。完全擴展硬分叉也是一個危險的遊戲。礦工激活軟分叉是強制性的,用戶激活軟分叉就沒有那麼的強制性了,但是由於經濟上的壓力的形成,用戶自己選擇激活軟分叉多多少少還是有強制性在裡面,這也具有一定的危險性。如果你真的想進行一個具有爭議性的改變,並且堅持認為自己這樣做付出的社會代價是值得的,那麼你就做一個乾淨純粹的雙向硬分叉吧,花些時間添加一些重放攻擊保護,然後讓市場這個無形的手幫助你理清楚。