如何应对51%攻击是过去十年来讨论很多话题,在史丹佛区块链大会上,以太坊联合创始人Vitalik Buterin发表了题为《越过51%攻击》的演讲,他首先介绍了不同类型的51 %攻击,例如最常见的回滚交易攻击,此外还有审查攻击、轻客户端攻击、劝阻攻击,以及最严重的覆巢式攻击,他认为这对工作量证明(PoW)加密货币仍是一个很大威胁。
而99%容错共识、及时性检测器(TD)等技术来检测攻击链以及审查攻击,可以使权益证明(PoS)货币基本消除51%攻击带来的威胁。他还称,「与其让攻击者针对PoW,我们的目标是让链转向PoS。」
2 月19 日到21 日,由高性能隐私区块链Findora 团队成员、应用加密学小组(Applied Crypto Group) 成员、Bulltetproofs 证明机制提出者Dan Boneh 与Benedikt Bünz 联席举办,邀请了包括Vitalik Buterin、 Ben Fisch 等来自知名美国院校,以及Facebook、瑞波、Visa 等机构的行业知名人物。PANews 作为官方合作媒体,参与本次活动的报导。
以下是Vitalik 演讲实录,由巴比特编译。
51% 攻击能做什么?51% 攻击有不同的种类,它们可以对不同的应用执行不同的操作,并产生不同的结果和后果。你可能熟悉的一种51% 攻击是回滚区块。你进行了一笔交易,把钱发送到了一家交易所,然后用这些币换取了另一个币,你提走这些换得的币,然后进行一次51% 攻击,恢复你的存款交易……
这就是过去10 年来,我们一直在讨论的主要的51% 攻击类型,也是我们考虑最多的一类。
一、其他类型的51% 攻击
交易审查攻击
实际上,交易审查也是另一种51% 攻击!鉴于layer 2 协议和DeFi 都是最近的大趋势,交易审查变得尤其危险。在很多layer 2 协议的环境中(包括plasma、通道、通用状态通道、闪电网络、Optimistic Rollup、交互计算、TruBit 等),审查就意味着盗窃!
因此,如果你能够审查挑战交易,那么你就可以从人们那里偷到钱。这不适用于zk Rollup,但这种攻击确实适用于人们现在正在考虑的绝大多数协议。在DeFi 的背景下,审查尤其危险,因为它是一种工具,你可以通过它操纵市场,然后获取价值。
如果你能审查每一笔接触Uniswap 的以太坊区块链交易,然后等待一天,那么以太币的价格可能会有点波动,我就能从这次攻击中提取出大量的套利价值。
可以说,审查是危险的,在DeFi 协议和layer 2 协议中,交易审查也可以被视为与盗窃相等。
轻客户端攻击
很多人都在运行轻客户端,如果你运行的是轻客户端,那么51% 攻击可能会导致这些轻客户端接受包含完全无效交易区块的链。错误的签名、格式错误的交易、未经授权的签名(从一个账户中窃取资金并将其转移到其他帐户),他们可以得到网络接受的可用区块。
数据不可用攻击
这里谁熟悉数据可用性问题?好吧,虽然不是所有人,但有很多人了解了它。这里的想法是,你可以在发布区块头(block header)的地方创建一条链。轻客户端可以看到这条链,但不能在区块体(block bodies)中发布部分或全部数据。
这是糟糕的,原因是,如果数据没有发布,那么它可能是正确的,也可能不是,而且又没有办法生成证据向其他人证明它可能是正确的,并且你拒绝了人们可能要创建未来交易的信息。也就是说,不可用的区块也是很危险的。
劝阻攻击
劝阻攻击(Discouragement attack)是一个术语,它指恶意破坏其他参与者,导致其他参与者失去收入,并驱使他们与你合谋,或者被迫退出。1/3 以上算力的自私挖矿就是这样的一个例子。也就是说,51% 攻击也是非常强大的劝阻攻击。
关于区块链的不可篡改性
所以说,51% 攻击是非常强大的,这类攻击对于区块链的不可篡改性而言是个威胁。
谁还记得这个?一家交易所被盗走了一堆钱,他们考虑推动比特币区块链为期一天的逆转,以便拿回这些钱。如果这样的事情是可能的,那么区块链内部的东西就可能被还原,区块链就失去了其成为区块链的关键属性,这是可怕的。
另外,51% 攻击不是民主的,它们是富豪统治的,所以作为一种民主方法,对他们而言是没有什么好处的。
二、现实中发生过的51% 攻击,以及最糟糕的51% 攻击场景
在现实当中,51% 攻击是可以完成的,这是一张来自2015 年香港比特币扩容大会的照片。在这张照片当中,掌控比特币90% 算力的一些人坐在了一起,摆出了一副“我拥有权力” 的姿态,哈哈。
51% 攻击是可以完成的,例如ETC、Bitcoin Gold 等都遭遇过51% 攻击,我肯定我漏说了1-2 个,这些攻击都是已经发生的。
覆巢式攻击(Spawn camp attack)
实际是,我们目前所看到的51% 攻击,并不是最糟糕的。对于这类攻击来说,覆巢式攻击(Spawn camp attack)是最糟糕的噩梦场景。基本上,你需要获得足够的硬件来攻击一条链,等它恢复之后,然后再次进行攻击,因为你仍然持有这些硬件。
最后,社区会受够了这种折磨,他们会更换工作量证明(PoW)算法,由于在短时间内他们没有办法构建ASIC,所以你只需要租用大量的CPU 和GPU 算力继续攻击, 然后,这条链就死了,除非他们切换到权益证明(PoS) 或者完全变成中心化的东西。
三、权益证明(PoS)算法能打破这个循环吗?
这是我在2016 年写的一篇博文,我试图描述什么是权益证明(PoS) 背后的哲学,以及为什么这是我们应该期待存在的,它为什么是一件有意义的事情。权益证明(PoS) 中存在一种不对称性,它与工作量证明(PoW)是不同的,在工作量证明(PoW)中,你只有奖励,因此你对参与攻击或者不参与攻击的惩罚,只有区块奖励这部分。而在权益证明(PoS) 系统中,你的攻击是可以被检测到的,你失去的存款远远大于你可以被罚没的质押金。
它们被放入Casper CBC 和一系列其他基于安全存款和罚没的权益证明(PoS) 算法中。从理论上来讲,这种设计的目标是使51% 攻击变得极其昂贵。基本上,你要攻击一条PoS 链,你需要购买一堆的币,你需要控制系统中超过50% 以上的币,然后当你被抓住要攻击时,你就会遭遇罚没,如果你想再次发动攻击,你必须购买更多的币,因为你一直在购买,那么不断上涨的币价,最终会导致你破产,因此,从这个角度来看,与其让攻击者针对PoW,我们的目标是让链转向PoS。
其它类型的攻击呢?
现在我们来讨论第一个问题,PoS 如何解决其它类型的攻击呢?到目前为止,我们一直在关注终局性逆转。这在拜占庭的容错共识理论中是相当普遍的。基本思想是,如果2/3 的一方站在一边,另外1/3 站在另一边…1/3 的验证者必须发出两条相互矛盾的消息,你可以检测到并惩罚它们。不过,这是关于逆转的攻击。
数据无效、数据不可用、审查以及恶意破坏?
让我们一点一点解决,我们不会在意数据的有效性,我们将注意到,如果你有数据可用性的保证,并且保证如果一个区块是区块链的一部分,那么该区块中的所有数据都可以由网络中的一个节点下载。如果你有审查阻力,你发布了一个区块,那么它最终会被包含在内,从这两件事中,你得到了有效性。
原因是交互计算、 Rollup 和这些现有协议。基本上,对于Rollup,你在链上发布所有数据,然后链保证其可用性,你有一些欺诈证明,并保证如果某些计算无效,那么你可以发布一个不可审查的欺诈证明,并得到链上处理。所以数据的有效性并不是那么重要的,因为第一层(layer 1)和第二层(layer 2)的欺诈证明可以解决这个问题。
如果你不能审查别人的区块,那么你就不能阻止它们被纳入区块链。因此,只要激励措施的惩罚是有效控制的,那么恶意破坏(Griefing) 也不会是什么大问题。
我们可以归结为两件事:数据可用性攻击和审查攻击。
数据无效和数据不可用
这是我在2017 年和musalbas 等人共同撰写的一篇论文,我在其中描述了一种基本上允许区块链客户端不实际下载所有数据的情况下,验证区块链数据可用性的方案。
这个方案的简单稻草人版本是这样的:检查一个区块是否可用最愚蠢的方法就是下载完整的东西。但在这里,我们假设一个可扩展的、可能是分片的区块链,其中有超过2 MB/秒的数据会被上传到链上,而客户端将无法下载所有的内容。
对于一个想要检查数据可用性的客户端,我们要做的就是随机抽样测试。它会随机选择一些数据片段,比如30 个片段、40 个片段、80 个片段……它会随机选择位置,要求提供这些位置的merkle 证明,只要你收到你接受的所有位置的有效回复,那你就会接受该区块,将其视为有效的。
如果你接受使用此方案的区块,那么你很可能知道该区块是有效的。如果只有不到50% 的数据可用,比如这里左边的所有数据都可用,这里右边的所有数据都可用,那么至少有一个检查将很有可能是失败的。
通过这种方案,攻击者就能够欺骗少数特定的客户端。但是,如果攻击者欺骗了足够多的客户端,以至于它们下载的子叶数据占到了总数据的一半,那么这些客户端就可以继续从那里重建数据。
这并不能证明区块是完全可用的,它可能缺少了一部分,但它确实证明至少有一半的区块是可用的。如果我们有一些技术可以从50% 的数据中恢复整个数据块,那就太好了。
擦除编码(Erasure coding)
这就是擦除编码的用武之地,所以我们要取数据,假设它是一个多项式求值,我们将在更多的点上求值相同的多项式,现在,任何50% 的数据都足以恢复所有数据。有了这个方案之后,你就可以验证区块是有用的,并且区块是潜在非常大的尺寸下是可用的,同时个人要下载20-200 KB 的数据。
这是第一部分。这包括数据可用性攻击,它是以太坊2.0 分片解决方案的一部分,这至少允许我们赋予分片区块链同样的可用性保证。
证明正确性
那如何证明一个根(root)是此擦除编码的根呢?你如何证明自己没有把垃圾数据卡在里面?你可以使用欺诈证明,例如这个2D 的,如果你编码错误,然后有人可以做一个简短的欺诈证明,你可以将它广播到网络,然后网络就可以拒绝该区块。这个2D 方案是在2017 年开始研究的。最近则有一些关于编码merkle 树的东西,你在merkle 树中编码每一个level ,这有很好的特性。
也有一些方法不依赖于欺诈证明,比如使用STARK 或SNARK 来证明merkle 根的计算是正确的,而另一种可能则涉及多项式承诺—— 你会得到你的数据,你会把它解释为多项式的求值,你会计算出多项式,然后你在一大堆点上做一大堆多项式承诺的opening(开口),你的数据可用性检查将是要求80 个位置而不是80 个opening(开口),或者如果你使用聪明的代数得到某种多开口(multi-opening),你就可以获得更高的效率。
这些方案的好处是,它们不依赖于欺诈证明,因此用于验证区块数据的方案已被发表了,它们不再有任何额外的内置延迟假设。
分片:越过委员会
目前存在的分片区块链,通常会依赖于委员会,其想法是,你有一大堆节点,你随机抽取一些节点,你需要其中的大多数或绝大多数节点在某个区块上签名,以便网络接受该区块是有效的。
问题是,任何一种基于委员会的方案,都将受到超过某个阈值不良行为者的审查。如果我们要谈论抵抗51% 攻击,那么我们就要谈论一个系统,在这个系统中,即使大多数人开始攻击,那么少数人应该能够继续操作系统本身。
固定阈值的分片方案,并不能真正帮助到你。所以这里的解决方案是,协议需要更充分地依赖一组数据可用性检查方案,而不是依赖于委员会。
关于审查
在场的各位,有哪些人想阻止审查呢?可以,有很多人,所以,现状不是很好。这是nrryuya 的一篇文章,他在形式化验证以太坊方面做了一些工作,他写了一篇文章说,在目前的以太坊2.0 设计中,有一些策略可以让大多数人审查区块,这种审查与单区块延迟是不可区分的,很难去确定谁该负责。
这里的攻击是相当卑鄙的,攻击者攻击一些验证者,并使它们为另一个区块投票,使用其他验证者为自己的区块投票,该区块实际上包含了要审查的内容… 但他们自己的选票不足以超过51%,所以他们试图审查的内容,实际上永远不会被包含在内。这是多层次的间接作用。在以太坊1.0 和以太坊2.0 中,一个进行51% 攻击的恶意方可以进行审查,而当审查力度足够大时,就很难确定是否需要对此采取措施。
纳入叔块
这是我们目前能做的最基本的事情:纳入叔块。这里的想法是,在以太坊1.0 中,不属于区块链的区块可以稍后被包含进来,而新的方案则是,我们添加了协议规则,该规则表示叔块中的交易也会被处理。
所以,你就有了这样一条区块链,其中,叔块也被纳入在里面。
想法:及时性检测器(TD)
想像一下,如果我们至少可以有在线的客户端,那么在网络上的客户端可以下载东西,并定期与其它客户端通信。让它们检查是否看到一个区块准时到达。
如果它们看到某个区块是按时到达的,并且它们看到该区块在很长一段时间内没有被某条链接受,那么该区块将自动被取消资格。如果一个区块没有准时到达,那么你可以用它来进行51% 回滚攻击。
它的思路是,客户端在本地检测到某个区块是否在它应该到达的时候到达,并将其用作确定要遵循链的信息。
不是每个节点都能遵循协议的,因为离线节点也会存在。除非51% 攻击正在进行中,否则如果没有攻击发生,那么获胜的区块链将是一条好的链,如果攻击正在发生,而你又处于离线状态,那么你几乎必须检查社交层,看看发生了什么,但只有少数参与者会这样做,其他人会有一个相当明确的共识。
问题:边缘攻击
如果你生成一个区块,无论该区块的定义是什么,它都能准时到达,一些节点将看到它在不同的时间到达。因此,节点可能不同意一个区块“是否被审查太久”,以及一个区块“是否按时发布”,它们可能不同意这些时间参数。
而攻击者可以利用这一点,导致其他人在攻击是否发生的问题上,产生长期的分歧,并带来很多治理问题。所以,这就要求我们有更好的及时性检测器(TD)。
改进版及时性检测器(TD)
我们回到拜占庭将军问题,回到1982 年由莱斯利·兰伯特(Leslie Lamport) 撰写的论文。事实证明,这篇论文包含了一个算法,而人们并没有真正去谈论这个算法,但他们可能应该多谈一些。它把这句话用不可伪造的书面信息(指数字签名)抽像地隐藏起来。兰伯特声称,他有一个共识算法,可以容忍高达99% 的错误攻击者(即99% 容错共识)。
这个算法是有效的,它的优点是,只要你有同步性假设,它就可以工作,不仅是在做共识的矿工和验证者之间,而且是在矿工和客户端之间,以及客户端和其它客户端之间。它对谁应该在线有一个更强的假设,其使用这个假设来获得更高程度的容错,但它是一个非常危险的假设,我们不愿意自己去做。
我将描述单个证明者的版本。在这里,假设一个证明者是诚实的,然后一共有n 个证明者,我们就只需要1/n 的证明者是诚实的。
这里的想法是,假设一个区块被发布,然后客户端和证明者有一个期限,他们需要在这个期限之前接收该区块,以便认为该区块是准时的。对于客户端来说,最后期限是t,对于证明者来说,最后期限则是t+δ。所以这里的提议者将发布一个区块b,我们假设提议者有点邪恶,其试图进行边缘攻击,节点1 在截止日期之前看到它,节点2 也在截止日期之前看到它。证明者发送了该区块,但是由于网络同步性假设,如果有一个节点接受了该区块,那么这意味着证明者保证在他们的截止日期之前接受该区块,因为区块可以被发送给证明者。如果哪怕一个客户端认为某个区块是及时的,那么证明者也会保证在他们的截止日期之前看到它,因此证明者会添加他们自己的签名,并且由于网络同步性,另一个客户端将在一个签名区块的截止日期之前,看到该区块加上一个签名。
将其扩展到多个证明者的方法是简单的,你有很多证明者,客户端将是t+δ*k。我在eth.research 上有一篇文章是专门讲这方面的研究的,所以如果你想了解更多的细节,请随时查看。讲讲大概的想法,你有一组攻击者,每个攻击者都可以将截止日期延迟一点,因此如果一个攻击者接收到一个区块,那么只要网络延迟低于你的δ参数,它就会将一个区块的及时性传播到网络的其余部分。
有趣的事实
如果你有这种及时性检测器,你会按照自声明的时间顺序处理所有及时区块,就是这样。唯一的问题是,它需要很长的区块时间,如果你想处理验证者的存款、取款和罚没,那这可能是一个有趣的协议,但它不是运行区块链的最佳协议。
更好的说法是,你可以使用及时性检测器检测攻击链以及审查攻击。
四、总结
反审查技术不如其他技术完美,因为它确实依赖于网络和客户端之间的同步假设,你可以将此持续时间设置为你想要的任何时间,但它与你愿意容忍的审查级别有关。你可以保证在线节点集之间的一致性,在发生攻击的情况下,你可以就“一条链是否是攻击链”,以及其他所有事情达成共识。你可以将此作为部分社会共识的开始,以确定恢复的方式,这有助于你为攻击者分配更强程度的惩罚,因为你可以更可靠地确定攻击者是谁。
一般来说,如果攻击者发布了一条不可用的链,那么数据可用性检查将捕获它,如果其发布了无效区块,那么欺诈证明可以捕获它,如果你对区块进行长时间的审查,那么这条链将自动被网络忽略。如果你审查了一个中等时间的区块,那么你可以使用及时性检测器来干净地处理它,如果攻击者试图不参与或破坏委员会,则相应就不使用委员会。
好了,我们有了一系列的工具,它们基本上可以大大降低我们对51% 攻击的恐惧感,或者能够忽略它们,或者从中恢复过来。谢谢大家。