以太坊与大多数其他(带有终局性的)权益证明系统的一个主要区别在于,以太坊力图支持极大数量的验证者:目前我们拥有 895,000 个验证者,Zipf 定律的分析表明,这相当于数以万计的独立的个体或实体。这样做的目的是为了支持去中心化,使普通人能够参与质押,而不需要每个人都放弃自己的行动能力并把控制权交给少数几个质押池之一。

然而,这种方法要求以太坊链在每个槽位处理大量的签名(今天约为 28,000 个;SSF 后为 1,790,000 个),这是一种非常高的负载。为了支持这种负载,必须做出许多技术上的牺牲:

· 它需要一个复杂的证明传播机制,其中证明被分割到多个子网之间,需要超级优化 BLS 签名操作来验证这些签名等等。

· 我们目前没有明确的、能够高效应对的量子抗性替代方案。

· 像视图合并这样的分叉选择修复变得更加复杂,因为无法提取单个签名。

· 对这么多签名进行 SNARK 处理很困难。Helios 需要在一个专门的额外签名上运行,称为同步委员会签名。

· 它要求一个槽内有三个子槽而不是两个,从而增加了安全最小槽时间。

签名聚合系统乍一看似乎合理,但实际上它产生了遍布整个系统的系统性复杂性。

此外,它甚至没有实现其目标。质押的最低要求仍然是 32 ETH,这对很多人来说是不可及的。仅从逻辑分析的角度来看,长期内让每个人在每个槽位都签名的系统,真正为普通人提供质押的目标似乎是不可行的:如果以太坊有 5 亿用户,其中 10% 参与质押,那意味着每个槽位有 1 亿个签名。从信息论的角度来看,在这个设计中处理惩罚至少需要每个槽位 12.5 MB 的数据可用空间,大致相当于全面分片的目标。也许是可行的,但要求质押本身依赖于数据可用性抽样是一个很大的复杂性增益。而且即便如此,参与质押的仅仅是全球人口中的 约 0.6%,而且还没有开始涉及验证这么多签名的计算问题。

因此,与其依赖密码学家创造魔法子弹(或者魔法防弹)来实现每个槽位中签名数量不断增加,我建议我们进行一次哲学性的转变:首先放弃对此类期望。这将极大地扩展权益证明设计空间,并允许大量技术简化,通过允许 Helios 直接在以太坊共识上进行 SNARK,使其更加安全,并通过使即使是像 Winternitz 这样无趣但长期存在的签名方案也变得可行来解决量子抗性问题。

为什么不「只使用委员会」?

许多面临这个确切问题的非以太坊区块链采用基于委员会的安全方法。在每个槽位期间,它们随机选择 N 个验证者(例如,N ≈ 1000),这些验证者负责最终确认该槽位。值得提醒的是,为什么这种方法不足够,因为它没有提供问责制。

为了了解原因,假设发生了 51% 的攻击。这可能是一次终态逆转攻击或审查攻击。为了进行攻击,您仍然需要经济参与者控制大部分股份,以在攻击中达成一致,即运行参与攻击的软件,并与最终被选为委员会的所有验证者一起参与攻击。数学上的随机抽样确保了这一点。然而,他们因此而受到的惩罚微乎其微,因为大多数同意攻击的验证者最终并未被选为委员会成员,因此未被看到。

目前,以太坊的做法完全相反。如果发生了 51% 的攻击,整个攻击验证者集合的大部分将被削减他们的押金。目前攻击的成本约为 9 百万 ETH(约 200 亿美元),并且假设网络同步中断以最有利于攻击者的方式进行。

我认为这是一个很高的成本,但这代价太高了,我们可以在这个问题上做出一些牺牲。即使攻击成本为 1-2 百万 ETH 也完全足够。此外,目前以太坊存在的主要中心化风险体现在一个完全不同的地方:如果最低押金金额降低到接近零,大规模的质押池的力量将减弱不了多少。

这就是为什么我提倡一个中庸的解决方案:在验证者责任上做一些牺牲,但仍然保持很高的总可削减 ETH 数量,作为交换,我们可以享受到较小验证者集的大部分好处。

在 SSF 下,每个槽位有 8192 个签名会是什么情况呢?

假设采用传统的两轮共识协议(就像 Tendermint 使用的协议,以及 SSF 无可避免地会使用的协议),每个参与的验证者每个槽位需要两个签名。我们需要解决这个现实,我看到有三种主要方法可以解决这个问题。

方法 1:全面采用去中心化的质押池

