哲学|Vitalik:区块链“验证”的哲学


区块链最强大的特性之一 , 就是可独立验证区块链执行的每个部分 。 即使大多数区块链矿工被攻击者接管 , 但如果该攻击者试图推送无效区块 , 网络也可以简单地拒绝它们 。 即使是某些时间段未验证区块的那些用户 , 也可以获得验证用户的警告 , 此时他们可检查攻击者的链是否无效 , 并自动拒绝它 , 然后协调接受遵循规则的区块链 。
但我们实际上需要多少验证呢?我们需要100个独立的验证节点 , 还是1000个?我们是否需要一种文化 , 使得全世界的普通人都能运行检查每笔交易的软件?这些问题是一个挑战 , 尤其是当我们要构建一个比“中本聪”最初创建的工作量证明共识机制更好的区块链 , 那解决上面这些问题就显得非常重要 。
为什么需要验证?
有两个主要原因可以解释 , 为什么用户去验证区块链是有益的 。
1、首先 , 它最大限度地提高了节点能够正确地确定 , 并辨识规范链的机会 。 通常 , 规范链被定义为“拥有最多矿工/验证者支持的有效链” 。 而无效链会被定义拒绝 , 如果在多个有效链之间进行选择 , 那么从矿工/验证者那获得最多支持的区块链就会获胜 。 因此 , 如果你有一个节点来验证所有的有效条件 , 从而检测出哪些链是有效的 , 哪些链是无效的 , 那你就可以最大限度地检测出规范链到底是什么 。
2、验证区块链是有益的 , 还有另一个更深层次的原因 。 假设一个强大的参与者试图对协议发起更改 , 并且其得到了大多数矿工的支持 。 如果没有其他人验证这条链 , 那么这种攻击就很容易成功:每个人的客户端都会默认地接受新链 , 当任何人看到发生的事情时 , 将由持不同意见者来协调对这一区块链的拒绝 。 但是 , 如果普通用户正在进行验证 , 那么协调问题就落在另一面:现在 , 无论是谁试图更改协议 , 都有责任说服用户主动下载软件补丁 , 以接受协议更改 。
如果有足够多的用户在验证 , 那么一个有争议的协议更改尝试 , 将默认为混乱 , 而不是默认为胜利 。 默认混乱仍然会造成很多混乱 , 这需要社区协调来解决 , 但它在攻击者面前设置了一个更大的障碍 , 它大大降低了攻击者的信心 , 从而降低其试图发动攻击的积极性 。 如果大多数用户正在验证 , 而攻击只获得了大多数矿工的支持 , 那么攻击将完全默认为失败 , 这会是所有攻击中最好的结果 。
请注意 , 这种推理与我们经常听到的另一种推理方式截然不同:根据“定义” , 改变规则的链在某种程度上不是正确的链 , 而且不管有多少其他用户接受一些新规则 , 重要的是你个人可以继续使用你喜欢的旧规则 。
以下是Gavin Andresen提出的“按定义”视图的一个示例:
下面则是来自Wasabi 钱包的另一个示例 , 从解释全节点为何有价值的角度来看 , 这一点更为直接:

哲学|Vitalik:区块链“验证”的哲学
本文插图
请注意此视图的两个核心组件:
1、根据定义 , 不接受你认为基本、不可协商规则的链不是比特币 , 而不管有多少人接受这条链 。
2、重要的是 , 你要留在一条你认为有可接受规则的区块链上 。
然而 , 我认为这种“个人主义”的观点是非常错误的 。 为了了解原因 , 让我们看看我们所担心的场景:绝大多数参与者接受了协议规则的某些更改 , 而这些改变是你所无法接受的 。 例如 , 设想一个交易费用非常低的未来 , 为了保证区块链的安全 , 几乎所有其他人都同意修改一套增加发行量的新规则 。 然后你顽固地继续运行一个执行旧规则的节点 , 并且分叉到与大多数节点不同的区块链上 。
从你的角度来看 , 你仍然可以将币放在可接受规则下运行的系统中 。 但是那又怎样呢?其他用户将不会接受你的币 , 交易所将不接受你的币 , 公共网站可能会显示新币的价格 , 但他们指的是大多数人接受的那条链 , 而你的币是没有价值的 。分页标题
本质上 , 加密货币和区块链是社会结构 , 如果没有人相信它们 , 那它们就毫无意义 。

