作者:bitcoindevphilosophy

本章剖析了 “免信任性” 的概念、從計算機科學的角度看它是什麼意思,以及,為什麼比特幣必須是免信任的,才能保持其價值底色。然後,我們會討論 “以免信任的方式使用比特幣” 意味著什麼、“全節點” 能夠給你什麼保證、不能給你什麼。在最後一節,我們會觀察比特幣與真實的軟件和用戶在真實世界中的互動,還有為了有所收穫而必須在便利性和免信任性之間採取的取捨。
人們常常說 “比特幣很好,因為它是免信任的”。但是 “免信任” 是什麼意思呢?Pieter Wuille 曾在 Stack Exchange 問答論壇解釋這個被廣泛使用的術語:
“免信任的” 這個詞所指的 “信任”,是一個抽象的技術術語。當一個分佈式系統能夠脫離於任何被信任的團體而依然能正常工作時,我們就說它是 “免信任的”。
—— Pieter Wuille,Bitcoin Stack Exchange (2016)
簡而言之,這個詞語指的是比特幣協議的一種屬性:它可以沒有 “任何受信任的團體” 而依然有邏輯地運行。這跟你不可避免要對自己運行的軟件或硬件交託的信任是不一樣的。關於後面這種信任,本章還會進一步討論。
在中心化的系統中,我們依賴於一箇中心參與者的聲譽,以確定 TA 會注意安全性、在遇到問題時候回滾系統狀態,以及,在司法系統中懲罰任何違約的行為。這些信任要求在匿名的去中心化系統中是有問題的 —— 因為根本無法追索,所以實際上也無法信任任何人。在《比特幣白皮書》的引言部分,中本聰描述了這個問題:
互聯網上的商業已經幾乎完全依賴於金融機構作為受信任的第三方來處理電子支付。雖然這樣的系統對大部分交易都處理得足夠好,它還是因為這種基於信任得模式而有內在得弱點。首先,完全不可逆轉的交易是做不到的,因為金融機構也無法避免糾紛和調解。其次,中間成本提高了交易的費用,限制最小可行的交易規模,並且切斷了小額隨意交易的可能性,而且,無法為不可逆轉的服務製作不可逆轉的支付,是更大的代價。因為有逆轉的可能性,信任需求也因此延伸。商家必須留意自己的客戶、要向他們詢問本來不必瞭解的信息。一定比例的欺詐被認為是不可避免地。這些成本和支付上地不確定性,可以通過個人使用實物貨幣來避免,但當前還沒有機制能夠無需受信任的第三方而通過通信通道發起支付。
—— 中本聰,《比特幣:一種點對點的電子支付系統》(2008)
看起來,我們無法擁有一個基於信任的去中心化系統,而這也是為什麼免信任性在比特幣中如此重要。
為了以免信任的方式使用比特幣,你必須運行一個全面驗證的比特幣節點(即 “全節點”)。只有這樣,你才能夠驗證從別人那裡收到的比特幣區塊(經過確認的交易數據)遵守了比特幣的共識規則;比如說,這個區塊遵守了比特幣的貨幣發行規則、沒有重複花費資金。如果你不運行一個全節點,你就是將驗證比特幣區塊的工作外包給了別人、並且信任他們會告訴你真實情形,也就意味著你不是以免信任的方式使用比特幣。
David Harding 曾經在 bitcoin.org 網站上撰文解釋如何運行一個全節點 —— 或者說以免信任方式使用比特幣 —— 絕對能幫到你。
比特幣只有在人們願意用它來交換其他有價值的東西時才能成為貨幣。這意味著,是接受比特幣的人為它賦予了價值、決定了比特幣要如何運行。
在你接受比特幣時,你有權力強制執行比特幣的規則,比如,防止任何人的比特幣在其私鑰未暴露的情況下被沒收。
不幸的是,許多用戶都外包了自己的強制執行力。這讓比特幣的去中心化處在弱化的狀態下,少量礦工勾結少量的銀行和免費服務就能為外包了自己的權力、不驗證區塊的用戶改變比特幣的規則。
與其他錢包軟件不同,Bitcoin Core 軟件會強制執行比特幣共識規則 —— 所以,如果礦工和銀行為不驗證的用戶改變了規則,這些用戶將無法給完全驗證的 Bitcoin Core 用戶(比如你)支付。
—— David Harding,Full Validation on bitcoin.org (2015)
他說,運行一個全節點可以幫助你驗證比特幣區塊鏈的每一個方面,而且無需信任其他任何人,所以你可以保證你收到的比特幣是真的。這很棒,但還有一個重要的事情,是全節點無法幫助你的:它無法防止通過鏈重組(chain rewrite)來實現的重複花費:
注意,雖然所有的程序 —— 包括 Bitcoin Core —— 都會受到鏈重組的影響,比特幣協議提供了一種防禦機制:你的交易收到的區塊確認數量越多,你就越安全。這是已知的最好的去中心化防禦機制。
—— David Harding,Full Validation on bitcoin.org (2015)
(譯者注:“區塊” 是一種讓整個點對點網絡定期確認一批交易、形成同步的辦法;區塊前後相接就形成了鏈條;由於每個區塊都要附加工作量證明(付出經濟代價),才能成為鏈條上的有效區塊,因此,處在鏈條越前面的區塊就越不可能被逆轉,由它們確認的交易也就越安全。“區塊鏈重組” 指的是已經被觀察到有區塊出現的位置(高度)上,又出現了新的區塊嘗試佔用同一個位置。這種情況可能是有意的,也可能是無意的,但總歸,它的可能性是無法消除的。)
不論你的軟件多麼高級,你總要信任確認了你的交易的區塊不會被覆寫。然而,正如 Harding 指出的,你可以等待一定數量的確認(確認了你的交易的區塊後面又接續了新的區塊),直到你認為出現影響到你的區塊鏈重組的概率低到可以接受。
以免信任方式使用比特幣的激勵,跟整個系統對 “全節點去中心化” (中文譯本)的需要相一致。越多人使用自己的全節點,全節點去中心化就越充分,比特幣抵禦惡意變更協議的能力就越強。但是,就像我們在全節點去中心化的章節解釋的,因為免信任性與便利性之間不可避免會出現矛盾,用戶常常選擇需要信任的服務。
從一個系統的角度看,比特幣的免信任性是絕對必要的。在 2018 年,Matt Corallo 在離家(Riga)的Baltic Honeybadger 大會上講解免信任性。這場演講的核心意思是,你無法在一個需要信任的系統上建構出免信任的系統,但反過來是可以的 —— 比如說,你可以在一個免信任的系統上開發一款託管式錢包。

