区块链最强大的特点之一是,我们可以独立核实其执行的每一部分。即使大多数区块链矿工受到攻击,如果攻击者试图链接无效块,网络也会拒绝。即使是没有实时验证区块的用户,也可以收到正在验证区块的用户的警告,然后通过自我验证发现攻击者的链无效,自动拒绝接收这个链,然后与其他节点协调接收另一个遵循规则的链。
但实际上,我们需要多少个验证者呢?一百个独立验证的节点?一千?我们需要世界上的每个人都运行软件来检查所有交易吗?回答这些问题是我们的挑战。特别是,如果我们想建立一个比单一的中本聪工作量链更有利的区块链共识机制,解决这些问题尤为重要。
为什么要验证
-51%攻击者试图让网络接受无效区块,但我们希望网络不会接受无效链!-
用户验证区块链有两个主要优势。首先,这样可以最大限度地让节点参与到法律链的决定过程中。一般来说,法律链被定义为“矿工或验证者支持的最有效率的区块链”,比如比特币中的“最长有效链”。根据定义,无效链将被拒绝。如果有多个有效链竞争,矿工或验证者支持最多的链将获胜。因此,如果您运行一个节点来验证所有块的有效性,您将能够检测哪些链是有效的,哪些是无效的,从而最大化检测合法链的机会。
然而,用户验证区块链还有更深层次的好处。如果一个强大的参与者试图让网络接受大多数矿工支持的协议更改,那么攻击就很容易实现,而无需其他人验证区块链。此外,默认情况下,所有客户端都将接受这个新链。当所有人都意识到这一点时,他们只能依靠对手通过协调来拒绝这个新链条。但是,如果普通用户也参与认证,情况就完全不同了。试图改变协议的攻击者需要说服认证用户下载他们的软件补丁来改变协议。
如果有足够多的用户参与认证,当有人试图对协议进行有争议的修改时,默认情况下不会成功,反而会造成混乱。自然的混乱也会破坏网络,需要协议层面之外的社会协同来解决,但也给攻击者面前设置了更大的障碍,让他们无法自信一击即中,然后离开,大大降低了他们发动攻击的意愿。如果大部分用户都参与直接或间接的验证,而攻击者只有大部分矿工的支持,那么这种攻击自然会失败,这对大家来说都是最好的结果。
定义视角与协作视角
需要注意的是,上述推理的逻辑与我们经常听到的另一种推理大相径庭:他们说只要改变协议规则的链条是“按定义”的,就不会是合法的链条,重要的不是有多少用户愿意接受新的规则集,而是你可以一直留在使用你喜欢的旧规则的链条中。
看看这个从“定义角度”讨论这件事的例子,来自加文·安德森:
我想为比特币提出一个全面的技术定义:
“比特币”是一种交易分类账,它记录有合法签名的交易,并以区块链的形式使用以前未使用的资金。这个链从创世块开始,它的哈希是000000000019d 6689 c 085 AE 165831 e 934 ff 763 AE 46 a 2 a6 c 172 B3 f1 b 60 A8 ce 26f,它根据预定的时间表在链上发行2100万个累积最多的双SHA256工作负载证书的比特币。
Wasabi wallet的另一个定义在解释整个节点的价值方面更为直接:
当您运行比特币全节点时,您可以定义您同意的确切货币规则。没人能强加给你。因此,任何追求财务自由的自治个体都应该运行整个节点。全节点软件在确定自己的规则后,可以在比特币对等网络中找到符合我们规则的节点。根据它们的规则,这些节点将它们确定为有效的事务发送给我们,然后我们根据自己的规则进行验证。如果我们收到不符合规则的事务,我们可以将其标记为无效,并将其与无效事务的源节点断开。
要求你的货币主权
使用所有节点使我们有权定义、验证和执行我们的比特币货币规则。
我们要从“定义”的角度关注两个核心:
如果一个链不符合你定义的基本的、不可协商的规则,不管其他多少人接受这个链,从定义上来说,它就不是比特币链。
最重要的是,你要按照自己的规则坚持链条。
但是,我觉得这种“个人主义”的观点是很有问题的。在解释我的理由之前,让我们想一想我们不想看到的:绝大多数参与者已经接受了一个你不想接受的协议。比如有一天交易费变得很便宜。为了维护链条的安全,几乎所有人都同意改变规则,发行新的硬币。而你固执地在旧规则下跑链条,自己从大部队分支出来。
从你的角度来看,你确实根据你同意的规则在系统中拥有货币,但那又怎样?其他人不再接受你的货币。交易所是不会接受的,网站可能会显示新币的价格在逐日上涨,但这个新币指的是用户最多的链条中的货币,你的货币会变得一文不值。加密货币和区块链基本上是社会结构。如果没有其他人相信,它们将变得毫无意义。
那么应该从什么角度来看待这个问题呢?这一观点的核心是将区块链视为利用协调问题实现安全的范例。
一般来说,现实世界中的协调问题是比较难的:虽然对于大多数人来说,如果英语改变其高度复杂和不规则的拼写系统,不如改成语音拼写;虽然如果美国改用公制会更好;虽然在经济衰退期间,我们最好立即将所有价格和工资降低10%,但事实上,每个人都很难同时同意这些变化。
但是在区块链的应用中,协调已经成为我们的优势。我们利用不顺畅的协调问题来防止核心参与者的渎职行为。我们可以构建一个带有X属性的系统,并保证这个X属性可以被保留,因为将规则从X属性更改为非X属性需要很多人同时同意和更新他们的软件。即使有一个参与者可以强行改变,他也很难做到,比那些积极协调、抵制改变的反对者要难得多。
我们要注意持有这种观点的特殊后果:运行整个节点的目的不仅仅是为了保护自己的利益,当出现硬分叉的纠纷时,运行整个节点的用户是安全的,而没有整个节点的用户是不安全的。在更大程度上,这可以看作是一种群体免疫。验证的人越多,大家就越安全,即使只是验证了一部分人,大家也能得到更高程度的保护。
深入讨论“验证”
让我们进入下一个主题,这对于轻客户端和碎片化等主题非常重要:验证时我们在做什么?为了理解这一点,我们需要回到更早的时间点。对于攻击,我的偏好顺序如下:
默认失败>默认混乱>默认成功
这里的“大于号”表示前者优于后者。最好的情况是攻击直接失败,第二好的情况是攻击导致混乱,使得大家无法在法律链条上达成一致,最坏的情况是攻击成功。为什么混乱比攻击成功好得多?这可以归因于激励机制。混乱还会给攻击者带来成本,使他们无法确定攻击会成功,从而降低攻击者发动攻击的动机。对于攻击者来说,混乱的环境自然意味着他们需要赢得区块链战争,赢得“舆论战”,以说服整个社区跟进攻击链。与只有51%的攻击会成功的事实相比,上述情况会使攻击变得极其困难,利润也更低。
验证的目标是将攻击从自然成功的状态变为自然失败的状态或自然混乱的状态。如果运行完全验证所有块的节点,攻击者试图让网络接受具有不同规则的链,攻击将失败。如果一些用户运行整个节点的认证,而很多人不运行,那么攻击就会导致混乱。但我们不得不思考,有没有其他方法可以达到同样的效果?
轻客户和欺诈证明
更好的方法自然是使用有欺诈证据的轻型客户。目前,大多数区块链之光客户端只验证大多数矿工是否支持特定块,而不验证是否满足协议规则。这些客户的正常运作假设大多数矿工是诚实的。一旦出现有争议的分歧,这类客户端自然会跟风,用户需要采取积极措施,在旧规则下留在小众链。因此,对于目前轻客户端发起的攻击,攻击者自然可以成功。但是有了防欺诈技术,情况就大不一样了。
简单地说,欺诈证明的工作原理如下。一般来说,区块链的一个街区只会涉及区块链“州”的一小部分。如果整个节点处理一个数据块,发现它无效,它可以生成一个数据包,并将其广播给轻型客户端。数据包只包括数据块和足够处理该数据块的数据。光客户端收到数据包后,无需链上其他数据,即可自行验证该块。
-单个区块只涉及几个账户,欺诈证明可以包括这些账户的数据,连同其默克尔证明,以证明数据的正确性-
这项技术有时被称为无状态验证。客户端只能记录块头,而不能记录完整的区块链状态数据,并且可以通过向其他节点请求任何状态条目的默克尔证明来实时验证正在处理的块。
这项技术的优点是,光客户端只有在收到警报后才会验证单个块,因此在正常情况下,光客户端仍然是轻量级的,并且只检查大多数矿工或验证者支持哪些块。但在特殊情况下,如果大部分人所属的链中包含了轻客户端不接受的区块,只要至少有一个诚实的整体节点对有问题的区块进行验证,就可以知道它是无效的并广播欺诈证书,这样网络中的其他节点也会拒绝它。
地区
碎片化是在此基础上的自然延伸。在碎片化的系统中,系统中的事务太多,大多数用户不能总是直接验证它们。但是,如果系统设计得好,任何无效块都可以被检出,其无效性可以通过欺诈证明来验证,并可以在整个网络上广播。碎片化的网络对每个用户来说都是一个轻客户端。只要每个片段的参与者都在一定阈值以上,网络就可以获得群体免疫。
此外,非常重要的是:在碎片化系统中,块生成的门槛很低,甚至可以在家用笔记本上完成。网络核心不依赖高性能硬件,保证了反对派作为少数党的门槛足够低,使得多数党主导的协议更难被攻击者变为“自然攻击成功”的状态。
这也是审计在现实世界中的意义:不是每个人都在随时验证一切,但第一,有足够的人检查每一个具体的部分,任何错误都能发现;其次,一旦错误被检查出来,每个人都可以清楚地看到错误。
话虽如此,长远来说,区块链在这方面肯定会走得更远。进步的一个来源是ZK-斯纳克,它是一种高效且可验证的加密证明,使块生产者能够向客户证明块满足一些任意复杂的有效性条件。有效性证明比欺诈证明更强大,因为它不依赖于交互式游戏来捕捉欺诈。另一项重要技术是“数据可用性检查”,它可以检测未完全公开的块。数据可用性证明确实取决于一些安全假设,但这个假设非常保守:网络中仍然有少数可用节点是诚实的;好消息是,诚实验证者的最小数量非常低,即使攻击者的数量非常多,也几乎不需要提高要求。
时机和51%攻击
现在,我们来看看“自然造成的混乱”模式最强大的后果:51%的攻击开始攻击自己。目前很多社区,如果发生51%攻击,攻击者获胜,51%攻击链将成为合法链。每个人都严格遵守这个规范。最近51%对以太琴经典的攻击说明了这一点。攻击者退了3000多块,过程中用双花攻击偷走了807,260 ETC。作为两大经典Ethereum客户端之一,技术上无法退守到攻击链的历史高度,Geth节点可以在攻击链上运行,而OpenEthereum只能困在原链中。
我们可以说,这次攻击确实导致了混乱,但这是一次意外,而不是经典的Ethereum社区故意设计的。不幸的是,社区随后选择接受攻击链作为合法链。Ethereum的经典推特账户称之为“严格遵循我们最初打算的工作量证明”。因此,社区规范积极帮助攻击者获胜。
但实际上,我们可以在法律链的定义上达成另一种共识,比如建立一个规则,一个区块拥有100个以上的后代区块后,其合法性不能被颠覆。或者,一份最终的股权证书。规则是,一旦一个块是最终的,它将永远不会退出。
-仅为便于说明,最多只能备份5个框图。实际上,回滚可以限制在100-1000个数据块-
我们应该明确,这在链的合法性定义上引入了一个重大变化:客户不仅应该检查他们收到的数据,还应该检查他们何时收到数据。这也会引入一个新的情况。由于网络延迟,在大规模攻击中,两个冲突的块A和B将同时获得终结性。有的客户会先看到A,有的客户会先看到B,所以无法达成一致。但我认为这并不是坏事,因为这意味着攻击自然没有成功,甚至只有51%的攻击在撤退阻挡中自然会导致混乱,社区层面的应急响应可以在两个链条之间选择继续哪一个。如果协议设计合理,那么让事件满足社区层面的紧急响应应该是非常昂贵的。在权益证明中,这意味着三分之一的核查员不得不牺牲自己的保证金而受到惩罚。
这种方法有发展潜力。我们可以尝试创建一个51%攻击来专门检查导致混乱的事务。时间验证器的研究也使得各种攻击朝着自然失败的方向发展。但是还是会有一些困惑,因为时效性验证器无法帮助那些离线或者网络连接不好的节点。
对于重视不可篡改性的区块链社区来说,可以说这种限制回滚的措施是一个不错的选择。如果网络接受某项交易,无论多长时间前,它仍可能在事故中回滚,那么区块链不能声称享有不可篡改性。当然,我相信即使是BTC和ETC在极端情况下也限制了回滚。如果攻击者试图回滚几周的块历史,社区也可以启动一个软分叉,要求用户积极参与以拒绝攻击者的链。然而,更明确地商定和正式确定这一措施可以更进一步。
结论
那么这个故事教会了我们什么呢?首先,如果我们接受社会合作的合法性,接受基于“1对N”信任模型的间接验证的合法性,即假设网络中总有一个诚实的参与者,而不是假设某个参与者总是诚实的,那么我们就可以创建一个更具可扩展性的区块链。
其次,客户端认证是上述内容的关键步骤。一个只有少数人运行节点,其他人依赖认证节点信任的网络,当涉及特殊利益时,非常容易受到攻击。但避免这样的命运并不意味着矫枉过正,以至于每个人都要随时验证一切。因此,单个块可以被隔离和验证,用户只需要验证被警告的块。这个系统是合理的,可以达到同样的效果。但这需要我们从上述合作的角度来看待验证的作用。
第三,如果我们在法律链的定义中包含“机会”,我们对抗51%攻击的技能树就会打开。最容易被接受的属性是主观性弱,即如果要求客户端至少每三个月上线一次,并且拒绝任何超过三个月的退路,我们可以在权益证明中加入惩罚机制,使得攻击成本很高。我们可以更进一步。我们可以拒绝回滚所有已经获得终结性的块,从而保护不变性并防止它们被检查。因为网络是不可预测的,依靠“时机”确实意味着攻击在某些情况下自然会导致混乱,但好处是显而易见的。
记住这几点,我们可以避免以下陷阱:1。过度集权;2.校验冗余过多导致网络效率低下;3.误导性规则意外地使攻击变得更容易;迈向更具弹性、更强劲的表现和更安全的区块链。