哲学|Vitalik:区块链“验证”的哲学
本文插图
那么 , 另一种观点是什么呢?其核心思想是通过协调问题将区块链视为工程安全 。
通常情况下 , 我们遇到的协调问题不会是什么好事:对于大多数人来说 , 如果英语能摆脱其高度复杂和不规则的拼写系统 , 或者如果美国改用公制 , 或者如果经济衰退时我们可以立即把所有的物价和工资降低10% , 那么在实践中 , 这需要所有人同时就转换达成一致意见 , 而这通常是非常困难的 。
然而 , 在区块链应用中 , 我们可利用协调问题来发挥自己的优势 。 我们正在利用协调问题造成的摩擦 , 以作为防止中央集权行为者渎职的一道屏障 。 我们可以构建具有属性X的系统 , 并且我们可以保证它们将保留属性X , 因为将规则从X更改为非X , 需要一大堆人同意同时更新他们的软件 。 即使有一个参与者可以强制改变 , 这样做也很困难 。
注意 , 这个观点会带来一个特别的结果:全节点的目的并不是为了保护你 , 在有争议硬分叉的情况下 , 拥有全节点的人是安全的 , 而没有全节点的人是容易遭受攻击的 。 相反 , 这里的观点更多的是群体免疫:验证的人越多 , 每个人就越安全 , 即使只有一部分人在验证 , 每个人都会因此得到高水平的保护 。
2 深入研究验证
【哲学|Vitalik:区块链“验证”的哲学】现在我们进入下一个主题 , 这个主题与轻客户端、分片等主题非常相关:通过验证 , 我们实际上实现了什么?为了理解这一点 , 让我们回到前面的一点 , 如果攻击发生了 , 我认为攻击的发生方式具有以下优先顺序:
默认为失败&gt默认为混乱&gt默认为胜利
这里的“&gt”当然是“优于” 。 最好的情况是攻击完全失败 , 其次是攻击导致混乱 , 每个人都不同意正确的链是什么 , 而最糟糕的则是攻击成功 。 为什么混乱要比胜利好得多?这是一个动机问题:混乱增加了攻击者的成本 , 并降低他们肯定会获胜的确定性 , 因此从一开始就阻止了攻击的企图 。 默认为混乱环境 , 意味着攻击者除了要赢得51%算力竞争 , 还需要说服社区跟随 , 这要比简单发起51%攻击要困难地多 , 也没有那么吸引人 。
验证的目标是从默认胜利改为默认失败 , 或者默认混乱 。 如果你们都有一个全验证节点 , 并且攻击者试图推行一条具有不同规则的链 , 则攻击就会失败 。 如果有一些人有一个全验证节点 , 而其他人没有 , 那么攻击会导致混乱 。 但现在我们可以思考:有没有其他方法可以达到同样的效果?
3 轻客户端和欺诈证明
在这方面 , 一个自然的发展是带有欺诈证明的轻客户端 。 目前存在的大多数区块链轻客户端的工作原理 , 是验证大多数矿工支持的特定区块 , 而不必费心检查其他协议规则是否正在实施 。 客户端基于大多数矿工是诚实的信任假设运行 。 如果发生了一次争议分叉 , 则默认情况下 , 客户端会遵循多数链 , 如果用户希望遵循旧规则 , 则由用户采取积极的措施 。 因此 , 今天受到攻击的轻客户端会默认承认攻击是成功的 。 但有了欺诈证明技术 , 情况就开始不太一样了 。
欺诈证明最简单的形式如下 。 通常 , 区块链中的单个区块只触及区块链“状态”的一小部分 。 如果一个全验证节点处理一个区块 , 并发现它是无效的 , 则它们可生成一个package包 。 它们把这个package包广播给轻客户端 。 然后 , 轻客户端可以获取package包并使用该数据来验证区块本身 , 即使它们没有来自区块链的其他数据 。

