这将使技术实施者的工作变得更加容易,以及轻客户端等辅助基础设施的构建者。
撰文:Vitalik Buterin,ethresearch
编译:松雪,
以太坊和大多数其他(最终确定性)权益证明系统之间的主要区别在于,以太坊试图支持非常多的验证器对象:我们目前有 895,000 个验证器对象,简单的 Zipf 定律分析表明这对应于数万个验证器对象是独特的个人 / 实体。 这样做的目的是支持去中心化,甚至允许普通个人参与质押,而不要求每个人放弃自己的代理权并将控制权交给少数质押池之一。
然而,这种方法要求以太坊链每个时隙处理大量签名(今天约为 28,000 个;SSF 后为 1,790,000 个),这是一个非常高的负载。 支持此负载需要做出大量技术牺牲:
- 这需要一个复杂的证明传播机制,涉及将证明分割到多个子网之间,需要对 BLS 签名操作进行超优化以验证这些签名等等。
- 我们没有一个明确的可替代、足够高效的抗量子的方案。
- 类似视图合并的分叉选择修复变得更加复杂,因为无法提取单个签名。
- 对签名进行 SNARK 处理是困难的,因为它们的数量很大。Helios 需要在一个专用的额外签名上操作,称为同步委员会签名。
- 它通过要求一个时间槽中有三个子时间槽而不是两个,增加了安全最小时间槽。
签名聚合系统乍看起来是合理的,但实际上它创建了系统性复杂性,这种复杂性渗透到各个方面。
更何况,它甚至没有达到自己的目的。 质押的最低要求仍然是 32 ETH,这对很多人来说是遥不可及的。 而仅仅从逻辑上分析,从长远来看,让每个人都签到的系统真正为普通人提供质押似乎是不可行的:如果以太坊有 5 亿用户,其中 10% 的用户进行质押,那么 这意味着每个插槽有 1 亿个签名。 从信息理论上讲,此设计中的处理削减需要每个插槽至少 12.5 MB 的数据可用空间,大致与完整 daksharding 的目标一样多(!!!)。 也许是可行的,但要求质押本身依赖于数据可用性采样会带来很大的复杂性增益——即使这只是世界人口质押的约 0.6%,而且还没有开始涉及验证这么多签名的计算问题。
因此,与其依赖于密码学家创造魔法子弹(或魔法防弹衣),以使每个时间槽中的签名数量不断增加成为可能,我建议我们进行一次哲学转变:从一开始就放弃对此类期望。这将极大地扩展 PoS 设计空间,并允许进行大量技术简化,通过允许 Helios 直接在以太坊共识上进行 SNARK 处理,使其更加安全,并通过使即使是像 Winternitz 这样无聊而存在已久的签名方案也能够可行来解决量子抗性问题。
为什么不「只用委员会」呢?
许多面临这一确切问题的非以太坊区块链使用了一种基于委员会的安全方法。在每个时间槽中,它们随机选择 N 个验证者(例如,N 约等于 1000),这些验证者负责完成该时间槽。值得提醒的是,为什么这种方法不足够:它缺乏问责制。
为了理解其中的原因,假设发生了一次 51% 攻击。这可能是一次最终性逆转攻击或审查攻击。要发动攻击,仍然需要控制大部分质押的经济参与者同意进行攻击,即运行参与攻击的软件,与所有最终被选为委员会的验证者一起参与攻击。随机抽样的数学保证了这一点。然而,他们为这样的攻击承担的惩罚很小,因为大多数同意攻击的验证者最终没有被看到,因为他们没有被选为委员会成员。
目前,以太坊采取了相反的极端。如果发生 51% 攻击,整个攻击验证器集合的大部分都会被削减质押。目前攻击的成本约为 900 万 ETH(约合 200 亿美元),并且这假设网络同步以最大程度地有利于攻击者的方式中断。
我认为这是一个高昂的成本,而且是一个过高的成本,我们可以在这个问题上做出一些牺牲。即使攻击成本为 1-2 百万 ETH 也完全足够。此外,以太坊目前存在的主要中心化风险在一个完全不同的地方:如果最低质押金额降低到接近零,大规模的质押池的实力差异将不会太大。
这就是为什么我主张一个温和的解决方案:在验证者的问责制上做出一些牺牲,但仍然保持可削减的 ETH 总量相当高,作为交换,它给我们带来了较小验证者集合的大部分好处。
在 SSF 下,每个时间槽的 8192 个签名会是什么样子呢?
假设采用传统的两轮共识协议(类似 Tendermint 使用的协议,以及 SSF 不可避免地会使用的协议),每个参与的验证者每个时间槽需要两个签名。我们需要绕过这个现实。我看到三种主要方法,我们可以这样做。
方法一:全力投入去中心化质押池
Python 有一句非常关键的话:
应该有一种——最好只有一种——明显的方法来做到这一点。
对于质押平等化的问题,以太坊目前违反了这一规则,因为我们同时执行两种不同的策略来实现这一目标:(i)小规模单独质押,以及(ii)使用分布式验证器技术(DVT)的去中心化质押池 。 由于上述原因,(i) 只能支持部分个人质押者; 总会有很多人的最低存款额太大。 然而,以太坊正在为支持(i)付出非常高的技术负担成本。
一种可能的解决方案是放弃(i)并全力投入(ii)。我们可以将最小质押金额提高到 4096 ETH,并设定 4096 个验证者的总上限(约 1670 万 ETH)。预计小规模质押者将加入 DVT 池:要么通过提供资金,要么成为节点运营商。为了防止攻击者滥用,节点运营商角色需要以某种方式受到声望的限制,并且池之间将通过在这方面提供不同的选择来竞争。提供资金将是无许可的。
我们可以通过限制处罚来使该模型中的集合质押更加「宽容」,例如。 至所提供质押总数的 1/8。 这将减少对节点运营商的信任,尽管由于此处概述的问题,值得谨慎处理。
方法 二:两级质押
我们创建两层质押者:一个「重型」层,要求 4096 ETH,参与最终化,以及一个「轻型」层,没有最低质押要求(同时也没有存款和提款延迟,以及没有削减的风险),它增加了另一层的安全性。要使一个区块最终化,既需要重型层最终化它,又需要轻型层在线轻型验证者的>= 50% 对其进行证明。
这种异质性对于抗审查和抵抗攻击是有益的,因为要使攻击成功,需要同时腐化重型层和轻型层。如果一层被腐化而另一层没有,链将停止;如果是重型层被腐化,可以对其进行惩罚。
这种方法的另一个好处是,轻型层可以包括同时用作应用程序内抵押品的 ETH。主要的缺点是,通过确立小规模质押者和大规模质押者之间的分歧,使质押变得不太平等。
方法 三:轮流参与(即委员会但负责)
我们采取的方法与这里提出的超级委员会设计类似:对于每个时隙,我们选择 4096 个当前活跃的验证者,并且我们在每个时隙期间仔细调整该集合,以确保我们仍然安全。
然而,我们做出了一些不同的参数选择,以便在此框架内获得「最大的收益」。 特别是,我们允许验证者以任意高的余额参与,如果验证者拥有超过一定数量 M 的 ETH(必须是浮动的),那么他们在每个时段都参与委员会。 如果验证者有 N<M ETH,那么他们有 N/M 在任何给定时间段内进入委员会的概率。
我们这里有一个有趣的杠杆,是将出于激励目的的「权重」与出于共识目的的「权重」解耦:委员会内每个验证者的奖励应该相同(至少对于≤M ETH 的验证者),以保持平均奖励成比例。我们仍然可以以 ETH 为权重,对委员会中的验证者进行共识计数。 这确保了打破最终性需要 ETH 数量等于委员会中 ETH 总量的大于三分之一。
Zipf 定律分析将按如下方式计算 ETH 数量:
在总余额的每个二次方级别,验证者的数量与该余额级别成反比,并且这些验证者的总余额将相同。
因此,委员会将有来自每个余额级别的等量 ETH 参与,除了高于障碍 M 的级别(验证者始终在委员会中)。
因此,我们在上述级别的每个 K 验证器中都有 Log2(M)级别,和 K+K/2+……=2K 以上级别的验证者。因此,K=4096/Log2(M)+2。
最大的验证器将有 M*k ETH。我们可以向后推算:如果最大的验证器有 2^18=262144 ETH,这意味着(大致)M = 1024 and k = 256。
质押的 ETH 总额为:
前 512 名验证者的全部权益 (2^18*1+2^17*2+……+2^10*2^8=2359296)
加上随机抽样的较小赌注(2^8*(2^9+2^8+2^7……)约等于 2^8*2^10=2^18)
我们总共获得了 2621440 个 ETH,或者攻击成本约为 900k ETH。
这种方法的主要缺点在于在协议内部引入了一些更多的复杂性,以通过一种使我们在委员会更改时仍然能够获得共识安全性的方式随机选择验证者。
其主要优势在于它保留了独立质押的可识别形式,保留了一个单一的系统,并且甚至允许将最小质押金额降低到非常低的水平(例如 1 ETH)。
总结
如果我们确定在 SSF 协议之后,我们希望坚持使用 8192 个签名,这将使技术实施者的工作变得更加容易,以及轻客户端等辅助基础设施的构建者。对于任何人来说,运行一个共识客户端都变得更加容易,用户、质押爱好者和其他人可以立即在这一假设的基础上进行工作。以太坊协议的未来负载不再是未知的:它可以通过硬分叉在未来提高,但只有当开发人员确信技术已经足够改进,能够以相同的轻松程度处理更多的签名每个时间槽。
剩下的工作将是决定我们想要采取上述三种方法中的哪一种,或者也许是完全不同的方法。这将是一个关于我们对哪些权衡感到舒适的问题,特别是我们如何解决涉及的问题,比如流动质押,这可能可以与现在变得更加容易的技术问题分开解决。