作者:Kalle Rosenbaum & Linnéa Rosenbaum

比特幣是是用開源軟件打造出來的。在本章中,我們會分析這一事實的含義、如何維護開源軟件,以及比特幣生態中的開源軟件如何允許免許可的開發。在 “挑選密碼學” 這一節,我們要簡單聊聊在密碼學系統中如何挑選和使用上游代碼庫。本章還有一個小節關注比特幣開發中的代碼審核流程,然後是比特幣開發者獲得資金支持的方式。最後一節討論的是比特幣的開源文化,這種文化在外人眼裡可能非常怪異,但是,這種看似怪異的現象,正是健康的標誌。
絕大部分比特幣軟件,尤其是 Bitcoin Core,是開放源代碼的。這意味著,軟件的源代碼是公開給所有人審核、修補、修改和重新分發的。在 https://opensource.org/osd 網站上,“開源” 的定義包括了下列重點(但不限於此):
自由分發
使用許可不應限制任何一方將該軟件放在一整套包含了不同來源的程序的軟件發行版本中銷售或贈與。使用許可不應要求對這樣的銷售徵收版稅或其它費用。
源代碼
該程序必須包含源代碼,並且必須允許分發源代碼以及編譯好的形式。當一項產品的某些形式不與源代碼一起分發時,必須有一種公開出版的形式,能讓用戶以合理的複製成本獲得源代碼,最好是通過免費的互聯網下載。源代碼必須是程序員修改程序時候的首選形式。故意模糊源代碼是不允許的。(源代碼採用)中間形式,比如一個預處理器或者翻譯器的輸出,也是不允許的。
衍生作品
使用許可必須允許修改和衍生作品,而且必須允許它們在原軟件的使用許可相同的條款下分發。
—— “開源” 的定義,開源運動網站
Bitcoin Core 遵循這一定義,在 MIT 許可下分發:
The MIT License (MIT)Copyright (c) 2009-2022 The Bitcoin Core developersCopyright (c) 2009-2022 Bitcoin DevelopersPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.MIT 許可(MIT)版權(c)2009-2022 Bitcoin Core 開發者版權(c)2009-2022 Bitcoin 開發者在此將許可免費地授予任何獲得了本軟件和相關說明書文件(即 “本軟件”)的人,可以不受限制地處理本軟件,包括不受限制地使用、複製、修改、合併、出版、分發、轉許可、以及/或者 銷售本軟件之拷貝的權利;並且得到本軟件服務的人也得到同樣的許可;上述許可僅受制於下列條件:上述版權聲明和本許可聲明必須包含在本軟件的所有拷貝和主要部分中。(譯者注:版權聲明中的 “Bitcoin Core” 和 “Bitcoin” 都指軟件。)
如本書章節 2.1(中文譯本)所指出的,用戶能夠驗證比特幣軟件 “工作情況與聲明一致”,是非常重要的。為此,用戶必須能夠不受限制地獲得(他們想要驗證的)軟件的源代碼。
在後續章節中,我們會深入瞭解比特幣中的開源軟件的一些有趣的方面。
7.1 軟件維護
Bitcoin Core 的源代碼是在託管於 GitHub 網站上的一個 Git 代碼庫中維護的。任何人都可以克隆這個代碼庫,無需請求任何人許可;然後,就可以在自己的設備上檢查、編譯和改動。這意味著,這個代碼庫可能有幾千個拷貝,分散在全球。它們全都是同一個代碼庫的副本,那麼,是什麼讓這個源頭的 Bitcoin Core 代碼庫如此特別呢?技術上來說,它根本沒有什麼特別的;但從社會關係上來說,它已經成了比特幣開發的焦點。
(譯者注:“Git 庫” 的意思是,它是一個使用一種分佈式協作軟件 “Git” 來管理的代碼庫。分佈式協作意味著人們會各自複製代碼庫並獨立修改,然後謀求代碼合併;在這個過程中,Git 可以幫助人們分析代碼變動以及減少衝突。)
比特幣專家和安全專家 Jameson Lopp 在自己的博客文章 《誰控制著 Bitcoin Core?》中解釋得非常好:
Bitcoin Core 是比特幣協議開發的一個焦點,而不是一個命令點或者控制點。如果它出於什麼理由而不存在了,那就會出現一個新的焦點 —— 這個代碼庫所在的技術社區平臺(當前是 GitHub)隻影響便利性,不影響 定義/項目 的完整性。事實上,比特幣開發的焦點已經改過平臺,甚至換過名字了!
—— Jameson Lopp,《誰控制著 Bitcoin Core?》(2018)
然後,他解釋了 Bitcoin Core 軟件是如何維護、如何抵抗惡意的代碼變更的。整篇文章的要點可以在末尾得到了總結:
沒有哪個人控制著比特幣。
沒有哪個人控制著比特幣開發的焦點。
—— Jameson Lopp,《誰控制著 Bitcoin Core?》(2018)
Bitcoin Core 開發者 Eric Lombrozo 在他的名為《Bitcoin Core 合併流程(The Bitcoin Core Merge Process)》的 Medium 文章中進一步講解了這個開發過程:
任何人都可以複製這個基礎代碼庫,然後在屬於自己的代碼庫中作出任何改動。他們可以用自己的代碼庫編譯出一個客戶端,而不是運行基礎代碼庫編譯出來的軟件,只要他們想的話。他們也可以放出編譯好的二進制文件,供其他人運行。
如果一個人想要將自己對本地代碼庫的修改合併到 Bitcoin Core 中,他們可以提交一個 “代碼合併請求(pull request,PR)”。一旦提交,其他任何人都能審核這一變更,並作出評論,不論他們本身是否擁有 Bitcoin Core 代碼庫的代碼合併權限。
—— Eric Lombrozo,《Bitcoin Core 合併流程》(2017)
需要指出的是,一項 PR 可能要用很長時間來審核,然後才能由 “維護者” 合併到代碼庫中,這通常是因為 PR 缺乏審核(review)(詳見章節 7.5);而缺少審核又通常是因為缺少 審核員。
Lombrozo 也談到了圍繞共識規則變更的過程,但那個有些超出本章的範圍了。本書第五章(中文譯本)有關於這個主題(比特幣協議升級)的更多信息。
7.2 免許可的開發
我們已經知道了,任何人都能為 Bitcoin Core 編寫代碼、無需請求任何許可,只是並不必然能讓它合併到原本的 Git 代碼庫裡面。這一點適用於任何修改,從圖形用戶界面的顏色方案到點對點消息的格式,甚至到共識規則,即定義有效區塊鏈的規則集合。
也許同樣重要的是,用戶可以自由開發建立在比特幣協議之上的系統,同樣不需要請求任何須賀。我們已經看到了不計其數的成功的軟件項目,是建立在比特幣之上的,比如:
閃電網絡
這是一個支付網絡,允許非常小額的快速支付。它僅要求在比特幣區塊鏈內確認少量交易。現在已經有了多種可以互操作的軟件實現,包括:Core Lightning、LND、Eclair 和 Lightning Dev Kit 。
CoinJoin
多個參與者,將他們的支付合併為一筆交易,從而讓 “地址聚類” 變得更難(在本書章節 3.4(中文譯本)有解釋)。已經有了多種軟件實現。
側鏈
這樣的系統可以在比特幣區塊鏈內鎖定一個錢幣,然後在其它區塊鏈內解鎖這個錢幣。也就是說,比特幣可以流動到其它區塊鏈,也即 “側鏈”,從而使用側鏈上的特性。例子包括 Blockstream 公司的 Elements 。
OpenTimestamps
它讓你可以在比特幣區塊鏈內以私密形式為一個文檔打上時間戳。你可以使用這個時間戳來證明,這個文檔在該時刻以前必定已經存在了。
沒有免許可的開發,許多這樣的項目就不會實現了。如本書章節 1.3(中文譯本) 所說的,如果開發者們必須請求許可,才能在比特幣上開發協議,那就只有中央開發者委員會所允許的項目才會得到開發。
上面列舉的項目,將自身確定為開源軟件的情形是很常見的,這又反過來允許人們貢獻代碼、重複使用以及審核這些項目,無需請求任何許可。開源開發已經成了比特幣軟件許可的黃金標準。
7.3 匿名開發
開發比特幣不需要請求許可,這帶來了一個有趣且重要的選擇:你可以為 Bitcoin Core 和任何其它開源項目編寫和發佈代碼,無需揭曉自己的身份。
許多開發者就是這樣的:使用假名,並嘗試讓假名與真實身份分離。這樣做的理由因人而異。有一位匿名開發者叫 “ZmnSCPxj”。除了別的項目,他為 Bitcoin Core 和 Core Lightning(閃電網絡客戶端的一種實現)貢獻代碼。他在自己的個人網頁上說:
我是 ZmnSCPxj ,一個隨機生成的互聯網人格。我的代詞是 他 。
我知道人們本能地想知道我的真實身份。然而,我認為我的身份基本上無關緊要,並且更希望人們關注我的工作撐過。
如果你在猶豫要不要捐贈,或者懷疑我的生活成本或我的收入,請理解:恰當地說,你應該根據我的文章或我在比特幣和閃電網絡上的工作為你創造的價值而捐贈。
—— ZmnSCPxj,他的 GitHub 主頁
ZmnSCPxj 使用假名的理由是,更希望人們關注他的工作而不是他(或者他們)的生活。有趣的是,他在 CoinDesk 上的一篇文章透露,這個假名本身是出於另一個理由而創建的。
我【使用這個假名】最初的理由是,我擔心我會闖出大禍;所以,“ZmnSCPxj” 最初是想當作一個用後即棄的加密,可以在這種情況下放棄。然而,似乎它獲得的聲譽大部分都是正向的,所以我就保留了它。
—— 《許多比特幣開發者在選擇假名,而且很有道理》(2021)
使用匿名實際上允許你更自由地說話,不用擔心你會說的蠢話或者犯下的大錯會危及你的個人聲譽。事實證明,他的假名非常著名,而且在 2019 年他甚至還獲得了一項開發者獎金,這本身就是對比特幣的免許可性的一個證明。
不過,可以說,在比特幣世界裡,最著名的加密就是 “中本聰”。我們尚不清楚他為什麼要使用假名,但是,事後來看,這可能是個好主意:
- 隨著越來越多人猜測中本聰擁有許多比特幣,為了他的財務安全和人身安全,保持秘密身份是必要的。
- 因為他的身份不為人知,也就沒有起訴任何人的可能,這給許多政府權威將無處施展。
- 沒有權威人士可以崇拜,比特幣會變得更加舉賢與能,更能抵禦勒索。
請注意,這些道理不僅對中本聰適用,對任何開發比特幣或持有大量比特幣的人,也都程度不一地適用。
7.4 擇優密碼學
開源軟件開發者常常要使用由其他人開發的開源代碼庫。這是任何健康的生態系統中自然而且令人驚訝的部分。但比特幣軟件處理的是真實的錢,而且,有鑑於此,開發者們在挑選要依賴哪些第三方庫時,需要額外的謹慎。
在一場關於密碼學的哲學討論中,Gregory Maxwell 希望重新定義 “密碼學” 這個詞 —— 他認為原來的語義太狹窄了。他解釋說,從根本上來說 信息希望自由流動,然後基於此給出他自己的定義:
“密碼學” 是我們用來打敗信息的這種天性的藝術和科學;我們希望信息服從於我們的政治和道德願望,讓它抵抗所有違揹人道目的的機會和嘗試,引導它走向人道的目的。
—— Gregory Maxwell,《比特幣擇優密碼學》(2015)
然後,他使用了新的術語 “擇優密碼學(selection cryptography )”,指的是挑選密碼學工具的藝術,並解釋了為什麼這是密碼學中的重要部分。這門藝術圍繞著如何挑選密碼學庫、工具和實踐;用他自己的話來說,這是 “挑選密碼系統的密碼系統”。
使用具體的例子,他展示了擇優密碼學如何會輕易鑄成大錯,還提出了一個問題清單,用於參與者捫心自問。以下是這份清單的一個精選版本:
- 這個軟件最初是為你的目標用途而開發的嗎?
- 密碼學考慮是否已被嚴肅對待?
- 審核流程 …… 真的有審核嗎?
- 軟件作者的經驗如何?
- 這個軟件有說明書嗎?
- 這個軟件可以移植嗎?
- 這個軟件經過測試嗎?
- 這個軟件採用了最佳習慣(best practices)嗎?
雖然這不是通向成功的最終指南,但在執行擇優密碼學時,對照這些問題可能是非常有幫助的。
由於 Maxwell 提到的這些問題,Bitcoin Core 付出了艱苦的努力來儘可能減少對第三方代碼庫的依賴。當然,你不可能根除所有的外部依賴,不然你就要自己重寫所有東西,從字體渲染到操作系統調用的實現。
7.5 審核
這一節名為 “審核(Review)”,而不是 “代碼審核(Code review)”,是因為比特幣的安全性重度依賴於多個層面的審核,不僅僅對源代碼的審核。而且,不同的想法所要求的審核層面是不一樣的:相比於顏色方案變更和錯別字修正,共識規則變更需要更多層級的更加深入的審核。
在獲得最終採用的路上,一個想法通常要經歷討論和審核的多個階段。部分階段列舉如下:
- 這個想法發佈在 Bitcoin-dev 郵件組中
- 這個想法正是形成一份比特幣優化提議(BIP)
- 這個 BIP 被實現為
Bitcoin Core的一份 PR - 部署機制得到討論
- 一些有吸引力的部署機制被實現為
Bitcoin Core的 PR - PR 被合併到代碼庫的 master 分支
- 用戶選擇是否要運行這套軟件
在每一個階段,要由帶有不同審核視角和背景的人來審核可以得到的信息,可能是源代碼、BIP,也可能只是鬆散描述的想法。這些階段通常不會嚴格按順序執行,多個階段可能同步進行,或者有時候會來回反覆。不同的人在不同階段可以提供不同視角的反饋。
Jon Atack 是 Bitcoin Core 的最多產的代碼審核員之一。他寫過一篇博客文章來介紹如何審核 Bitcoin Core 的 PR 。他強調,一個好的代碼審核員關注的 是如何提供最大的附加價值。
作為新人,你的目標是嘗試增加價值,要友好和謙虛,同時儘快學習。
一個好辦法是,不要以自我為中心,轉去問 “我如何能更好地服務大家?”
—— Jon Atack,《如何審核
Bitcoin Core的 PR》(2020)
他指出,審核是真正限制 Bitcoin Core 的因素。大量好的想法都被困在進退不得的境地中:沒有審核,就只能原地不動。注意,審核不僅對比特幣有好處,也是你學習軟件的同時為之增添價值的好方法。Atack 的經驗法則是:在提出你自己的任何一個 PR 之前,先審核 5 ~ 15 個 PR 。再說一遍,你的關注點應該是如何最好地服務整個社區,而不是讓你自己的代碼得到合併。在此基礎上,他強調了在正確的層面上執行審核的重要性:現在到了檢查錯別字的時候了嗎,還是說,這個開發者現在更需要對概念的審核?
在開始審核的時候,一個有用的起點問題是,“現在它最需要的是什麼?” 回答這個問題需要經驗和不斷累積的語境,但這是一個有用的問題,決定你如何在最短時間內增加最大的價值。
—— Jon Atack,《如何審核
Bitcoin Core的 PR》(2020)
這篇文章的下半部分是許多有用的上手技術指導,關於如何實際操作審核;文章還提供了重要文檔的鏈接,可供進一步閱讀。
Bitcoin Core 開發者和代碼審核員 Gloria Zhao 曾經寫過一篇文章,包含了她在操作審核的時候常常問自己的問題。她也提到了她認為是好的審核的標準。
我個人認為,一次好的審核是,我問了自己關於這項 PR 的許多針對性問題,而這些問題都得到了回答。
……
自然地,我會從概念性問題開始,然後是跟方法有關的問題,再然後是實現問題。通常,我個人認為,在一項 PR 草稿中留下 C++ 語法相關的評論是沒有用的;而且,給作者留下 20 多個代碼組織建議、等到他一個個看完再問他 “這個 PR 有什麼意義呢” 會讓人感覺沒禮貌。
—— Gloria Zhao,《常見 PR 審核問題》,GitHub(2022)
她的想法是,好的審核應該關注此時此刻這個 PR 最需要的東西,這跟 Jon Atack 的建議是一致的。她也提出了一個問題清單,你可以在審核的的不同階段問自己,但請注意:這個清單絕對不是無所不包的,也不是捷徑。這個清單是用來自 GitHub 的真實案例來掩飾的。
7.6 資金支持
許多人服務於比特幣的開源開發,不論是為 Bitcoin Core,還是為其它項目。許多人是在業餘時間這樣做的,不會得到任何補償,但一些開發者能夠得到報酬。
對比特幣的持續成功感興趣的公司、個人和組織可能會給開發者捐贈資金,可能是直接捐贈,也可能通過組織將資金分發給個人開發者。還有一些關注比特幣的公司會僱傭有經驗的開發者,讓他們能全職為比特幣工作。
7.7 文化衝擊
人們常常會有這樣的印象:比特幣開發者內部有許多內鬥,而且有吵不完的架,而且好像根本無能做決定。
就比如章節 5.2.3(中文譯本)所介紹的 “Taproot” 部署機制,被討論了很長時間,期間還形成了兩個 “黨派”。一派希望在特定時刻之後,發現礦工沒有壓倒性投票支持新規則時讓升級 “失敗”,另一派則希望無論如何,在某個時刻之後就強制執行新的規則。Michael Folkson 總結了來自兩派的爭論,並發佈到了 Bitcoin-dev 郵件組中。
爭論似乎會永遠持續下去,而且完全看不到什麼時候能夠形成什麼共識。這讓人們感到沮喪,而結果是熱度加劇了。Gregory Maxwell(作為用戶 “nullc”)在 Reddit 論壇上表示擔心這樣漫長的討論會讓升級沒那麼安全。
到了現在,額外的等待已經不會增加更多的審核以及確定性。相反,額外的推遲會減緩勢頭,可能還會增加風險(因為人們開始忘記細節了)、推遲下游應用場景的工作(比如錢包支持),而且,如果人們對激活的時間窗口感到愜意,也就不會投入儘可能多的額外審核精力。
—— Gregory Maxwell,《Taproot 部署是太快還是太慢了?》,Reddit
最終,感謝由 David Harding 和 Russel O’Connor 提出的新提議 “速戰速決(Speedy Trial)”,爭議得到解決。這個提議得到這個名稱,是因為它安排了相對較短的信號期給礦工表態,即要麼快速鎖定升級,要麼快速表明失敗。如果礦工們在這個信號期內激活它,Taproot 就會在大約 6 個月後部署。這次升級在第 5 章有更多講解(中文譯本)。
不熟悉比特幣的開發流程的人,可能會認為這些激烈的辯論看起來非常糟糕,甚至是有毒。至少有兩個因素,讓它在某些人眼中很糟糕:
- 相比於閉源的公司,開源開發中的所有爭論都會在公開環境中發生,而且不會經過剪輯。谷歌(Google)這樣的軟件公司不會讓自己的僱員在公開環境中爭論提案,反之,他們最多隻會發表一份聲明,表達公司在這個話題上的立場。這讓公司看起來比比特幣更和諧。
- 因為比特幣是免許可的,任何人都可以說出自己的觀點。這跟閉源開發公司完全相反,後者只有少數人可以表達觀點,通常是觀點相似的人。比特幣開發者內部的觀點,(相比於比如說 PayPal 這樣的公司),多到簡直令人震驚。
絕大多數比特幣開發者會說,這種開放性帶來了一種好的、健康的環境,甚至這是產生最好結果的必要環境。
如章節 6.2(中文譯本)所暗示的,上述第二點可能是非常有好處的,但也有一個缺點。攻擊者可以使用拖延戰術,就像《Simple Sabotage Field Manual》書中列舉的那樣,來扭曲開發流程和最終決定。
另一個值得指出的是,如章節 7.4 所說,因為比特幣是錢,而 Bitcoin Core 保護的是不計其數的資金,因此安全性是重中之重。這就是為什麼有經驗的 Bitcoin Core 開發者可能看起來非常頭鐵,其實這種態度是合理的。實際上,一個缺乏合理設計原則的特性可能不會被採用。會打破 “可復現編譯(reproducibale builds)” 的特性(詳見章節 2.1(中文譯本))、添加新的依賴以及沒有遵循比特幣的最佳習慣的代碼變更,同樣如此。
新的(和老的)開發者可能會因此覺得沮喪。但是,按照開源軟件的慣例,你總是可以復刻代碼庫、將代碼合併到你自己的副本中,然後編譯和運行你自己的二進制文件。
7.8 結論
Bitcoin Core 和其它絕大部分比特幣軟件,都是開源的,意味著任何人都能自由分發、修改和使用這些軟件。GitHub 網站上的 Bitcoin Core 代碼庫是當前的比特幣開發的焦點,但如果人們開始不信任代碼庫的維護者,或者這個網站本身,那麼狀況也有可能發生改變。
開源開發允許免信任的開發,即包括開發比特幣,也包括開發比特幣之上的系統。無論你是編寫代碼還是審核代碼(提議),開源讓你能夠自由地投身其中,不論你是否匿名。
圍繞比特幣的開發流程是極為開放的,這讓比特幣看起來像是一個有毒的、低效的地方,但正是這樣的文化,讓比特幣能夠抵禦惡意的參與者。


