一群天才程序员费时费力搞这个, 为啥?
作者 | Raul Jordan
编译 | Jhonny
很多文章都在讨论以太坊 2.0的路线图、研究提案及其发展现状。然而有关以太坊2.0内部运行背后的设计原则和不变量的文章却不多。
对于以太坊2.0这样一场需要协调并耗时数年的重大变革来说，其成功的关键在于需要一组明确的不变量 (invariants) 并要求实施者 (implementers) 与以太坊的哲学理念保持一致。本文将解释其中一些设计决策、相关背景以及为何这些设计对于以太坊2.0协议的未来至关重要。
自以太坊网络诞生以来，将以太坊从 PoW 转换为 PoS 协议的动机就在不断演化。当时 Vitalik Buterin 正在探索一种可行的解决方案，以克服单纯的 PoS 协议存在的缺陷，从而提供比 PoW 更强大的安全保障。具体来说，Vitalik 和以太坊研究团队设计了一种称为 slasher (罚没) 的机制，用以在 PoS 协议中惩罚恶意攻击者并罚没他们的存款 (Buterin 2018)。
之后 Vlad Zamfir 加入了以太坊项目，2014年的大多数工作都集中在解决已知的针对 PoS 的远程攻击 (long-range attack)。
当攻击者轻易地从头开始搭建一条比当前的规范链更长的链，并导致网络中的其他参与者认可新链的状态时，这就是远程攻击。
这种情况几乎不可能在比特币或以太坊等 PoW 链上发生，因为这需要整合大量的计算能力。然而，由于 PoS 机制并不依赖于计算能力，因此在遭遇这种攻击时会导致网络崩溃 (Zamfir 2014)。
Vitalik Buterin 和 Vlad Zamfir 一致认为，除了严格地阻止客户端同步一条超过某个 checkpoint (检查点) 的链之外，没有其他可行的抵御远程攻击的解决方案 (Buterin 2018)。
这种方法意味着，网络中的新节点只需要从那个最新的、由网络中的其他节点认可为“finalized”的“checkpoint”开始同步，而不是从创始区块开始同步。也就是说，当新的节点加入到网络中时，新节点对旧节点存在固有的信任。这种现象被称为 PoS 的弱主观性 (weak subjectivity)。当新节点加入网络中时，对在网络所有参与者中已经被“finalized”且不可篡改的区块存在主观信任 (subjective trust)。
在那段时间，Vitalik Buterin 和以太坊基金会的 Virgil Griffith 都致力于在 ArXiV (https://arxiv.org/abs/1710.09437) 网站上发布最初版的 Casper Proof of Stake 白皮书。2014至2017年这段很长的时间，以太坊试图在当前运行 PoW 机制的以太坊主链之上覆盖一个基于 PoS 机制的最终性系统 (a PoS based finality system)。与此同时，以太坊开发者们也致力于实现状态分片 (state sharding)，将之作为扩展以太坊网络的方案。
而到了2018年时，这两项规划都得到了重大的推进，且2018年3月份在台北的一场标志性研究聚会之后，以太坊研究团队提议将 Casper Proof of Stake 和 Sharding 合并到一项称为以太坊 Serenity (也即以太坊2.0) 的发展方案中。
为何要推出以太坊2.0？
本文旨在解释“为何要推出以太坊2.0？”这一核心问题背后的设计理念。
当然，对当前以太坊 PoW 链的共识协议和数据完整性进行全面变革并不是通过仅仅一次硬分叉就能够轻易实现的--重新开始搭建一个全新的系统并将当前的以太坊1.0链完全地摒弃，这不是更容易吗？
在搭建以太坊2.0时，我们遇到的一个难题就是需要让以太坊社区参与到这场挑战中来，并让社区成员清楚地了解过渡到以太坊2.0背后的巨大益处和需求。在了解了伴随这种范式转换而来的巨大责任之后，现在是构建以太坊2.0的绝佳时机。
不管我们是否愿意承认，当前区块链和加密货币依旧处于襁褓阶段，并且我们今天所做的决定将推动区块链和加密货币在未来多年的加速增长和采用。在转向 PoS 机制方面，我们已经等待了足够长的时间，以太坊应用亦是如此。当前已到了构建以太坊2.0的最佳时间，相关团队也做好了相应的准备。
前方的挑战
单纯的 Layer 1 扩展可能会付出巨大的安全性代价，因为对区块链进行分片会使得无法对交易进行全局性验证 (global transaction verification，也即网络中的所有矿工 (除了恶意攻击者之外) 都会致力于对所有交易进行确认，所有矿工的算力保证了整条链的安全。而分片则意味着某条分片链中的交易只由整个网络中的一部分验证者进行验证 (因为整个网络中的验证者会被分配到各个分片链中负责交易验证)，如此一来，单条分片链的安全性就比整条链的更低)；当前的比特币和以太坊就能够对交易进行全局性验证，从而保证了整个网络的安全。
关键的问题是：我们如何在不牺牲去中心化和安全性的同时获取扩展性呢？以太坊的很多竞争性区块链平台 (如 EOS) 选择走中心化的路线来解决这一问题。而以太坊选择了一种不同的方式，即将网络的状态划分到1024条并行运行的分片链之中，每条分片链都由统一由一条称为信标链 (beacon chain) 的根链进行协调。
信标链运行完全的 Casper PoS 机制，整个体统中不存在 EOS 那样的代理或中心化的投票权。在这种方式中，每个节点只需要负责处理整个网络中所有交易的一部分，且很多区块可以并行处理交易，这就线性增长了整个网络的吞吐量。
以太坊2.0规范试图回答以下问题：
如果没有对交易进行全局性验证，那网络的安全性将会受到什么影响呢？应该如何选择验证的参与者同时阻止验证垄断的出现呢？应该如何设计激励措施，以最大限度地提高数据可用性和参与的积极性?
在经过多年的研究、探索和理解需要做出的权衡之后，以太坊探索着将 PoS 作为其共识算法的选择。出于文本中讨论的原因，验证者是一定能够获得奖励的，同时验证实体 (个人或企业) 在 Casper PoS 协议中享有平等的待遇，在参与到验证者委员会并获得奖励/处罚方面有着均等的概率。
交易的全局性验证转变成了间接性验证：每条分片链中的每笔交易都将首先由该分片中的验证者进行验证，该分片的验证者会将检查点 (checkpoints) 提交至信标链中，信标链在以太坊2.0中扮演着各分片链的“协调者”角色。
以太坊2.0设计的不变量
协议设计的一个关键支柱就是理解该协议将在哪些不变量下运行。
对于以太坊及其开发者社区来说，存在一个不可修改的设计决策对于以太坊2.0的未来发展是至关重要的。我们可以将以太坊2.0的核心分为以下几个要点：
1、无需许可性
以太坊2.0与其他“下一代”区块链平台的显著区别就在于如何参与共识。
以太坊2.0中称为验证者的唯一要求就是需要持有 32 枚 ETH。在以太坊2.0系统中，不存在代理，没有用于选择验证节点的投票，也没有决定谁能参与验证的中心化机构。更重要的是，每个实体参与进来的硬性要求是质押 32 ETH，这使得以太坊2.0中的验证者都得到了平等的对待。
然而，任何个人都可能拥有对个验证者身份 (也即持有大量 ETH 的用户在多个客户端中进行质押，并拥有多个验证者身份)。这只是一项简化共识协议的安全性和简洁性的决策。从激励设计的角度来说，在对区块进行投票验证时，平等地对待所有参与者是非常重要的，这对于形式化建模 (formal modeling) 也是很重要的。1名验证者=质押 32 ETH，不能多也不能少。
其他的区块链平台往往通过采取一种更为中心化的方式来进行交易验证，以此来解决扩展性问题；但对于以太坊而言，这并不是其考虑的选项。
2、保持简洁性，但具有最大程度的表达性
以太坊2.0在其核心定义和实现目标方面力求简洁紧凑。在基础层面，以太坊2.0是一个用于搭建去中心化应用的可扩展、无需许可平台，
在以太坊2.0系统中，没有必要引入应用程序逻辑，这是有原因的。我们可以将以太坊2.0系统类比成 Linux 系统的内核 -- 并不应该由操作系统本身来决定应该包含某些特性或设想其用例，而是应该由为系统内核搭建应用的开发者来决定。
3、保证安全性
以太坊2.0的 PoS 模式 -- Casper the Friendly Finality Gadget -- 在一系列的激励措施下运行，旨在保持高度的活力和网络参与。以太坊2.0通过 Casper 进行扩展并利用其特征来保护整个分片链网络的安全性。也就是说，以太坊2.0通过使用链最终性阈值的概念来保证系统中的 1024 条分片链与信标链共享安全性。
PoS 的前提是，验证者在按预期执行被分配的验证工作之后就能够获得奖励，或者因为处于离线状态而小损失部分质押金，亦或者如果验证者恶意违反协议时受到严重的惩罚 (质押金被罚没)。
虽然这一前提很简洁，但相关的细节是决定成败的关键。一旦我们意识到不仅要考虑每个验证者的行为，同时还要考虑所有验证者委员会的行为时，Casper 经济学很快就变得更加复杂。
通常对于 PoS 链的一个开放性问题是：应该何时惩罚恶意行为，以及应该如何根据行为的严重程度来相应地对验证者进行惩罚 (严重程度不同，惩罚也应不同)。也就是说，我们需要找到一个足够全面的惩罚措施，既能涵盖所有的极端情况，又能保持简洁性。
由于协议依赖于验证者的活动，协议的运行也依赖于持久的时间尺度，可能会出现诚实的验证者下也无法参与验证的情况。诚实的验证者可能因为断电、网络故障或其他原因而离线，但我们需要明确地将离线惩罚和恶意行为惩罚区分开来。
以太坊2.0的部分设计原理是使任何企图破坏协议的攻击者付出巨大的成本代价。也就是说，在其他区块链平台上发生的51%攻击，在以太坊2.0链上将需要付出巨大的成本，甚至会带来相反的效果。也即逆转协议中的最终性将使得攻击者对于其他诚实地验证者非常显而易见，从而允许社区协调一致地通过软分叉来将该恶意攻击者移除出去，使其攻击变得无效。
基于 PoS 机制的系统的另一个限制就是验证者的困境，也即系统中的验证者过于懒惰 (离线状态)，一味地相信协议中的其他验证者将会以正确的方式进行区块验证，因此这些懒惰的验证者玩忽职守。这些验证者通过不执行他们的验证职责，从而节省带宽或一般的计算需求，除非他们面临重大的惩罚。针对这种情况，可以通过在网络中增加针对数据缺失或错误的签名信息而设置的非常严重的惩罚和挑战机制，以此来缓解这种问题。
以太坊2.0的验证者激励措施
以太坊2.0的验证者激励措施如下：
1、验证者离线：Quadratic Leak
以太坊2.0依赖于拜占庭容错阈值，也即必须保证网络中 2/3 的验证者是诚实的验证者。
针对不参与验证的验证者的惩罚称为 “inactivity leaks”。如果某条分片链在超过4个 epoch 期间没有得以敲定，那该协议对验证者的奖励将变得尽可能严格，也即最大的预期奖励将是0，因此验证者需要正确地进行验证操作，否则将受到更多的惩罚。惩罚程度的大小将与上一次链实现最终性以来的时间成正比 (也即距离上一次的最终性的时间越长，受到的惩罚就越大)，以此来组织验证者离线。
注：在以太坊2.0阶段，每生成64个区块(大约需要6.4分钟，称为一个epoch)，信标链将重新打乱验证者并将他们重新分配到所有的分片链中。
验证者离线的时间越长，这种惩罚就会呈指数级增长。这种惩罚称为“quadratic leak”，这种惩罚机制的设计初衷是：短期的离线状态将不会受到惩罚，但离线较长一段时间将为验证者带来很大的不利影响，这能够很好地将预期的现实情况考虑进去。这种惩罚所损失的资金将被销毁，而不是分发给其他的诚实验证者。
2、故意的恶意行为：罚没 (slashing)
在针对以太坊 PoS 的早期提案中，恶意的验证者将受到称为 slashing (罚没) 的巨大惩罚，通常这些机制仅仅讨论了针对单独的个人恶意验证者的惩罚，而没有讨论验证者串谋起来的严重性。只有当很大一部分验证者协同对网络进行恶意操作时，网络才会受到影响。
根据拜占庭式容错，对恶意行为者的惩罚将是在一定时间间隔内也进行恶意行为的验证者数量的3倍。这有助于惩罚大量协同的攻击行为，同时也阻止恶意验证者聚集在一起。也就是说，对于验证者来说，联合起来对网络发起攻击是非常不利的。
罚没 (slashing) 是通过一个揭发机制来实现的，也即验证者能够通过发现其他验证者的可罚没攻击行为来获得奖励，作为报酬能够获得其他验证者被罚没的资金。
3、验证者奖励
根据 Vitalik Buterin 的以太坊 Serenity 设计原理 ，
https://notes.ethereum.org/s/rkhCgQteN
他概述了每名验证者在每个 epoch 时间段内 (每生成 64 个区块称为一个 epoch) 获得的基本奖励的4个明确组成部分：
此外，根据正确参与验证的验证者数量，在这个基本奖励之上还有其他额外的奖励。这一额外的奖励用于激励验证者进行正确操作，共同地推动了网络中的诚实活动。奖励的发放时间表应该是一直且直接的。增加其他更多的复杂性将使整个系统更易于出错，从宏观经济的角度来看也更难以理解。
将协议的复杂性与应用的复杂性区别开来
可以说，以太坊2.0的路线图是一项将历时多年且最具雄心的计划之一，该计划从整个区块链领域吸取了经验教训并创建了一个能够很好地解决扩展性三难困境的协议，该协议将能够持久运行下去。
有关分片将如何有效地增加开发者体验已经存在很多的讨论。其基本依据是，在以太坊2.0协议的设计中不考虑应用开发者的需求是非常困难的，因为分片链的高度复杂系统要求各分片需要彼此交互 (跨分片通信)。
乍看之下，这种观点说得通，因为从外部看来以太坊2.0非常令人生畏，且在以太坊2.0中有关智能合约执行方面依旧存在很多的不确定性。但实际上，事实要微妙地多。
应用开发者将只需要了解以太坊2.0协议的一小部分就够了。普通的智能合约开发者是不需要了解验证者注册表 (validator registry) 或者信标链的最终性小工具的内部构造的。
因此，阶段0 (信标链阶段) 完全从应用层中移除了。最近阶段1和阶段2也提出了一些非常有力的提案，这些提案建议对执行环境进行更高程度的抽象化 (abstraction)，这使得以太坊2.0变得更加强大和更为简洁。
最坏的情况下是，钱包/应用开发者需要了解跨分片交易的某些细节，以便通过一些技巧显示即时交易结算。今天的计算机操作系统和内部结构比10年前复杂得多，但是大多数应用程序开发人员并不需要理解那些使计算机构架变得强大的隐藏内部构造。将这两者区分开来是优秀的架构设计的核心，我们也可以将之当成在搭建以太坊2.0时需要记住的一个设计不变量。
构建一台真正的世界计算机
总结而言，以太坊是图灵完备的，这意味着以太坊能够以当前计算机相同的方式运行任何类型的代码，尽管它尚且是一台缓慢、单线程的计算机。
今天的以太坊类似于早期的弱处理器。当前在以太坊上运行应用程序是昂贵的，因为该协议内置了一些机制，用于阻止困扰诸多公共事业的公地悲剧。
以太坊充满活力的开发者社区从未停止过对当前网络的创新，无论是其核心层 (Layer 1) 还是 Layer 2。从治理的角度来说，以太坊未来计划的升级并不会一路平坦毫无挫折。如果未来以太坊2.0上线了几年之后，我们感到收到约束并希望搭建以太坊3.0，那也意味着我们在前者的核心设计方面的失败。
可升级性 (upgradeability) 应该以一种不需要通过有风险的硬分叉才能实现的方式才融入到协议中。也就是说，一旦系统长期处于运行中，Layer 1 层面的创新应该保持最小甚至为零的状态。
我们还有很长的路要走，但是我们通过谨慎地提醒自己为何要搭建这个软件，以及我们希望以太坊在未来10年内走向何方，我们也就可以编写能够经受住时间考验的、更具鲁棒性的代码。