Python 之禅中包含一句非常关键的话:

There should be one-- and preferably only one --obvious way to do it.(应该有一种——最好只有一种——明显的方法来完成它。)

对于使质押变得平等的问题,以太坊目前违反了这个规则,因为我们同时在执行两种不同的策略以实现这一目标:(i)小规模的独立质押,和(ii)使用分布式验证器技术(DVT)的去中心化质押池。基于上述原因,(i)只能支持一些个人质押者;总是会有很多人的最低押金金额太大。然而,以太坊正在支付支持(i)的非常高的技术负担成本。

一种可能的解决方案是放弃(i),全力以赴(ii)。我们可以将最低押金金额提高到 4096 ETH,并设定总验证者上限为 4096 个(约 1670 万 ETH)。预期小规模质押者将加入 DVT 池:通过提供资本或成为节点运营者。为防止攻击者滥用,节点运营者角色需要以某种方式受到声望门槛的限制,各个池将通过在这方面提供不同选项来竞争。资本提供将是无需许可的。

我们可以通过设定惩罚上限(例如,为总提供押金的 1/8)使这个模型中的质押更加「宽容」。这将允许减少对节点运营者的信任,尽管由于概述的问题,值得谨慎对待。

方法 2:两层质押

我们创建两层质押者:一个「重」层,要求 4096 ETH 参与终态确认,和一个「轻」层,没有最低要求(也没有押金和提现延迟,没有削减的漏洞),增加了第二层安全性。为了使一个块终态确认,既需要重层终态确认,又需要轻层中至少 50% 的在线轻验证者证明。

这种异质性对于审查和攻击抵抗是有益的,因为为了攻击成功,需要同时腐化重层和轻层。如果一层被腐化而另一层没有,链将停止;如果是重层被腐化,可以对其进行惩罚。

这样做的另一个好处是,轻层可以包含同时用作应用程序内抵押的 ETH。主要的缺点是通过确立小规模质押者和大规模质押者之间的分歧,使质押变得不那么平等。

方法 3:轮换参与(即委员会但有问责制)

我们采取一种类似于在这里提出的超级委员会设计的方法:对于每个槽位,我们选择 4096 个当前活跃的验证者,并在每个槽位中仔细调整该集合,以便我们仍然具有安全性。

然而,我们在这个框架内做了一些不同的参数选择,以在其中获得「物有所值」。尤其是,我们允许验证者使用任意高余额参与,并且如果验证者的 ETH 数量超过一定数量 M(这将必须是浮动的),则他们在每个槽位中参与委员会。如果验证者有 N<M ETH,那么他们在任何给定的槽位中,都有 N/M 的概率参与委员会。

在这里我们有一个有趣的杠杆,即在激励目的上解耦「权重」与共识目的上的「权重」:委员会中每个验证者的奖励应该是相同的(至少对于使用 ≤M ETH 的验证者来说),以保持平均奖励与余额成比例,但我们仍然可以通过 ETH 加权计算委员会中的共识验证者权重。这确保打破最终性需要的 ETH 量等于委员会中总 ETH 的 1/3 倍以上。

一个粗略的 Zipf 定律分析会计算出这个 ETH 数量,如下:

· 在总余额的每个二次方级别,验证者的数量与该余额级别成反比,并且这些验证者的总余额将相同。

· 因此,委员会将有来自每个余额级别的等量 ETH 参与,除了超过障碍 M 的级别,其中验证者始终在委员会中。

这种方法的主要缺点是在协议中随机选择验证者的复杂性略有增加,以便我们可以在委员会更改的情况下获得共识安全性。

主要优点是它以一种可识别的形式保留了独立质押,保持了一个单一类别系统,甚至允许将最低押金金额降低到非常低的水平(例如 1 ETH)。

结论

如果我们确定在 SSF 协议后,要坚持使用 8192 个签名,这将使技术实施者以及轻客户端等侧基础设施的构建者的工作变得更加容易。任何人都可以更轻松地运行共识客户端,用户、质押爱好者等人可以立即根据这一假设进行工作。以太坊协议的未来负载不再是未知的:未来可以通过硬分叉进行提升,但只有当开发人员确信技术已经足够改进,能够在相同轻松的水平上处理每个槽位更多的签名。

剩下的工作将是决定我们要采用上述三种方法中的哪一种,或者可能是完全不同的方法。这将是一个我们对哪些权衡我们感到满意的问题,特别是我们如何处理液体质押等相关问题,这可能可以与现在变得更加容易的技术问题分开解决。