本文探讨了区块链验证的哲学,强调了独立验证的重要性,并讨论了在51%攻击下如何通过协调问题来增强安全性。文章还提及了轻客户端和分片技术,以及如何通过时间定义来改进对抗攻击的能力。
另请参见:
区块链最强大的特点之一是其执行的每一个部分都可以独立验证。即使区块链的大多数矿工(或PoS中的验证者)遭到攻击者控制,如果攻击者试图推动无效区块,网络将简单地拒绝它们。即使在那个时候没有验证区块的用户也可以(潜在地自动)被当时验证区块的用户警告,此时他们可以检查攻击者的链是无效的,并自动拒绝它并协调接受遵循规则的链。
但是我们实际上需要多少验证呢?我们需要一百个独立的验证节点,还是一千个?我们需要一种文化,使得世界上的普通人运行软件来检查每一笔交易吗?正是这些问题构成了挑战,尤其是如果我们想要构建具有比原本区块链空间开始时的单链“中本聪”工作量证明更好的共识机制时,这是一个非常重要的挑战。
用户验证链有两个主要原因。首先,它最大化了节点正确确定并声明在 规范链 上的机会——社区所接受为合法的链。通常,规范链被定义为“获得最多矿工/验证者支持的有效链”(例如比特币中的“最长有效链”)。无效链根据定义被拒绝,如果在多个有效链之间有选择,获得最多矿工/验证者支持的链将获胜。因此,如果你有一个可以验证所有有效性条件的节点,从而检测哪些链是有效的,哪些链不是,这将最大化你正确检测到规范链实际是什么的几率。
但验证链还有另一个更深层的理由是有益的。假设一个强大的参与者试图推动协议的变化(例如改变发行量),并得到了大多数矿工的支持。如果没有其他人验证链,这种攻击很可能成功:每个人的客户端将 默认 接受新链,到任何人看到发生了什么时,区块链的反对者们将不得不协调拒绝那个链。但是,如果普通用户在验证,那么协调问题就落在了一方:现在,试图改变协议的人有责任说服用户积极下载软件补丁以接受协议变化。
如果有足够的用户在验证,那么 与其默默地取得胜利,强行改变协议的争议尝试将默默走向混乱。默默走向混乱依然会造成很多干扰,并需要额外的社会协调来解决,但它为攻击者设置了更大的障碍,让攻击者对能够轻松取胜产生更少的信心,并使他们更少的动机去尝试发起攻击。如果 大多数 用户在验证(直接或间接),且攻击 仅仅 得到了大多数矿工的支持,那么攻击将直接 注定失败——这是最好的结果。
请注意,这种推理与我们经常听到的另一种推理大相径庭:改变规则的链在某种程度上是“根据定义”不正确的链,无论其他有多少用户接受某组新规则,重要的是你个人能够停留在遵循你所偏好的旧规则的链上。
这是来自 Gavin Andresen 的“根据定义”视角的一个例子:
另一个来自 Wasabi钱包,这更直接地解释了全节点的价值:
注意到这个观点的两个核心组成部分:
但是,我认为这种“个人主义”观点是非常错误的。为了看清原因,我们来看我们担心的场景:绝大多数参与者接受一些你觉得不可接受的协议规则变化。例如,想象一个未来,交易费用非常低,而为了保持链的安全,几乎所有其他人都同意变更规则以增加发行量。你固执地继续运行一个节点,继续执行旧规则,并分叉到与大多数不同的链上。
从你的角度来看,你仍然在一个基于你接受的规则的系统中拥有你的币。但那又有什么关系呢?其他用户不会接受你的币。交易所将不会接受你的币。公共网站可能会将新币的价格显示为某个高值,但他们指的适用于大多数链上的币; 你的 币没有价值。加密货币和区块链在根本上是社会构造;没有其他人相信它们,它们便毫无意义。
那么替代观点是什么?核心思想是把区块链视为 通过协调问题实现安全的工程。
通常,世界上的协调问题是坏事:虽然如果大多数人能够去掉英语复杂且不规则的拼写系统,采用一种语音拼写,或者如果美国能够切换到公制,或者如果我们能够在经济衰退时 立刻减少所有价格和工资的百分之十 (http://www.interfluidity.com/v2/6088.html),在实践中,这要求所有人同时同意切换,而这通常非常困难。
然而,在区块链应用程序中,我们正在利用协调问题来为我们服务。我们利用协调问题带来的摩擦来抵制中心化行为的恶劣。我们可以构建具有属性X的系统,并保证它们将保留属性X,因为将规则从X变更为非X将需要一大群人同时达成协议更新他们的软件下载。即使有一个参与者可以强制改变,做到这一点也会很困难——比起 用户 需要主动协调反对改变,要困难得多。
注意这一观点的一个具体后果:你的全节点的目的绝不是单纯地保护 你 ,在争议的硬分叉情况下,拥有全节点的人是安全的,而没有全节点的人是脆弱的。相反,这里的视角更倾向于 群体免疫:验证的人越多, 每个人 的安全性就越高,即使只有部分人正在验证,所有人也因此得到了较高的保护。
我们现在进入下一个主题,十分相关的主题,如轻客户端和分片:我们通过验证到底在实现什么?为了理解这一点,让我们回到一个早期的观点。如果发生攻击,我认为我们对攻击的偏好顺序如下:
注定失败 > 注定混乱 > 注定胜利
“>”在这里当然是指“更好”。最好的结果是攻击彻底失败;其次是攻击导致混乱,所有人对正确的链产生分歧,最糟糕的情况是攻击成功。为什么混乱比胜利更好?这是一个激励问题:混乱提高了攻击者的成本,并且让他们对成功的确定性在一定程度上受到限制,从而阻止他们最初尝试攻击。一个默默转向混乱的环境意味着攻击者不仅需要赢得区块链的51%攻击战,还需要赢得“社会战”,说服社区跟随其后。这要困难得多,并且比起仅仅发起一次51%攻击并声称自己胜利要有吸引力得多。
因此,验证的目标就是将局面从默认胜利转向(理想情况下)默认失败或(次理想)默认混乱。如果你有一个完全验证的节点,攻击者试图推进一个有不同规则的链,那么攻击就会失败。如果某些人有完全验证的节点,但其他人没有,攻击则导致混乱。但现在我们可以思考:还有其他方法可以实现相同的效果吗?
在这方面,一个自然的进步是 具有欺诈证明的轻客户端。目前大多数区块链轻客户端的工作原理是简单地验证大多数矿工是否支持某个区块,而不去检查其他协议规则是否被执行。客户端基于这样一个信任假设:大多数矿工是诚实的。如果发生争议的分叉,客户端会默认遵循大多数链,用户必须采取积极措施以遵循旧规则的少数链;因此,当今天轻客户端遭到攻击时,它们默认走向胜利。但使用欺诈证明技术,情况开始看起来非常不同。
简单形式的欺诈证明的工作原理如下。通常,一个区块链中的单个区块只触及区块链“状态”(帐户余额、智能合约代码等)的一小部分。如果一个完全验证节点处理一个区块并发现它是无效的,他们可以生成一个包(欺诈证明),该包包含该区块以及来自区块链状态的足够数据以处理该区块。他们将这个包广播给轻客户端。轻客户端可以使用该数据验证该区块,即使他们没有来自链的其他数据。

这种技术有时也被称为 无状态验证:客户端不是保持整个区块链状态的数据库,而是仅仅保留区块头,并且可以通过请求其他节点对该区块验证的所需状态条目的Merkle证明来实时验证任何区块。
该技术的力量在于 轻客户端只在听到警报时才能验证单个区块(而且警报是可以验证的,因此如果轻客户端听到虚假警报,他们可以停止监听来自该节点的警报)。因此,在正常情况下,轻客户端依然是轻便的,仅检查哪些区块是由大多数矿工/验证者支持的。但是在那些异常的情况下,如果大多数链包含一个轻客户端不会接受的区块,只要有一个诚实节点验证了欺诈区块,该节点将发现它是无效的,广播欺诈证明,并导致网络的其余部分拒绝该区块。
分片是一个自然的延伸:在分片系统中,系统中的交易数量太多,以至于大多数人始终不能直接验证,但如果系统设计良好,那么任何单个无效区块都可以被检测到并通过欺诈证明证明其无效,而且该证明可以广播到整个网络。分片网络可以总结为 每个人 都是轻客户端。只要每个分片有一些最低参与者阈值,网络就具有群体免疫。
此外,分片系统中区块 生产 (而不仅仅是区块 验证)的高度可及性并且可以在普通笔记本上完成也是非常重要的。网络核心对高性能硬件的依赖性低,确保异议少数链的生存门槛很低,使得驱动变更的多数更难“默认胜利”,从而迫使其他人屈服。
这在现实世界中通常意味着可审计性:并不是说每个人总是在验证所有内容,而是 (i) 对每个特定部分有足够的关注,以便如果有错误它会被检测到,且 (ii) 当错误被检测到时,该事实能够被清晰和可见地告知所有人。
那说,长期来看,区块链确实可以在这方面得到改进。一个特定的改进来源是 ZK-SNARKs(或“有效性证明”):有效性可验证的加密证明,允许区块生产者向客户端证明区块满足一些任意复杂的有效性条件。有效性证明比欺诈证明更强,因为它们不依赖于互动游戏来抓捕欺诈。另一个重要技术是 数据可用性检查,可以保护那些未完全公开其数据的区块。数据可用性检查确实依赖于至关重要的假设,即网络中至少存在一些诚实节点,但好消息是这一最小诚实阈值较低,即使有大量攻击者,它也不会增长。
现在,让我们讨论“默认混乱”思维方式的最强大后果:51% 攻击本身。当前许多社区的规范是,如果 51% 攻击获胜,则该 51% 攻击必然是有效链。这种规范通常相当严格;最近发生在以太坊经典的一次 51% 攻击 证明了这一点。攻击者回退了超过 3000 个区块(在此过程中盗取了 807,260 ETC 的双重支付),这使得链的历史推迟到了两个 ETC 客户端之一(OpenEthereum)能够在技术上回退的程度;因此,Geth 节点选择了攻击者的链,而 OpenEthereum 节点坚持原始链。
我们可以说,这次攻击确实注定走向了混乱,尽管这是一种意外而非 ETC 社区的蓄意设计决定。不幸的是,社区随后选择接受了(更长的)攻击链作为规范,这是 由 eth_classic twitter 描述为“按照工作量证明按预期进行”。因此, 社区规范积极助长了攻击者的胜利。
但是我们可以同意不同的规范链定义方式:尤其是,想象一个规则,一旦客户端接受了一个区块作为规范链的一部分,而该区块有超过 100 个后代,客户端此后将永远不再接受不包括该区块的链。或者,在有最终性的权益证明设置下(例如以太坊 2.0),想象一个规则,一旦区块被最终确认,就永远无法回退。
为了明确说明,这对规范性的确定引 入了显著变化:客户端不再仅仅查看其收到的数据,客户端还查看 何时 收到该数据。这引入了一个可能性,因为网络延迟,客户端不同意:假设由于一次大规模攻击,两个相互冲突的区块 A 和 B 同时被确认,而一些客户端首先看到了 A,而另一些则首先看到了 B?但我认为这很好:这意味着 相比于默认胜利,即使是试图回退交易的 51% 攻击也默默走向混乱,并且可以根据外部紧急响应决定哪个区块继续该链。如果协议设计得当,迫使升级到外部紧急响应应当是非常昂贵的:在权益证明中,此类情况将需要三分之一的验证者牺牲其押金并被削减。
潜在地,我们可以扩展这个方法。我们可以尝试将对交易进行审查的 51% 攻击默默转向混乱。有关 及时检测器 的研究进一步推动所有类型攻击的默默转向失败,尽管由于及时检测器无法帮助那些连接不良和在线时间不长的节点,因此仍会留下一些混乱。
对于一个重视不可改变性的区块链社区,实施这种恢复限制可以说是更优的路径。当无论交易在链中被接受多久,总有可能由强大行为者的意外活动将其回退,就很难公正地声称某个区块链是不可改变的。当然,我认为即使是 BTC 和 ETC 在极端情况下 已经 有了恢复限制;如果发生了一次回退数周活动的攻击,社区很可能会采用用户激活的软分叉来拒绝攻击者的链。但是,更明确定义并正式化这一点似乎是向前迈进的一步。
这里有几条“故事的道德”。首先,如果我们接受社会协调的合法性,并接受涉及“1对N”信任模型的间接验证的合法性(也就是,假设网络某处存在一个诚实的人;这一点与假定某个特定方,例如 Infura,诚实不同),那么我们可以创建更具可扩展性的区块链。
其次,客户端验证对所有这些工作至关重要。一个只有少数人运行节点而其他所有人确实信任他们的网络,很容易被特殊利益控制。但避免这样的命运并不需要走到极端,让每个人始终验证所有内容!允许每个区块被单独验证的系统,因此用户只有在其他人提出警报时才验证区块,完全合理,并能产生同样的效果。但这需要接受 “协调视角” 来理解 验证的目的。
第三,如果我们允许规范的定义中包含时间,那么我们在提升拒绝 51% 攻击的能力方面就打开了许多门。获得的最简单特性是 弱主观性:即如果要求客户端每隔例如 3 个月至少登录一次,且拒绝恢复超过此时间的交易,则我们可以在权益证明中加入削减,并使攻击成本非常高。但我们可以更进一步:拒绝恢复已确认的区块链,从而保护不可变性,甚至防止审查。因为网络不可预测,依赖时间会在某些情况下默认进入“混乱中的攻击”,但所带来的好处是值得的。
考虑到所有这些观点,我们可以避免(i)过度中心化、(ii)过于冗余的验证导致低效 和 (iii)误导性规范意外使攻击变得更容易,这将更好地朝着构建更具韧性、性能更高和安全性更强的区块链而努力。
- 原文链接: vitalik.eth.limo/general...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!