中年|有关区块链验证的哲学( 三 )


轻客户端与欺诈证明(Fraud Proof)
一个更好的办法自然是使用带有欺诈证明的轻客户端 。 当前的大多数区块链轻客户端仅仅验证是否大多数矿工都支持特定区块 , 而不会验证协议规则是否得到满足 。 这些客户端的正常运行假设了大部分矿工都是诚实的 。 一旦出现有争议的分叉 , 这类客户端会天然随大流 , 用户需要主动采取措施才能留在旧规则下的少数方链上 。 因此 , 对于当前的轻客户端发起攻击 , 攻击者可以天然成功 。 但有了欺诈证明技术 , 情况就大不相同了 。

简单来说 , 欺诈证明的工作原理如下 。 通常来说 , 区块链中的单个区块仅仅会涉及到区块链 “状态”(账户余额、智能合约代码……)的一小部分 。 如果一个全节点处理完一个区块发现其无效 , 就可以生成一个数据包(即欺诈证明) , 并广播给轻客户端 。 数据包内仅包括该区块及足够处理该区块的数据 , 轻客户端拿到数据包后则可以自行验证该区块 , 而无需链上的其他数据 。
- 单一区块仅仅涉及几个账户 , 欺诈证明能够包含这些账户的数据 , 并连同其默克尔证明 , 来证明数据的正确性 -
这项技术有时也称为 无状态验证 , 客户端可以只记录区块头 , 而无需记录完整的区块链状态数据 , 而且可以通过向其他节点请求任意状态条目的默克尔证明来实时验证正在处理的区块 。

该技术的强大之处在于 , 轻客户端只有在收到警报(警报也是可验证的 , 如果轻客户端发现虚假警报 , 它们可以停止监听该节点的警报)后才会去验证单个区块 , 因此在正常情况下 , 轻客户端依然轻量 , 只检查哪些区块获得了大多数矿工或验证者的支持 。 但在特殊情况下 , 若多数人所在的链包含了一个该轻客户端不接受的区块 , 只要有至少一个诚实的全节点验证到了这个有问题的区块 , 就可以知道其无效 , 并广播欺诈证明 , 从而使网络中的其他节点也拒绝它 。
分片
分片是在此基础上的一个自然的拓展 , 在分片系统中 , 系统中的交易太多 , 多数用户无法一直直接验证 , 但如果系统设计良好 , 那么任何无效区块都能被检验出来 , 而且其无效性可以由欺诈证明来验证 , 该证明就可以在全网广播 。 分片网络可以看作每个用户都是一个轻客户端 , 只要每个分片的参与者都在某个门槛之上 , 网络就能获得群体免疫 。

另外 , 还有一点非常重要:在分片系统中 , 区块的生成(不仅仅是验证)门槛是很低的 , 甚至可以在家用笔记本上完成 。 网络的核心并不依靠高性能硬件 , 确保了反对派作为少数一方的门槛足够低 , 这就使得以多数人主导的协议更难以被攻击者变为 “天然攻击成功” 的状态(迫使其他人服从于其攻击) 。
这也是现实世界中审计的意义:并不是每个人都随时在验证所有内容的 , 而是第一 , 每个特定部分都有足够的人在检查 , 任何错误都一定能被发现 , 第二 , 一旦检查出错误 , 所有人都可以清楚看到错误所在 。
话说回来 , 从长期来看区块链肯定能在这方面更进一步 。 进步的一个来源是 ZK-SNARKs(或称 “有效性证明”) , 是一种高效且可验证的密码学证明 , 使区块生产者能够向客户端证明区块满足某些任意复杂的有效性条件 。 有效性证明比欺诈证明更强大 , 因为它不依赖于交互博弈才能捕获欺骗行为 。 另一种重要技术是 “数据可用性检查” , 可以侦测出没有完全公开内容的区块 。 数据可用性证明确实依赖一些安全假设 , 但这个假设非常保守:网络中还存在少量可用的节点是诚实的(“愿意遵守协议”);好消息是 , 这个诚实验证者的最低数量要求很低 , 而且即使攻击者数量非常大也不怎么需要提高要求 。

时机与 51% 攻击
现在 , 我们来看看 “天然造成混乱” 的模式中最强大的后果:51% 攻击开始攻击自己 。 在当前许多社区中 , 如果发生 51% 攻击且攻击者取胜 , 那么 51% 攻击链就会成为合法链 。 这个规范被大家严格遵守 。 近期对以太坊经典的 51% 攻击就说明了这一点 。 攻击者回退了 3000 多个区块 , 在这个过程中用双花攻击窃取了 807,260 ETC 。 由于以太坊经典的两个客户端之一(OpenEthereun)技术上无法退回攻击链的历史高度 , 导致 Geth 节点能够在攻击链上运行 , 而 OpenEthereum 则只能被困在原本的链上 。


推荐阅读