硬分叉 vs 軟分叉 孰是孰非?

2015年這個漫長而炎熱的夏季,已經暴露了一些關於比特幣社區,令人驚訝的東西:很多人對於區塊鏈算法如何實際運行的技術原理,其實是陌生的。

最終,bitcoin.org及各個論壇的管理者邁克爾·馬夸特(Michael Marquardt),禁止了所有關於Bitcoin XT的討論,並威脅說要從官方比特幣網站上刪除使用Bitcoin XT的服務。他的理由是,Bitcoin XT是一個山寨幣,因爲它觸發了一個硬分叉。而另一方面,他認爲“軟分叉”(soft forks)卻是完全可以接受的。

這一立場,從技術角度上來說,是根本站不住腳的,在這篇文章中,我將解釋下原因。

 

軟分叉和硬分叉

 

你在比特幣論壇上可能並不會看到這兩個詞,在我隨機地與比特幣愛好者們的聊天當中,發現很多人都將這個術語拋在了腦後。我一次又一次地遇到過不明白這些單詞意思的人,但我覺得他們應該是要明白的。

這並不奇怪,“軟分叉”的概念是相對比較新出現的,並且似乎已經涌現在IRC的交流討論當中,而不是BIP或者其他類型的標準文件。奇怪的是,甚至連開發者們也會錯誤地定義這個術語。

硬分叉,是當比特幣協議規則發生改變,舊節點拒絕接受由新節點創造的區塊的情況。違反規則的區塊將被忽視,礦工會按照他們的規則集,在他們最後見證的區塊之後創建區塊。

軟分叉,是當比特幣協議規則發生改變,舊的節點並不會意識到規則是不同的,它們將遵循改變後的規則集,繼續接受由新節點創造的區塊。礦工們可能會在他們完全沒有理解,或者驗證過的區塊上進行工作。

這通常被一些比特幣核心開發人員描述爲“向後兼容”,但這其實並不正確,並可能會讓別人產生困惑。向後兼容的定義是,新的軟件接受由舊軟件所產生的數據或者代碼,比如說Windows 10可以運行Windows XP的應用,這是向後兼容。兩個分叉類型需要向後兼容,否則新節點就無法從頭驗證區塊鏈。

正確的說法實際上應該是向前兼容:指舊的軟件繼續接受由新軟件所產生的數據以及代碼。當你保存了一份Word 2013文檔時,你仍然可以用Word 2011來打開它,這就是向前兼容。

值得一提的是,中本聰本人並沒有使用過“硬分叉”這個短語,想必此前他還未曾遇到過分叉的情況,軟分叉的概念還沒有繞過來麼,這就對了,因爲這個概念本身就有很大的缺陷:在一個正常的比特幣網絡中,軟分叉永遠都不應該發生。

這可能看起來像一個大膽的主張,讓我們更進一步地分析下它。

 

爲何說軟分叉是糟糕的?

 

可能會出現舊軟件繼續處理數據,而無需進行升級的情況 :爲什麼你會不想要呢?現實情況是,軟件工程師們都是喜歡向前和向後兼容的,如果你的新應用程序和舊版本的可以互相操作,通常都會是雙贏的。

向前兼容比向後兼容更爲罕見,原因是,如果你爲自己的文件或者協議添加了一些新的功能,舊版本的軟件就無法理解它。有時候,你可以讓新的功能是可選的:意思是指舊軟件忽視掉新功能是OK的,這就是所謂的功能退化,這是一個流行的技術,特別是當網站使用了新功能後,而有些用戶又想使用舊瀏覽器進行訪問時。

向前以及向後兼容在軟件工程當中,已經是非常普遍地應用了,那比特幣有什麼不同麼?原因很簡單:

向前兼容,會使運行一個節點的全部目標失效。

原因很容易就能解釋,XT/Core 兩個版本的下載,以及處理每一個區塊,都要從創世塊開始,做這個過程的目的是爲了對比特幣區塊鏈進行審計。每添加一個數字,它們都會檢查每一個簽名。當審計完成的時候,你可以確保你使用的總賬將規則應用寫入到這個軟件當中。

這是比特幣去中心化的關鍵部分:使用你自己的總賬副本,通過你的計算機進行計算,然後根據這個總賬,僅接受有效的比特幣支付,是你在增強比特幣的關鍵經濟政策。

情況很簡單:沒有人,甚至是擁有多數算力的礦工,可以哄騙你去接受違反這些規則的錢。

或者說……他們可以麼?

下面就是軟分叉的問題所在了。

在軟分叉中,協議的改變是經過精心編制過的,本質上是在誘騙舊節點去相信一些東西是有效的,但它實際上可能並非如此。

