金色深度丨Vitalik Buterin亲笔:《区块链验证的哲学》全文
金色财经 区块链8月19日讯 以太坊联合创始人Vitalik Buterin于8月17日在其个人网站发布《区块链验证的哲学》论文,金色财经将本文编译如下:
一个区块链最强大的一个特性,就是可以独立验证这个区块链执行的每个部分。即使大多数区块链矿工(或权益证明区块链中的验证人)被攻击者接管,如果该攻击者试图推送无效区块块,网络也会直接拒绝这些区块。即便用户在某个特定时间内没有验证那些区块,他们也会潜在地、自动地获得警告,而且可以检查攻击者的区块链是否无效并自动拒绝这些区块,然后再按照规则接受一条链。
但是,我们到底需要多少验证?需要一百个独立验证节点,或是一千个独立验证节点吗?我们是否需要一种文化,让全世界每个普通人都运行软件来检查每笔交易?如果我们要构建一个比“中本聪”最初创建的工作量证明单链更好的、具有共识机制的区块链,解决上述问题将会是一个非常重要的挑战。
区块链为什么要验证?
上图展示了“51%攻击”穿透一个无效区块,我们希望网络拒绝这条链!
验证区块链对用户非常有益,主要原因有二:
1、首先,验证区块链最大程度地提高了节点可以正确确定在规范链上发言的机会(金色财经注:所谓规范链就是社区认可的区块链)通常,规范链被定义为类似于“具有最多支持该链的矿工/验证人的有效区块链”(例如,比特币中的“最长有效链”)。根据定义,无效链将被拒绝,如果在多个有效链之间进行选择,那么获得矿工/验证人支持最多的那条链将获胜。因此,如果您有一个可以验证所有有效性条件的节点,从而检测到哪些链有效、哪些链无效,那么就可以最大程度地提高正确检测规范链的机会。
2、其次,验证区块链有效性还有一个更深层的原因:假设一个强大的参与者试图推动对协议的更改(例如更改代币发行),并得到大多数矿工的支持,如果没有其他人验证区块链,那么这种攻击就很容易成功,因为在默认情况下,每个人的客户端都会接受新链,等到人们看到正在发生的事情时,持不同意见的人才会来尝试协调拒绝那条链。但是,如果普通用户都在进行验证,那么协调问题就落在了另一边:那些试图更改协议的人将负责说服用户积极下载软件补丁以接受协议。
如果有足够多的用户在验证,那么就会避免造成不必要的混乱,也不会因为强制更改协议而产生争议。混乱会造成很多破坏,而且需要带外数据社交协调(out-of-band social coordination)来解决,这其实就给攻击者设置了很大障碍,他们也因此没有足够的信心逃脱,继而使攻击者没有发动攻击的动力。如果大多数用户正在(直接或间接)进行验证,而攻击仅得到大多数矿工的支持,则该攻击将完全默认为失败,这是所有结果中的最佳结果。
定义观点 vs. 协调观点
请注意,这种推理与我们经常听到的另一种推理方式截然不同:“根据定义”,更改规则的那条链在某种程度上其实并不是正确的链,无论有多少其他用户接受某些新规则,重要的是你依然可以留在自己喜欢的且遵循旧规则的那条链。
下图是加文·安德森(Gavin Andresen)“按定义”观点的一个示例:
另一个观点来自Wasabi钱包,从解释完整节点为何有价值的角度来看,这一点更为直接:
请注意,这个观点有两个核心部分:
1、根据定义,不接受你认为基本且不可转让规则的那条链的版本不是比特币(或以太坊或任何其他区块链链),无论有多少其他人接受该链。
2、重要的是,你必须保持链上有你自己认为可以接受的规则。
但是,我相信这种“个人主义”观点是非常错误的。为了弄清原因,让我们看一下我们担心的情况:绝大多数参与者可能会接受对协议规则的一些更改,而这些更改是你认为不可接受的。举个例子,设想我们拥有了一个交易费用很低的未来,并且为了保证区块链安全,几乎其他所有人都同意更改为增加发行量的一组新规则,但是此时你却顽固地继续运行一个继续执行旧规则的节点,并且分叉到与大多数节点不同的链上。
从你自己的角度来看,你仍然可以将代币放在可以接受的旧规则下运行的系统中。但是那又怎样呢?其他用户根本不会接受您的代币,交易所也不会接受您的代币。价格网站上会罗列出代币的价格,但他们的数据来源肯定会指向多数链上的那个代币,所以你的代币将毫无价值。加密货币和区块链从根本上说是一种社会建构,如果没有其他人相信它们,它们将毫无意义。
那么替代的观点是什么?这里给出的一个核心思想是通过协调问题将区块链视为工程安全(engineering security)。
通常,我们所处世界里所遇到的协调问题大多不是好事,这里有几个例子:
1、对于大多数人来说,英语其实并不“协调”,因为英语高度复杂且有大量不规则的拼写系统和语音结构;
2、有些人认为美国如果改用公制计量可能会更好;
3、还有人觉得如果在经济衰退的情况下立即将所有价格和工资降低10%将会帮助国家渡过难关,那么其实这么做需要每个人都同意,通常也非常困难达成。
但是,在区块链应用程序中,我们利用协调问题来发挥自己的优势,并利用协调问题造成的摩擦来抵制中心化执行者的渎职行为。再举个例子,我们可以构建具有属性X的系统,并且可以保证该系统始终保留属性X,但是如果想把规则从X更改为not-X则需要一大堆人同意同时更新其软件。即使有一个执行者强制进行更改,这种做法也将非常困难——远比用户负责协调异议者抵制变更要困难得多。
请注意,这种观点会带来一个特殊后果:你的全节点核心目的并不是仅仅为了保护你,在有争议的硬分叉情况下,拥有完整节点的人会更安全,而没有完整节点的人则很容易受到攻击。相反,这里的观点更多地体现出一种群体豁免权的观点,即:验证的人越多,每个人所拥有的安全性就越高,即使只有一部分人在进行验证,结果也会让每个人都得到了更高程度的保护。
深入分析区块链验证
现在,我们进入下一个主题,这个主题与轻客户端和分片之类的主题相关性非常高:通过验证,我们将会完成什么工作?为了理解这一点,让我们回到更早的时候——如果区块链发生攻击,那么攻击的发生方式可能具有以下优先顺序:
默认为失败>默认为混乱>默认为胜利
这里的“>”代表的含义是“优于”。最好是攻击完全失败;第二好是攻击导致混乱,每个人都对正确的链持不同意见,最糟糕的是攻击成功。这里的问题是:为什么混乱比胜利要好得多?事实上,这是一个动机问题,即:混乱会增加攻击者的成本,这意味着攻击者肯定会获胜的可能性会大幅降低,因此攻击者从一开始就不鼓励进行攻击。默认为混乱的环境意味着攻击者不仅需要赢得进行51%攻击的区块链战争,还要说服社区跟随这场“社会战争”,这比仅仅发起51%攻击并通过单纯攻击取得胜利要困难得多,吸引力也要低得多。
验证的目标则是让从默认状态从胜利变成混乱(理想情况下),再从混乱变成失败(不太理想的情况下)。如果您有一个完全验证的节点,并且攻击者尝试使用不同的规则推入一条链,则攻击将会失败。如果某些人具有完全验证的节点,而其他许多人没有,则攻击就会导致混乱。但是,现在我们肯定会想到另一个问题,即:到底还有没有其他方法可以达到相同的效果吗?
轻客户端和欺诈证明
这方面的自然发展是拥有欺诈证明的轻客户端(light clients with fraud proofs)。当前市场上大多数区块链轻客户端的工作原理是:只需验证大多数矿工是否支持特定的区块,而不必费心检查其他协议规则是否得到执行。也就是说,客户端基于大多数矿工是诚实的信任假设运行。如果发生争议分叉,那么在默认情况下,客户端会遵循多数链,如果用户希望遵循旧规则,则由用户自己采取积极的措施。因此,如今受到攻击的轻客户端都是默认胜利。但是借助防欺诈技术,情况看起来开始有了很大不同。
最简单形式的欺诈证明工作方式如下:
通常而言,区块链中的单个区块仅接触区块链“状态”的一小部分(比如账户余额、智能合约代码、等等...)。如果经过完全验证的节点处理了一个区块并发现它是无效的,则他们可以生成一个包含该区块的包(package)——也就是欺诈证明,这个包中将包含足够的、处理该区块的区块链状态数据。之后,区块链会将此包广播给轻客户端,轻客户端便可以接收该包并使用相关数据来验证区块本身,即使他们没有链中的其他数据也没有问题。
如上图所示,区块链中的独立区块仅涉及几个账户。欺诈证明将包含这些帐户中的数据以及证明该数据正确的Merkle证明。
这种技术有时也称为无状态验证:客户端可以只保留区块头,而不必保留完整的区块链状态数据库,并且可以通过向其他节点要求任何期望状态的Merkle证明来实时验证任何区块,此外区块验证的条目也可以被访问。
这项技术的强大之处在于,轻客户端仅在侦听到警报时才会验证独立区块(并且警报是可验证的,因此如果轻客户端听到虚假警报,那么他们只能停止侦听该节点的警报)。所以在正常情况下,轻客户端仍然是轻客户端,他们只会检查大多数矿工/验证者支持哪些区块。然而在特殊环境下,比如在多数链包含一个轻客户端不会接受区块的情况下,只要有一个诚实节点来验证欺诈区块,那么该节点就会发现该区块是无效的,只要这个节点广播欺诈证明,那么网络中的其他节点就会拒绝它。
分片
分片可以看做是一种网络验证的自然扩展:在分片系统中,系统中的交易太多,大多数人无法持续进行直接验证,但是如果系统设计良好,则可以检测到任何一个无效的独立区块,而且这种无效性往往会带有欺诈证明的证据,该证明可以在整个网络中传播。我们可以把共享网络看做是每个人都是轻客户端,只要每个分片都具有一定量的参与者最小阈值数,那么网络就具有群体免疫力。
此外,在分片系统中,区块生产(而不仅仅是区块验证)是高度可访问的,甚至可以在家用笔记本电脑上完成,这一事实也非常重要,因为这意味着网络核心不依赖高性能硬件,也确保了少数链可以用较低标准来执行,而且使得多数链驱动的协议更改“默认获胜”、以及欺负其他人变得更加困难。
这就是可审计性在现实世界中通常的含义:不是每个人都一直在验证所有事情,而是:
(i)每个特定部分都有足够的眼睛,如果有错误,它将被发现;
(ii)当检测到一个错误,可以确保让所有人都清楚可见。
也就是说,从长远来看,区块链肯定可以改善这一点。改进的一个特殊来源是ZK-SNARK(或者说是“有效性证明”):有效验证的加密证明,使区块生产者可以向客户端证明区块已经满足了某些任意复杂的有效性条件。有效性证明比欺诈证明更强,因为它们不依赖于交互式游戏来捕获欺诈。另一个重要技术是数据可用性检查,它可以防止区块执行未完全发布的数据。不过,数据可用性检查基于非常保守的假设,即网络中某处至少存在少量诚实节点,好消息是:即便存在存在大量攻击者,网络中总是会有诚实节点。
时间和51%攻击
现在,让我们分析下“默认混乱”思维方式可能会造成的最严重后果:51%的攻击他们自己。许多社区中的当前规范是,如果51%攻击获胜,那么那个遭受51%攻击的链必然是有效链。一般来说,我们会严格遵守这个规范,比如最近以太坊经典(Ethereum Classic)遭到51%攻击就说明了这一点。攻击者还原了3000多个区块(在此过程中,通过双花支付窃取了807,260 ETC),这使得该链的历史比两个ETC客户端之一(OpenEthereum)在技术上能够还原的时间更远,结果导致Geth节点与攻击者的链保持一致,而OpenEthereum节点则与原始链保持一致。
可以说,这次攻击的确造成了“默认混乱”,尽管这是一次偶然事件,而不是ETC社区故意设计所决定的。但不幸的是,以太坊经典社区随后选择接受(较长的)攻击链作为规范,以太坊经典官方推特账户将其描述为“遵循预期的工作量证明”,因此到最后,社区居然在积极帮助攻击者获胜。
但是,我们可以就规范链定义达成不同的共识:特别是,想象一个规则,一旦客户接受了一个区块作为规范链的一部分,并且该区块有100个以上的后续区块,那么客户端其实完全可以从那时开始永远不要接受不包含该区块的链。或者,在具有最终确定性的权益证明设置中(例如,以太坊2.0),假设有一个规则,一旦确定了某个区块,就永远无法还原。
本文编译自vitalik.ca