- 圖 2. 一個免信任的基礎層允許在更高層級上取捨 -
這種安全模式允許系統的設計者選擇對他們有意義的取捨,而不必將這種取捨強加給其他人。
2.1 別信任,去驗證
比特幣是免信任地運行的,但你依然需要在一定程度上信任自己運行的軟件和硬件。這是因為你的軟件和硬件可能並不跟包裝盒上的內容完全一致。比如說:
- CPU 可能是惡意設計的,偵察出私鑰的密碼學操作就會洩露你的私鑰。
- 操作系統的隨機數生成器可能並不像它聲稱的那麼隨機。
- Bitcoin Core 可能在代碼中藏了後門,會將你的私鑰發送給壞人。
所以,除了運行一個全節點,還需要確保你在運行的就是你想要運行的東西。Reddit 用戶 “brianddk” 撰文討論了在驗證你用的軟件時可以選擇的幾個信任層級。在 “信任開發者” 一節中,他討論了 “可復現的編譯(reproducible builds)”:
“可復現的編譯” 是一種設計軟件的方法,它讓許多社區開發者可以各自編譯軟件,並保證開發者們最後編譯出來的安裝文件跟其他開發者編譯出來的是一樣的。在一個非常公開、可復現的項目(比如
bitcoin)中,用戶不需要完全信任任何一位開發者。許多開發者都可以運行編譯,並見證自己得到了跟最初的編譯者電子簽名過的文件相同的文件。—— brianddk,Bitcoin v22.0 and Guix(2022)
這篇文章定義了 5 個信任層級:信任網站、信任開發者、信任編譯器、信任操作系統內核,信任硬件。
為了進一步深化可復現的編譯這個主題,Carl Dong 作了關於 Guix 的演講,解釋了為什麼信任操作系統、代碼庫和編譯器可能是有問題的,以及如何使用叫做 “Guix” 的系統來修復這些問題,它正是 Bitcoin Core 項目當前使用的系統。
那麼,在我們的工具鏈可能有許多受信任的二進制文件、他們可能被惡意複製這個事實面前,我們能做什麼呢?我們需要的不僅僅是可以復現,我們需要自力更生。我們不能只是從其他組織控制的服務器處下載這些二進制文件、信任這些外部的服務器。我們應該知道這些工具是如何開發出來的、我們如何能重新編譯出它們,最好能夠從一組小得多的受信任的二進制文件開始。我們需要儘可能減少受信任的二進制文件集合,並設計出一條簡單的路徑,能夠審計從這些工具鏈到我們實際用來開發比特幣的整個過程。這將讓我們能夠最大化驗證、最小化信任。
—— Carl Dong 論 Guix,Breaking Bitcoin Conference (2019)
然後,Carl 解釋了 Guix 如何允許我們僅信任一個 357 字節的二進制文件,該文件是可以驗證的,而且只要你知道如何解讀這些指令,也是完全可以理解的。這是非常了不起的事:你只需要驗證這個 357 字節的二進制文件做了它該做的事,然後就能使用它從源代碼編譯一個完整的編譯系統,最終得到一個跟其他人編譯出來的完全一樣的 Bitcoin Core 二進制文件。
許多比特幣人都信奉一個信條,是上述內容的絕佳總結:
別信任,去驗證。
—— 無處不在的比特幣人
這句話背後的來歷是美國前總統羅納德·里根(Ronald Reagan)在核裁軍的背景下說的 “信任,但也要驗證”。而比特幣人將它轉變成了強調拒絕信任因素以及運行一個全節點的重要性。
要驗證自己所用的軟件和收到的區塊鏈數據到什麼程度,取決於用戶自己。而且,就跟比特幣世界裡的許多其它事情一樣,便利性和免信任性之間存在取捨。相比於在自己的硬件上運行 Bitcoin Core,使用一款託管式錢包幾乎總是更加便利。然而,隨著比特幣軟件的成熟和用戶界面的提升,它必定會更好地幫助那些想要免信任性的用戶。此外,隨著用戶獲得更多的知識,他們也應該會逐漸移除信任因素。
一些用戶會想得嚴峻一些(詳見本書第六章),他們會驗證自己運行的軟件的絕大部分。結果是,他們可以將信任因素減少到最低限度:只需要信任自己的計算機硬件和操作系統。在這樣做的同時,他們也能幫助那些不會徹底驗證自己的硬件的人:一旦他們發現問題,就能在公開環境中大聲疾呼。一個這樣的例子發生在 2018 年,一些人發現,一個 bug 允許礦工重複花費一筆交易中的一個輸出:
CVE-2018-17144,其修復措施已進入 9 月 18 日發佈的 Bitcoin Core 版本 0.16.3 和 0.17.0rc4;其中的漏洞包括一項拒絕服務式攻擊界面以及一個致命的通脹漏洞。最初,在 9 月 17 日,該漏洞僅僅被當作一項拒絕服務式攻擊漏洞,被報告給多位開發 Bitcoin Core 的開發者以及支持其它密碼貨幣的項目(包括 ABC 和 Unlimited);然而,我們迅速確定,該問題也是一項通脹漏洞,無論問題的根源還是修復措施都相同。
—— CVE-2018-17144 完整披露(2018)
在這個事件中,一位匿名的用戶報告了這個問題,並且事後證明,這個問題比 TA 以為的要嚴重得多。這凸顯了一個事實:驗證代碼的人通常會報告安全漏洞,而不是利用它們。這也會給那些自己無法驗證所有東西的人帶來好處。然而,用戶不應該信任其他人來保護自己的安全,更應該自己驗證(只要有能力,只要有事件),這是儘可能保持獨立的方法,也是讓比特幣得以繁榮的方法。越多眼睛盯著軟件,惡意代碼和安全漏洞進入其中的可能性就越小。
2.2 結論
比特幣協議是免信任的,因為跟它交互的用戶無需信任某一個第三方。不過,在現實中,絕大部分用戶都無法驗證自己運行比特幣協議的所有硬件和軟件。有技巧的用戶能夠驗證軟件或者硬件,他們能夠在找出惡意代碼或漏洞的時候提醒其他(不那麼瞭解技術的)用戶。
沒有免信任性,我們就沒有去中心化,因為信任不可避免會涉及一些權威中心點。你可以在一個免信任的系統上開發出一個需要信任的系統,但反過來不行 —— 不可能在一個需要信任的系統上開發出免信任的系統。


