關於比特幣Core軟體,很多人因擴容之爭便片面地認為其開發是中心化的,而Jameson Lopp作為BitcoinCore開發者、比特幣安全平臺BitGo首席開發工程師則想透過本文來解釋Bitcoin Core的運作方式,並澄清比特幣是沒有控制者的。
我曾透過製作這樣一份M1指數排行榜,計算出國家的貨幣供應量,包括了紙幣、硬幣等實體貨幣及活期賬戶。我發現,比特幣在其中的排名非常靠前,表現活躍甚至超過了不少國家的主權貨幣。
2018年比特幣M1貨幣供應量排名從19跌至49位,截至2018年7月,總共有600萬比特幣無法使用並且在比特幣區塊鏈上永久丟失。BTC的最大供應量不會超過1500萬枚,截至到目前,看似1700萬枚BTC在流通,實際上能使用、傳送、接收和交易的只有1100萬枚。
關於誰有能力將程式碼更改寫入Bitcoin Core的問題,時常會被提起。這些年來,各方都把此視作比特幣協議的“中心控制點”。對於外行人來說,其中的原因當然不是顯而易見的,因此本文的目的就是解釋Bitcoin Core的運作方式,以及更高層次上的,關於比特幣協議的發展方式。
Bitcoin Core的歷史:Bitcoin Core是比特幣協議開發的焦點,它並不是命令和控制點。如果它因為任何原因而消失,那麼將會有新的焦點出現,它基於的技術通訊平臺(當前為GitHub儲存庫)是源於方便的考慮,而不是定義/專案完整性的問題。事實上,我們已看到比特幣的開發曾發生過平臺轉移,甚至是名字的更改:
1、在2009年初,比特幣專案的原始碼只是一個託管在SourceForge上的.rar檔案。 早期開發人員實際上會透過電子郵件與中本聰交流程式碼補丁;
2、2009年10月30日,Sirius(Martti Malmi)在SourceForge上為比特幣專案建立了一個Subversion儲存庫;
3、2011年,比特幣專案從SourceForge遷移到GitHub;
4、2014年,比特幣專案被更名為Bitcoin Core。
注:焦點為博弈論中的概念,是指人們在缺乏溝通時傾向於使用的解決方案。
雖然這個組織存在一些GitHub“維護者”帳戶,它們能夠將程式碼合併到主分支中,但這更像是一種維護功能,而不是意味著權力地位。如果任何人都可以把程式碼合併到主分支當中,那麼很快比特幣程式碼庫就會淪為“太多廚師湧入廚房”的場景。Bitcoin Core遵循的是最小特權原則,即如果被濫用,任何賦予個人的權力都很容易被顛覆。
從對抗的角度來看,GitHub是不可去信任的。任何數量的GitHub員工都可以使用他們的管理許可權將程式碼注入比特幣儲存庫,而無需維護人員的同意。但GitHub攻擊者也不太可能破壞Bitcoin Core維護者的PGP金鑰。Bitcoin Core沒有將程式碼的完整性建立在GitHub帳戶之外,而是具有一個連續的整合系統,它執行對可信PGP金鑰的檢查,每個合併提交都必須要有簽名。雖然這些金鑰與已知身份相關聯,但仍然不能安全地認為它總是如此,金鑰可能會受到損害,除非原始金鑰所有者通知其他維護者,否則我們就不會知道。因此,提交金鑰也不能提供完美的安全性,它們只會使攻擊者更難以注入任意程式碼。
Bitcoin Core程式碼的完整性不能僅僅依賴於少數幾個密碼金鑰,這就是為什麼存在很多其他檢查的原因。這裡有很多安全層來提供深度防禦:
一、Pull請求安全性
1、任何人都可以透過在Bitcoin/Bitcoin上開啟針對主分支的Pull請求,並自由地提出程式碼更改請求。
2、開發人員稽覈Pull請求,以確保它們無害。任何人都可自由地審查Pull請求並提供反饋。在為Bitcoin Core做出貢獻時,是沒人監督或門檻的。如果一個Pull請求,它的確是有用的,並且對其沒有合理的反對意見,那麼維護者就會將其合併到Core軟體。
3、Core維護者設定此預Push,以確保他們不會將未簽名的提交推送到儲存庫中。
4、可選擇透過OpenTimestamps對合並提交安全地新增時間戳;
5、Travis CONTinuous Integration系統定期執行此指令碼以檢查Git樹(歷史)的完整性,並驗證Master分支中的所有提交是否都使用其中一個可信PGP金鑰進行簽名;
6、任何想要執行此指令碼以驗證所有合併提交PGP簽名的人,都可以追溯到2015年12月,這個過程大約需要25分鐘。
二、釋出安全性
1、Gitian確定性構建系統是由多個開發人員獨立執行的,其目標是建立相同的二進位制檔案。如果有人設法建立與其他開發人員的構建不匹配的構建,則表明引入了非確定性,因此最終版本不會發生。如果存在非確定性,開發人員會找出出錯的地方,修復它,然後構建另一個候選版本。一旦確定性構建成功,那麼開發人員就會對生成的二進位制檔案進行簽名,從而保證二進位制檔案和工具鏈不被篡改且使用了相同的源。此方法刪除了構建和分發過程中的單點故障,任何具有技術技能的人都可以執行自己的構建系統。
2、一旦Gitian構建完成,並得到了構建者簽署,一位 Bitcoin Core 的維護者將PGP簽署一個訊息,其中包含每個構建的SHA256雜湊值。如果您決定執行預先構建的二進位制檔案,則可以在下載後檢查其雜湊值,然後使用雜湊值驗證簽名版本訊息的真實性。
3、以上所有內容都是開源的,並且任何具有技能的人都可對其進行稽覈。
4、最後,即使在完成上述所有質量和完整性檢查之後,提交到Bitcoin Core並最終進入版本的程式碼也不會被任何中心化的組織部署到節點網路上。相反,每個節點操作員必須有意識地決定更新他們執行的程式碼。Bitcoin Core故意沒有設定自動更新功能,因此使用者可自行決定需要執行什麼版本的程式碼。
儘管Bitcoin Core專案實施了以上所有技術安全措施,但它們並不是完美的,理論上它們中的任何一個都可能受到損害。Bitcoin Core程式碼完整性的最後一道防線與任何其他開源專案相同,即開發者需時刻保持警惕,審查Bitcoin Core程式碼的眼睛越多,惡意或有缺陷程式碼進入釋出版客戶端的可能性就越小。
Bitcoin Core有很多測試程式碼,有一個針對每個PR(Pull Request,可簡單理解為,程式碼貢獻者向管理員發起程式碼合併請求)執行的整合測試套件,以及一個每天晚上在Master上執行的擴充套件測試套件。可以透過以下方式自行檢查測試的程式碼覆蓋率:
1、克隆Bitcoin Core GitHub儲存庫;
2、安裝從源構建所需的依賴項;
3、執行這些命令;
4、在./total_coverage/index.html檢視報告;或者,可以在此處檢視Marco Falke主持的覆蓋報告。
具有如此高的測試覆蓋率,意味著程式碼按照預期工作具有更高的確定性。當涉及到共識關鍵軟體時,測試是一件大事。而對於特別複雜的更改,開發人員有時會執行艱苦的突變測試,也就是說,他們透過故意破壞程式碼並檢視測試結果是否如預期的那樣失敗。Greg Maxwell(曾經的比特幣的核心開發人員)在討論0.15發行版時對這個過程給出了一些見解:“測試是針對軟體的測試,那測試的測試又是什麼呢?要進行測試的測試,你必須去破壞軟體。”
BitMEX寫了一篇關於比特幣實現生態系統的優秀文章。當前有十多種不同的比特幣相容實現,甚至還有更多的“競爭網路”實現。這是開源的自由,任何對Bitcoin Core專案不滿意的人,都可以自由地執行自己的軟體。他們可以從零開始,也可以選擇去分叉 Core軟體。在編寫本文時,96%的比特幣節點是執行Bitcoin Core軟體的。為什麼會是這樣?如果切換到另一個軟體實現所需的工作量最小,那麼Bitcoin Core如何在節點網路上擁有近乎壟斷的地位?畢竟,很多其他軟體提供了與Bitcoin Core相容或至少高度相似的RPC API。
96%的比特幣節點是執行Bitcoin Core軟體的,我相信這是Bitcoin Core成為發展重點的結果,它擁有數量級更多的開發人才和開發時間的支援,這意味著Bitcoin Core 專案的程式碼往往是最具效能、最安全的。在資金管理方面,節點運營商不想要執行次好的軟體。此外,考慮到這是一種共識軟體,並且比特幣協議不具有正式的規範,所以使用焦點實現會更為安全(因為假設你執行的是其他版本的軟體,對於網路的大多數節點而言,你的節點可能就是一個Bug)。從這個意義上來講,開發焦點的程式碼與現有的規範是最接近的。
不熟悉 Bitcoin Core 開發過程的人,可能會從外部檢視專案,並將Core視為一個整體實體。情況遠非如此!Core貢獻者之間經常存在著分歧,甚至最多產的貢獻者也編寫了大量從未被合併到專案中的程式碼。如果你閱讀了關於貢獻的指導方針,你可能會注意到它們相當寬鬆,這個過程最好被描述為“粗略的共識”。“維護人員將考慮補丁是否符合專案的一般原則;是否滿足包含的最低標準;以及將判斷貢獻者的一般共識。”
那Bitcoin Core的維護者是誰呢?他們是那些透過在一段時間內提供高質量貢獻,並且在專案中建立了足夠社會資本的貢獻者。當現有的維護人員組認為,某個貢獻者表現出的能力、可靠性和動機足以勝任,他們可授予該貢獻者GitHub帳戶的提交訪問權。而首席維護者的角色是負責監督專案的所有方面,並負責協調發布的人。這些年來,一共有三位首席維護者,他們分別是:
1、中本聰(Satoshi Nakamoto) 2009.1.3 – 2011.2.23
2、加文·安德烈斯(Gavin Andresen) 2011.2.23 – 2014.4.7
3、Wladimir van der Laan 2014.4.7 至今
充當Bitcoin Core維護者通常被稱為看門人,因為維護者實際上沒有權力做出違背貢獻者或使用者共識的決策。然而,由於整個生態系統的額外關注,這個角色擔負的壓力可能非常繁重。例如,Gregory Maxwell在2017年由於其個人原因放棄了他的維護者角色,這很可能是因為他在擴容爭論中經歷的公眾壓力。
Wladimir撰寫了一篇的文章,講述了作為Core維護者的壓力,以及為什麼應該刪除Gavin的提交訪問許可權,這讓很多人感到不安。類似地,當Jeff Garzik的維護者許可權也被刪除時,他和其他人對此也感到了不適,但實際上Garzik已經有兩年沒有為 Core提供貢獻了。給他的GitHub帳戶保留Core的維護權不會給專案帶來任何好處,這隻會造成安全風險,並且違反了Wladimir在他的帖子中提到的最低特權原則。
其他人可能看到Core所發生的一些事,便認為這是一個技術官僚主義組織或象牙塔,這使得新進入者很難加入。但如果你與貢獻者交談,你會發現情況並非如此。雖然在過去的幾年當中,只有十幾個人擁有提交訪問權,但有數百名開發人員為比特幣做出了貢獻。我自己也做了一些小的貢獻,當然我自認為自己不是一名“核心開發者”,但我的確是一名Core軟體開發者。沒有人能阻止你為比特幣做貢獻!
雖然Bitcoin Core 具有一些結構(它使用中心化的通訊通道來協調),但是專案本身不受任何參與者的控制(甚至是那些升級了GitHub儲存庫特權的人)。即使維護者組織的政變在技術上可能劫持GitHub儲存庫,審查持不同意見的開發人員,甚至可能爭搶“Bitcoin Core”的品牌,但其結果是Bitcoin Core將不再是開發的焦點。不同意維護人員操作的開發人員只需分叉程式碼,並將他們的工作轉移到不同的儲存庫,那麼Bitcoin Core維護者就沒有管理特權。
即使沒有“政變”,如果有爭議的更改確實以某種方式合併到Core的軟體裡,部分開發者可以進行分叉,然後移除有爭議的更改,再向使用者釋出新版本。例如,Amaury Sechet當時從Bitcoin Core上分叉出來,移除了隔離見證,建立了比特幣ABC。而相反,如果Core駁回了部分人提出的某項更改,開發者也可以分叉,然後再新增這些特性。這樣的事情已經發生過很多次:
• MikeHearn從Core上分叉,建立了Bitcoin XT
• AndrewSTOne從Core上分叉,建立了Bitcoin Unlimited
• JeffGarzik從Core上分叉,建立了BTC1
分叉程式碼很簡單,但轉移比特幣開發的焦點很難,你必須要說服開發者,讓他們把時間投入到另外一個專案上做貢獻。
也很難去說服很多不盲目遵循Bitcoin Core變化的使用者,這可能是個自我強化的信念,因為如果使用者不透過了解他們的選擇參與共識的過程,他們就把部分權力讓給開發人員了。但是2017年,在UASF(使用者啟用軟分叉)期間,使用者的權力得到了行使。有一位匿名比特幣開發者shaolinfry提出了BIP148協議,這個提案會迫使礦工啟用隔離見證。但是BIP148爭議太大,並未被Bitcoin Core採納,於是shaolinfry 從Core上分叉,建立了Bitcoin UASF。在我看來,最好的Core貢獻者是那些充分行使主權的人。我們都是中本聰。
完全將比特幣當作是一個系統來理解幾乎是不可行的。對比特幣的定義(控制)就像是對一個語言的定義。語言是自然產生的,對於詞語含義的共識也是逐漸演化,而不是字典定義的。就像字典只是描述一個語言現象而不是定義它一樣,比特幣實現也用程式碼描述比特幣的語言。沒有人被迫同意字典裡給出的釋義,同樣也沒有人透過執行比特幣而被強制同意給定比特幣實現中的程式碼。
語言並不受民主支配,比特幣也是;雖然你可能聽到人們談到礦工、節點、開發者或使用者“投票”,但是沒有機制可使任何形式的多數投票能夠強迫少數反對者接受他們不同意的變更。比特幣是沒有統治者的,但是並不是沒有規則。規則是由各個網路參與者制定和實施的。雖然改變比特幣協議本身通常是透過提交比特幣改進協議進行,但是即使這是個推薦的最佳實踐,也不會強迫所有人都遵循。這只是一個更正式的方式,透過同行審議和建立共識來引導變更。
儘管這難以解釋和理解,但這是比特幣抗脆弱性的一個重要方面,如果存在一個控制點,那麼它也將是一個的單一的失敗點,會被受比特幣威脅的強大實體所利用。最終,每個節點執行者都透過確保沒有人會破壞他們達成一致的規則,進行自主管理。這種安全模式是比特幣自下而上治理的基礎。沒有人控制著比特幣。也沒有人控制著比特幣開發上的焦點。