這裏有一個類比,試想一下一家擁有審計師團隊以及交易團隊的大公司。交易員們希望做一個新型的交易,但公司目前是不允許的:審計人員會執行公司的政策,檢查交易員們在做些什麼。而更改策略可能會是一項很慢的工作。突然有一天,一個交易員靈機一動,“嘿,夥計們,”他說,“我有一個想法,我要提交一些衍生品交易,我打算把它寫在紙上,當你看到它時,它看上去就好像是一筆正常的交易,但其實它不是,審計員們是不會發現的!”

這裏的審計員們,正是運行比特幣全節點的人以及服務,而交易員就是那些想要改變規則的人,無論這種規則變化是一個好主意與否,其實在這裏都不相關:重要的是,它們是如何進行的,審計人員正在交叉檢查每一筆交易,但是他們的計算可能會得出錯誤的答案,因爲他們不明白他們所覈查的交易的真實性質。

在技術上是如何進行這項工作的? 我們可以看看一個稱之爲P2SH的比特幣模式,P2SH是一個非常有用的模式,它可以讓多重簽名更易使用,但是在區塊鏈上會看起來很奇怪:

https://blockchain.info/tx/f837ca5c1a15fa6c2e5c7380386bacba10e936fe8625e12d9fa6c177a8f605c1

 OP_HASH160 6af7caf9b09224af8a171318f69d254c1756e54e OP_EQUAL 

這是一個比特幣腳本,英文的意思是:“anyone who knows the password can spend this money” ,翻譯過來就是“任何人知道這個密碼,都可以花走這筆錢。”

它的問題就在於它的不安全:因爲沒有簽名,所以當你廣播了一筆,提供給任何人“密碼”的交易,其他人也是可以進行一筆輸出交易的,因爲密碼現在是公開的嘛,所以最後就存粹地變成了一場競賽,看誰的交易第一個傳遞給礦工。

P2SH之所以可行,是因爲比特幣協議進行了修改,包含了一條新規則:當你看到上述形式的輸出腳本,實際上不要將它當作一個腳本看待,而是一直特殊的處理方式:密碼實際上纔是“真實”運行的腳本。所以說P2SH其實是安全的,不要擔心。但是爲什麼要使用這種迂迴而奇怪的方式呢?

你猜對了,軟分叉就是問題所在。這種結構的設計,總是被認爲是,不瞭解P2SH規則的舊節點會認爲交易是有效的。如果出現一筆交易,所花的幣是在舊版本比特幣規則下,但並不滿足新的 P2SH規則的話,審查員們就無法正確地對此進行覈查,並會計算出一個不正確的總賬。

但是,防止這種情況的發生,就是你起初要去運行一個全節點的全部理由!哎喲!

 

硬分叉到底會發生些什麼?

 

讓我們想象一下 P2SH以不同的方式進行引入:通過硬分叉,那麼腳本就會是這個樣子的:

OP_HASH160 6af7caf9b09224af8a171318f69d2... OP_EQUAL OP_RUN

注意最後的OP_RUN:這是一個並不存在當前比特幣指令集的操作碼。正確地定義下,腳本會是這個樣子的:

OP_HASH160 6af7caf9b09224af8a171318f69d2... OP_EQUAL OP_???

當他們到達OP _ ???位時,他們會停止並拒絕交易以及區塊,因爲他們會意識到,他們不知道這筆交易意味着什麼。

我應該指出一點,當前實際有一個P2SH的相對提案,其名爲OP_EVAL,關於它的討論,是非常激動人心的,我不記得那場辯論的細節,也不想在這裏進行重複,這也只是一個例證而已。

好了,所以你的節點已經拒絕了一個區塊,因爲它看不懂。怎麼辦呢?在我們想象的公司中,審計員會召喚CEO(也就是你),來作出一個決定,你就是決策者。而在比特幣的情況下:你會因爲某種方式被驚動,比如說短信或者電子郵件,然後你要做出決定該怎麼做。你可以…

  1. 閱讀有關的規則變動,然後你覺得是OK的,升級然後繼續。
  2. 閱讀有關的規則變動,然後你覺得不行,需要更多的考慮。
  3. 明確表示要去信任任何你無法理解的腳本輸出,如果你覺得自己節點的正常運行時間,要比正確的審計結果更重要時,那你可能會去這樣做。

最後的選擇是有風險的,但是你會發現,軟分叉發生了! 所不同的是,你是明確要求的它,你的選擇不會影響其他人。只有你在冒險進行一個不正確的分類帳。 Bitcoin Core和Bitcoin XT 今天並不支持第三個選項,但是如果任何人想要,給它增加一個開關來讓它啓動是一件很容易的事情。

我的觀點?瞭解就是力量。當你知道 規則已經改變時,你可以使用這些信息來採取更好的決策。而軟分叉,你將不會知道規則已經改變,這就好像是在盲目地飛行。

 

