作者: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 结论
比特币协议是免信任的,因为跟它交互的用户无需信任某一个第三方。不过,在现实中,绝大部分用户都无法验证自己运行比特币协议的所有硬件和软件。有技巧的用户能够验证软件或者硬件,他们能够在找出恶意代码或漏洞的时候提醒其他(不那么了解技术的)用户。
没有免信任性,我们就没有去中心化,因为信任不可避免会涉及一些权威中心点。你可以在一个免信任的系统上开发出一个需要信任的系统,但反过来不行 —— 不可能在一个需要信任的系统上开发出免信任的系统。