哲学|Vitalik:区块链“验证”的哲学分页标题
本文插图
这种技术有时也被称为无状态验证:客户端可以只保留区块头 , 而不是保留完整的区块链状态数据库 , 它们可通过向其他节点请求区块验证正在访问的任何所需状态项的Merkle证明来实时验证任何区块 。
这种技术的强大之处在于 , 轻客户端只有在听到警报时才可以验证单个区块 。 因此 , 在正常情况下 , 轻客户端仍然是轻客户端 , 它们仅检查大多数矿工/验证者支持哪些区块 。 但在那些例外情况下 , 多数链包含轻客户端不会接受的区块 , 只要至少有一个诚实节点来验证欺诈区块 , 该节点就会发现它是无效的 , 然后在它广播欺诈证明后 , 网络的其余部分就会拒绝它 。
4 分片
分片是这一点的自然延伸:在分片系统中 , 系统中的事务太多 , 大多数人无法一直直接验证 , 但如果系统设计良好 , 则可以检测到任何单个无效区块 , 并用欺诈证明证明其无效 , 这个证明可以在整个网络上传播 。 一个分片网络 , 我们可概括为每个人都是一个轻客户端 。 而且只要每个分片有一定的最小阈值参与者数 , 网络就具有群体免疫性 。
此外 , 在分片系统中 , 区块生产是高度可访问的 , 甚至它可以在普通的笔记本电脑上完成 , 这一事实非常重要 。 网络核心不依赖高性能硬件 , 这使得多数人驱动的协议变更 , 更难以“默认获胜” 。
这就是可审计性在现实世界中的含义:不是每个人都一直在验证所有事情 , 而是每个特定部分都有足够的眼睛 , 如果有错误 , 它将被发现 , 以及检测到一个错误 , 则所有人都清楚可见 。
也就是说 , 从长远来看 , 区块链肯定可以在这方面有所改进 。 一个特别的改进来源是ZK-SNARKs:有效可验证的密码学证明 , 允许区块生产者向客户端证明区块满足某些任意复杂的有效性条件 。 有效性证明比欺诈证明更强大 , 因为它们不依赖于交互式游戏来捕获欺诈 。 另一重要技术是数据可用性检查 , 它可防止数据未完全发布的数据区块 。 数据可用性检查确实依赖于一个非常保守的假设 , 即在网络的某个地方至少存在少量诚实节点 , 好消息是 , 这个最小诚实阈值很低 , 并且即使存在大量攻击者也不会增长 。
5 时间和51%攻击
现在 , 让我们来了解下“默认为混乱”思维方式最糟糕的后果:自行进行51%攻击 。 目前很多社区的标准是 , 如果一次51%攻击成功 , 那么发生51%攻击的区块链必然会成为有效链 。 这一标准经常被严格遵守 , 最近发生的ETC 51%攻击就很好地说明了这一点 。 攻击者恢复了3000多个区块 , 结果是 , Geth节点使用了攻击者的区块链 , 而OpenEthereum节点仍然保留在原始链上 。
我们可以说 , 这次攻击实际上是默认混乱 。 不幸的是 , ETC社区随后选择接受攻击链作为规范链 , 这一举动被eth_classic描述为“遵循预期的工作量证明” 。 因此 , 社区规范积极帮助攻击者获胜了 。
但我们可以设想一个规则 , 一旦客户端接受了一个区块作为规范链的一部分 , 并且该区块有超过100个后续区块 , 那么客户端从此将不再接受不包含该区块的区块链 。 或者 , 在具有最终确定性的权益证明设置中 , 想象一个规则 , 一旦完成一个区块 , 就永远无法还原 。
5个区块还原限制仅用于说明目的 , 实际上 , 限制可能会更长 , 例如100-1000区块 。
明确地说 , 这对规范性的确定方式带来了一个重大改变:客户端不再只查看它们自己接收到的数据 , 客户端还会查看数据是何时收到的 。 这引发了由于网络延迟而导致客户端不同意的可能性:如果由于一次大规模攻击而同时完成两个冲突的区块A和B , 有些客户端首先看到了区块A , 而有些客户端首先看到了区块B , 该怎么办?但我会说这很好:这意味着 , 尝试恢复交易的51%攻击不会默认为胜利 , 而是默认为混乱 , 而带外应急响应 , 则可以帮助选择正确的链 。分页标题
如果协议设计得很好 , 强制升级到带外应急响应 , 应该是非常昂贵的:在权益证明中 , 这样做需要1/3的验证者牺牲他们的存款并遭到罚没 。
有可能 , 我们可以扩展这种方法 。 我们可以尝试让51%审查交易攻击也默认为混乱 。 对及时性检测器的研究 , 进一步推动了所有类型的攻击都默认为失败方向 , 尽管由于时间检测器不能帮助那些连接不好且在线的节点 , 因此仍然存在一些混乱 。
对于一个重视不变性的区块链社区来说 , 实施这种还原限制可以说是上乘之选 。 很难诚实地宣称区块链是不可变的 , 无论一笔交易在一条区块链中被接受了多长时间 , 总有可能有一些强大参与者的意外活动出现 , 并将其还原 。 当然 , 我会声称 , 即使是BTC和ETC , 也已经在极端情况下设置了还原限制 。 如果发生的攻击使活动恢复了数周 , 则社区可能会采用用户激活软分叉来拒绝攻击者的区块链 。
结论
首先 , 如果我们接受社会协调的合法性 , 并且接受涉及“ 1-of-N”信任模型的间接验证合法性 , 那么我们可以创建可扩展性更高的区块链 。
其次 , 客户端验证对于所有这些工作都至关重要 。 只有少数人运行节点 , 而其他人依赖这些节点的网络 , 很容易被特殊利益集团接管 。 然而 , 避免这样的命运并不需要走到相反的极端 , 即无需让所有人总是验证一切!允许单独验证每个区块的系统 , 因而用户只在其他人发出警报时验证区块 , 这是完全合理的 , 并具有相同的效果 , 但这需要接受验证的“协调视图” 。
第三 , 如果我们允许规范性的定义 , 包括时间 , 那我们将为提高拒绝51%攻击的能力打开很多大门 。 最容易获得的属性是弱主观性:这种想法是 , 如果客户端需要至少每3个月登录一次 , 并且拒绝恢复时间超过这个时间 , 那么我们可以在权益证明中添加罚没规则 , 使得攻击变得昂贵 。 但我们可以走得更远:我们可以拒绝恢复最终区块的链 , 从而保护不变性 , 甚至可以防止审查 。 因为网络是不可预测的 , 依赖时间确实意味着攻击在某些情况下“默认为混乱” , 但好处是非常值得的 。
考虑到所有这些想法 , 我们可避免 过度中心化 , 过度冗余的验证导致效率低下 , 以及错误的规范意外地使攻击变得更容易 , 并更好地构建更具弹性、性能以及安全的区块链 。