選擇

 

最近,bitcoin.org採取了一項新的政策,它說:

爭議硬分叉對比特幣是一件壞事。最好的情況下,一個有爭議的硬分叉會讓選擇失敗方鏈的人,感到選擇權被剝奪。而最糟糕的情況是,它將使得比特幣永遠失去它的價值。

這是一個非常奇怪的說法,因爲這就意味着改造比特幣,而無需引起所謂的“選擇權被剝奪”是可能的。

任何比特幣的改變,都是由大多數人接受了規則的改變,正是這些人“剝奪”了那些不想要進行改變的人的權力。硬分叉也好,軟分叉也罷,無論哪種技術被使用,如果交易使用了新的規則,那麼就會進入廣泛的傳播,那麼遲早你會收到支付的幣,並追溯到一個新規則的交易。然後你就有兩種選擇,你可以驗證新規則,或者不進行驗證。而不進行驗證的問題就是降低了自己的安全性:這就好比是將你臉上的鼻子切了下來。因此,在實踐中,所有人總是會選擇升級。多數人不同意軟分叉,和多數人不同意硬分叉並沒有什麼不同,如果你不喜歡新的規則……那就堅定地選擇就是了。

我們可以看到 P2SH本身就證明了這一點,這個競爭提案得到過一些礦工和開發人員的支持,但最終大家卻接受了我們當前的這個版本。他們在這個問題上,沒有選擇,或者說,他們選擇接受了改變,並繼續使用比特幣,而一個軟分叉也沒有什麼區別。

因此,關於硬分叉 vs 軟分叉的問題,說成是對個人權利的偉大斗爭,在技術上是說不通的。它們之間是完全不相干的。

 

分叉對於礦工和商人意味着什麼?

 

這篇文章有點長,所以下面我會盡量簡單地進行描述。如果你是礦工或者商人,你應該會更喜歡硬分叉的更改方式,原因如下。

商人: 對於支付給你的錢,你的想法是這筆交易是儘可能多地被驗證,並且你想要的是更快的驗證。這就意味着,你的節點需要運行主要的規則集,如果你被甩在了後面,你是可以被欺騙的。如果你所在的鏈並不是主數,你需要儘快地知道,然後你要忽略掉你無法覈實的交易。

請注意,在我提出關於比特幣核心開發者們的一些問題之後,他們調整了代碼,使得一些軟分叉實際上更接近於硬分叉:Core會忽略掉那些似乎使用未知操作碼的交易(也就是我們想要的!)…直到它們出現在區塊當中。因此,這個調整是否有助於你,在很大程度上取決於時機。

礦工:如果你是一名礦工,並落後於多數人選擇的規則,你將因爲自己所使用的分叉鏈而失去經濟回報。然而,硬分叉還是較好的。首先,它是可檢測的,因此一個正確配置的節點,通過電子郵件/短信/電話的方式,可以讓你知道自己的節點已經過時了。它也可以自動地關閉挖礦作業,那麼你就不會浪費資源去挖取無效塊。其次,如果你認爲對方鏈是錯的,然後你認爲他們會同意你的觀點,你可以繼續嘗試挖取弱鏈碰碰運氣。然後在某個時候,每個人又回到了你的這條鏈,那麼你就會得到所有其他礦工所沒有的,可愛的coinbase。當然,這種策略是非常危險的,我是不會推薦的。但在技術上來說,是存在可能性的。

軟分叉情況下,你會挖取你認爲是有效的塊,但實際上是其他礦工所忽略的塊。然後,當他們孤立你的塊時,你會認爲這只是普通的運氣不好罷了,並嘗試建立另一個無效塊……然後將再次獲得孤塊。如果你只是一個不常產生塊的小礦工,你要弄清楚這件事情,可能需要花費你相當長的時間。然而你的口袋,還只是一個洞而已。

 

硬分叉會毀了比特幣?

 

不是的,如果說有這種情況的話,那麼從字面上來說,任何人都可以通過不同的規則來挖一個或者兩個區塊,來殺死比特幣。區塊鏈算法的根本目的是確保它不會發生任何破壞性的事情。

認爲“有爭議”的硬分叉會導致比特幣永久性地失去價值,這個想法出自 bitcoin.org的政策。要求任何比特幣的更改都需要100%(或者99%)的人同意,或者說至少有一個比特幣核心開發者的認同,這就意味着,任何人都可以保持整個社區不變,他們都可通過拒絕同意進行贖回,除非他們得到他們自己想要的東西,沒有哪一種基礎設施是這樣乾的。如果比特幣就是這樣子,那它永遠都不可能發展,最終將變得一文不值。

----

原文:https://medium.com/@octskyward/on-consensus-and-forks-c6a050c792e7

發佈了212 篇原創文章 · 獲贊 32 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章